rlm@0: * a device has a two names, rlm@0: - *name*, which is the filename and which appears before all of the functions. rlm@0: - *trueName*, which is a string that is used to summon the device. rlm@0: rlm@0: rlm@0: Every device has the *_data* struct, which is where all the rlm@0: device specific state is located. rlm@0: rlm@0: In the function *_open_playback*, the device is initialized, rlm@0: here the trueName is set, and the devices data is initialized. rlm@0: rlm@0: The ALCdevice's ExtraData field must always be cast to to the actual rlm@0: data struct that the device uses. rlm@0: rlm@0: rlm@0: rlm@0: the =open_playback= function is where everything is initialized, rlm@0: rlm@0: rlm@0: but the =reset_playback= is where the actual thread which is the heart rlm@0: of the device is started. rlm@0: rlm@0: rlm@0: every device has a Proc function which takes a pointer to an rlm@0: ALCdevice and is run in a separate thread. It is this procedure that rlm@0: actually does stuff with sound data. rlm@0: rlm@0: rlm@0: It is the ALContext which controls the particulars of a listener. rlm@0: rlm@0: The context contains the device. rlm@0: rlm@0: * so do we need a new context for each listener, alone with their own rlm@0: devices? rlm@0: rlm@0: However, the device also maintains a *list* of contexts... rlm@0: