_README.TXT Driver File Contents (q3d203.zip)

QSoft3d Driver DDK.
Version 2.00


History
=======

Build 158 (99/6/4):

- Added DSPROPSETID_QDRIVER_LATENCY to DSPROPSETID_QDriver property set.  This lets
  the control panel communicate latency settings to the driver without going through
  the registry.

- Speaker processing has been rewritten to prepare for future speaker configurations.
  Stereo and quad mode have been merged.  Stereo expansion and mono to stereo processes
  have also been revised to reflect a new internal architecture.

- Quad mode now uses QSound speaker processing for side positions.

- Fixed a bug where linear sample rate conversion would sometimes read one too many
  16 bit samples.  This would cause a crash, especially in Media Player, if the memory
  reference was not legal.

- Fixed a bug where reverberation effect would be much louder than it should be when
  sounds were just beyond the minimum distance and the minimum distance was not equal
  to 1 meter.

- Fixed 3d buffers so that they could be panned when the 3d mode was disabled.


Build 157 (99/5/12):

- Sounds would be too loud at certain angles in stereo speaker mode.

- Driver would sometimes lock up when calling IDsDriverBuffer::SetPosition().


Build 156 (99/5/2):

- Fixed a problem with converting stereo buffers to mono and then converting to a higher
  sample rate.

- Added on/off control for CD reverb to Q3d control panel.


Build 155 (99/4/30):

- Test version.


Build 154 (99/4/27):

- Added 22 new QSound environmental presets.

- Buffers implement the KSPROPERTY_AUDIO_CHANNEL_CONFIG property in KSPROPSETID_Audio.
  This lets an application or driver direct the library to play a buffer directly to
  the specified channels.  For example, a stereo buffer can be configured to play
  only in the rear channels.

- Rewrote code in speaker mode that reduces CPU loading when multiple sounds are
  playing.

- Fixed a bug where duplicated buffers would also duplicate the cursor positions.
  This apparently is not the convention, and lead to truncated duplicated sounds,
  especially in the game StarCraft.

- Reintroduced "squashing" of positions to mono when position of sound gets closer
  than minimum distance.  This prevents a sudden flip from front to back or left
  to right or vice-versa.

- Fixed a problem when changing delays.  This may have caused some clicks in headphone
  mode.


Build 153 (99/4/23):

- Some internal changes for development of new reverb presets.


Build 152 (99/4/8):

- During a code review it was noticed that there was only one copy of the 3d listener
  properties, and that they were being shared by all applications using DirectSound3D.
  This has been fixed so that each application has its own copy.

- Reorganized internal math library to reside in a static class.

- Removed an intermediate 3d coordinate library and rewrote 3d code to work directly
  with DS3DLISTENER and DS3DBUFFER structures.

- Now ignoring listener orientation when in DS3DMODE_HEADRELATIVE mode.


Build 151 (99/4/1):

- Restored a feature that prevented the extrapolated cursors from appearing to go
  backwards (or forwards very fast).


Build 150 (99/3/31):

- Changed the play notification callback to supply the number of playing buffers
  rather than FALSE for no buffers playing and TRUE if at least one is playing.

- Added mono expansion flag and direct volume to properties copied when duplicating
  buffers.

- Fixed a problem where GetStatus() would indicate that a buffer had finished
  playing and the application would Stop() the buffer, even though the buffer
  actually had not finished playing because of extrapolation of cursors.  This
  resulted in sounds not getting heard in games like Forsaken.  This was fixed
  by forcing a remix when getting the Stop() call.

- Non-3d buffers always get reverb (if enabled) rather than when expansion feature
  is turned on.  This was done for compatibility with other EAX sound cards.


Build 149 (99/3/30):

- Added Direct Volume buffer property.  This sets the relative amount of the
  non-reverb component of the audio.  Default value is 1.0, but can be set to
  0.0 to entirely exclude the 3d audio processing of the library, leaving only
  reverb.

- Added build number to least significant 16 bits of version number returned by
  DSPROPSETID_QDRIVER_VERSION.

- Switched to a slower but more robust filter for the low-frequency enhancement
  feature in speaker mode.  This results in less clipping in the processing.

- Fixed a problem when shortening delay buffers, which are used in reverberation.

- Internal reorganization to simplify use of delays.

- Changed internal calling to _stdcall from _cdecl.  Should be a tiny bit faster
  and more compact.


Build 148 (99/3/8):

- Changes to rolloff factor weren't getting applied when they were part of the
  DSPROPERTY_DIRECTSOUND3DLISTENER_ALL property id.

- Slight crackle sound in reverb mode when running at some sample rates, like
  44.1 kHz and 11 khz, but not 22 kHz.

- A3d emulation (in qa3d) exported a funny looking C++ version of A3dCreate that wasn't
  seen by a game called Thief.  This has been modified to use _A3dCreate@12 as used by
  the original version of A3d as well as SB Live!.


Build 147 (99/3/5):

- Fixed an unitialized variable.

- CreateQSoundDriver now calls AddRef() on WaveAlloc and CriticalSection objects;
  VxD doesn't have to keep a copy of these pointers any more.

- Reorganized stereo expansion code.  Shouldn't affect operation.


Build 146 (99/2/12):

- Fixed crash that occurred when switching mixing math modes while running.

- Stereo expansion parameters (spread and center) weren't getting updated.

- Mono and stereo expansion would fail if using a non-standard mixing rate.
  Filter selection no longer must have exactly matching rates.

- If an application uses EAX, 2d buffers that normally shouldn't be affected
  will only have reverb applied if the preset is set.  This fixes the situation
  where an application may not want to have all the buffers played into the reverb.

- The behavior of 2d buffers in headphone and quad mode made consistent with
  speaker mode.

- Default damping factor for the underwater environment was incorrectly set
  to 1.0 instead of 0.0.

- Fixed setup of a filter that provides additional reverberation.


Build 145 (99/2/3):


Build 144 (99/2/2):

- Right signal in Half-Life version 1.0.0.6 would be delayed by about a second
  compared to the left.  This was due to a bug in SetPosition that rejected
  all calls that implied a rewind.  Version 1.0.0.8 of Half-Life did not have
  this problem.

- Added mono expansion feature for speaker mode.  This is applied if the
  DSPROPSETID_QSECONDARY_MONOEXPAND property is enabled and if the buffer has
  never had a non-zero pan value.

- All 2d buffers are fed into reverb in speaker mode.  This better emulates
  behavior of SB Live! card.


Build 143 (99/1/28):

- Sample rate conversion of output limited limited to internal block size.  This
  caused crashes when converting to 48 kHz.

- Ignore SetPosition(0) call if buffer stopped and at end.  This fixes a bug where
  DirectSound would believe the buffer was still playing if not at the end, even
  though it was DirectSound that issued the SetPosition(0) call in the first place.

- If previous and current call to GetPosition() suggest that the buffer was playing
  backwards (possible due to extrapolation of cursors), use previous result.


Build 142 (Note:  erroneously reported as build 138) (99/1/22):

- Reverb now reverts to the preset when an application quits.


Build 141 (Note:  erroneously reported as build 138) (99/1/19):
Changes from build 139:

- PlayNotify callback always called when a buffer starts.  This is intended to
  cause a remix and result in interpolated play cursors that are synchronized to
  mixes.

- Moved initialization of buffer contents back to only when allocated by library.
  Driver is responsible for initializing buffer contents supplied by DirectSound.
  This was done so that buffers could be switched from hardware acceleration to
  our library without losing the contents.

- Added mutual exclusion to Lock, SetPosition, Play, and Stop because these functions
  affect the way the buffers will be used by the mixing code.

- 3d positioning turned off if a 3d buffer is disabled and a non-zero pan value is
  used.

- Now accounting for Doppler effect and frequency setting when interpolating play
  cursor position.

- Disabled 3d buffers still get reverb.

- Fixed thin sound when buffers positioned behind listener in speaker mode.

- Reverb applied for expanded stereo signals.

- Moved VxD run-time-library functions into a new library: VxDUtil.lib.


Build 139 (99/1/7):
Changes from build 134:

- Fixed bug in internal list management.

- Internal support for quad format buffers.  Note that DirectSound currently does
  not support these.

- Added reverb preset property (DSPROPSETID_QDRIVER_REVERBPRESET) with table and
  environment number.

- Added separate mixer rate; library will mix at this rate and convert to output rate.

- Added interpolation of play cursor.  Some games assume that a buffer's play and
  write cursor will move smoothly.  However, the Q3D library mixes a chunk at a time
  (the amount is given by the "latency" value).

- Added lock buffer backup to better simulate smoothly playing buffers.  Since the
  Q3D mixer will extrapolate the play cursor based on where the last mix left off and
  the time that elapsed, it is possible that the application may lock and write into
  the part of the buffer that should already have been played but hasn't yet.  For
  example, the mix cursor on a 22 kHz stereo buffer may be 1200 and 15 ms has elapsed.
  The simulated play cursor will be 1200+15*22.05*4 = 2520 (with round-off to the
  previous sample).  If an application locked and wrote to the section between 1200
  and 2520 (a valid operation where it is chasing the play cursor) there would be
  horrible breakup of the audio.  This modification makes a backup of this part of
  the buffer in this situation and uses it for mixing rather than the original buffer.
  The updated part gets played the next time around.

- Fixed bug where buffers supplied by DirectSound weren't initialized.  This caused a
  click when playing 8 bit sounds because DirectSound would initialize the buffer to
  0.

- Ignore SetPosition() calls if the buffer is playing and the change is less than 6 ms.
  This is a work-around for Half-Live version 1.0.0.6 and earlier which continually
  adjusts the position of the two buffers it mixes into, causing stuttering audio.
  Version 1.0.0.8 of Half-Life fixes this.

- Left and right early reflections were reversed in speaker mode.  Probably not
  noticeable.

- Fixed errors in reverb code when a damping factor of zero was used.

- 2d mono buffers and stereo buffers now will also play on rear speakers in quad mode.

- Attenuation applied in quad mode when reverb turned on to avoid clipping.


Build 134 (98/11/21):


Changes from version 1.09:

- Added EAX-compatible reverberation.

- Four speaker mode.

- Sample driver modified to separate the primary buffer object implementation
  presented to DirectSound from the real hardware implementation.  This should
  mean fewer necessary changes to your bufobj.c file.


Changes from version 1.08:

- Added support for version 1.2 of A3d in QA3d.

- Q3D control application uses a tabbed dialog box.

- Sample driver modified to use 16 bit output rather than 8 bit to avoid
  undesirable round-off effects.

- Added MixChannels() function to IPlayerCallback interface to permit output
  to separate mono streams.

- Driver would crash if a very high sample rate conversion were applied, e.g.
  for extreme Doppler effects.

- Hadn't set aside enough memory for converting stereo streams to mono if
  also converting to a lower sample rate.

- Distance factor hadn't been applied to velocity when performing Doppler
  calculations.

- Stereo buffers were not being panned.

- Buffer orientations with magnitudes other than one didn't produce
  proper cones.

- The 1.08 version of QA3d.dll/A3d.dll library would crash when needing
  to enable or disable 3d mode on a 2d buffer.

- Fixed some problems with use of deferred and immediate mode.  Fixed a problem
  where buffers wouldn't start up in 3d mode.

- Implemented the DSBLOCK_ENTIREBUFFER flag for IDirectSoundBuffer::Lock().

- Added the DSERR_ALREADYINITIALIZED error to IDirectSoundBuffer::Initialize().


Changes from version 1.06:

- The sample driver, based on the MSSndSys/Aztech code in the
  DirectSound DDK, is vastly simplified.  The primary buffer that
  DirectSound mixes to is spoofed by a secondary buffer that is
  in turn mixed by the QMixBuf library.  The QMixBuf output is
  in turn mixed into an IDsDriverBuffer object.  If your sound
  card supports hardware accelerated 2d buffers, this would be
  a good place to use it -- separating DirectSound and QSound
  mixing.

- Interpolated sample rate conversion is now built-in.  It is
  turned off by default because it uses slightly more CPU than
  the simple copy/delete method -- turn it on using the modified
  Q3DCtl program.  You can also modify the default settings
  in the Q3D.CPP file.

- Bug fix:  initial volume of 3d object didn't take into account
  the listener's position.

- Bug fix:  coordinates of multiple listeners weren't properly
  handled due to confusing documentation in Microsoft's DDK.

- Bug fix:  the "time left to play" resource management mode
  takes into account the length of the new buffer.

- Bug fix:  a software buffer played after a one-shot hardware
  buffers would be muted.  This was a problem in the sample
  driver.

- Bug fix:  default latency reduced to 10 ms in order to fix
  a Quake II problem when mixing to a secondary buffer.

- Q3DCtl saves settings to registry in case the driver doesn't
  have a chance to do so during shutdown.  If you change the
  location of the registry settings in Q3D.cpp, make sure you
  make the same changes in q3dctl.cpp.

- Added support for 48 kHz.


Contents
========

This package contains the following files:

azt16 (folder):
Source to a Q3d-enhanced version of the example sound driver.

bin (folder):
Redistributable executable code.

dsarena (folder):
A program that tests the driving around of sounds.

q3dctl (folder):
Source to the q3d control program.

qa3d (folder):
Source to the code that provides an A3d compatible wrapper
around DirectSound and A3d objects.

qa3dload (folder):
Source to the library that redirects calls from A3d to Qa3d.

qhook (folder):
Source to a VxD that helps with the redirection.

sdk (folder):
Contains header file, code, and documentation for writing
applications using Q3d.

vc42 (folder):
Contains QMixBuf.lib compiled using Visual C++ 4.2.

_readme.txt:
This file.

changes.doc:
List of changes made to the QSoft3D DDK since the previous version.

q.dsw:
Visual C++ 5.0 workshop file.

q3d_ddk.doc
DDK documentation.  This hasn't been updated for 1.05 yet.

qmixbuf.h:
Header file for Q3d extensions.  Can be used by applications, but
is primarily for use in ring 0.

qmixbuf.lib:
Static library containing QSound code.  Compiled using Visual C++ 5.0.
Should be linked with your VxD project.  Not needed for ring 3 applications.
Download Driver Pack

How To Update Drivers Manually

After your driver has been downloaded, follow these simple steps to install it.

  • Expand the archive file (if the download file is in zip or rar format).

  • If the expanded file has an .exe extension, double click it and follow the installation instructions.

  • Otherwise, open Device Manager by right-clicking the Start menu and selecting Device Manager.

  • Find the device and model you want to update in the device list.

  • Double-click on it to open the Properties dialog box.

  • From the Properties dialog box, select the Driver tab.

  • Click the Update Driver button, then follow the instructions.

Very important: You must reboot your system to ensure that any driver updates have taken effect.

For more help, visit our Driver Support section for step-by-step videos on how to install drivers for every file type.

server: ftp, load: 1.50