| 
 DirectSound: 
  Advanced 3D Topics 
By: Jack Hoxley 
Written: June 2000
 
 
There are several effects and 
  properties you can set when using DirectSound3D to modify the way sounds are 
  heard and created. These can be very useful when trying to interact with different 
  environments in a Direct3D scene. 
DOPPLER EFFECT 
  The doppler effect is how a sound is changed when it's moving. A car speeding 
  down a road is a good example - the way in which the sound is different to the 
  bystander from the actual driver (and the noise the Engine actually makes). 
  You have to work out the speed of the object which the doppler effect is applied 
  to. This effect can be used to simulate the real-world effects, or it can be 
  used to create weird special effects. Currently, DirectX supports up to 10 different 
  levels; with fractions between. a Doppler effect of 0 will disable it, a doppler 
  factor of 0.5 will half it and a doppler factor of 1 is real-world normal; all 
  those after (2-10) are amplifications; ie, factor 2 will give you twice the 
  normal doppler effect. 
DirectSound3DListener.SetDopplerFactor(dopplerFactor 
  As Single, applyFlag As CONST_DS3DAPPLYFLAGS) 
  DirectSound3DListener.GetDopplerFactor() As Single  
These two lines are all that 
  you need. The SetDopplerFactor will allow you to set the amount; note that you 
  can set decimal numbers, this allows you much more variation than the integers 
  0-10. The second argument is when the change is applied. Because changing settings 
  can take time (relative to normal operating speeds) you may want to apply more 
  than one at a time. You can use either DS3D_DEFERRED or DS3D_IMMEDIATE 
  as the last flag. IMMEDIATE means that it will change at that point, and will 
  cause it to recalculate everything. DEFERRED will mean that you can go on setting 
  properties without it changing anything, you then have to call DirectSound3DListener.CommitDeferredSettings 
  before DirectSound will update them. There are several constants that can be 
  used in place of the dopplerFactor variable: DS3D_MINDOPPLERFACTOR 
  (no doppler effect), DS3D_MAXDOPPLERFACTOR (10x normal doppler effect) 
  and DS3D_DEFAULTDOPPLERFACTOR (Normal doppler effect: 1.0)  
 
ROLL OFF FACTOR 
  This works together with Minimum and Maximum distance settings (see below). 
  The roll off factor is simply the volume of the sound as it gets closer to or 
  further away from the source. This is applied on a global scale; for individual 
  buffers, you need to set the Minimum and Maximum distances. A good example of 
  the changing Roll Off factor is environment. On a hot summers day sound will 
  travel further than on a cold, damp winters morning - you can use the roll off 
  factor to simulate this, therefore adding more realism to your world scene. 
Directsound3DListener.SetRolloffFactor(rolloffFactor 
  As Single, applyFlag As CONST_DS3DAPPLYFLAGS) 
  DirectSound3DListener.GetRolloffFactor() As Single 
These are the two lines needed 
  for changing the roll off factor. Currently you can set rolloffFactor to 
  any decimal between 0 and 10.0, where 1 is normal rolloff levels; all others 
  are multiples (0.5 = half normal, 10 = 10 times normal). You can also use the 
  three constants provided: DS3D_MINROLLOFFFACTOR (No roll off), DS3D_DEFAULTROLLOFFFACTOR 
  (set as 1.0 and represents normal amounts of roll off) or DS3D_MAXROLLOFFFACTOR 
  (set as 10.0 - and is 10x the real world levels). The second parameter states 
  when it will take effect. This is either now (IMMEDIATE) or Later (DEFFERED) 
  see Doppler effect for more details. 
 
3D MODE 
  3D processing is expensive when it comes to processor time. That is why there 
  is an option to set which mode of 3D processing occurs. If you dont need a buffer 
  to be 3D then you can disable it until it is needed, therefore stopping all 
  3D calculations until it is re-enabled. You can also set the coordinate system; 
  although this doesn't sound like a processing issue, it actually is. Normally 
  all sounds are positioned on a world system - no matter where the listener is 
  the sounds are in the same place. This causes DirectSound to keep recalculating 
  where they actually are relative to to the listeners new position. This may 
  well slow things down. You can set it so that all sound positions are relative 
  to where the listener is. A coordinate of 1,0,10 would no longer represent the 
  same position all the time, instead it would be 1 unit right of the user and 
  10 units in front of the user - as the user moved around these coordinates would 
  still be in this relative position to the listener. Again, apply flags appear; 
  see doppler effect for more information on IMMEDIATE and DEFFERED settings. 
1. This disables all 3D processing 
  DirectSound3DBuffer.SetMode DS3DMODE_DISABLE, DS3D_IMMEDIATE  
  2. All coordinates will be relative to the listener 
  DirectSound3DBuffer.SetMode DS3DMODE_HEADRELATIVE , DS3D_IMMEDIATE 
  3. Normal 3D processing with world coordinates. This is the default 
  DirectSound3DBuffer.SetMode DS3DMODE_NORMAL , DS3D_IMMEDIATE  
You can also get what the current 
  3D Mode is usig this logic: 
If DirectSound3DBuffer.GetMode 
  = DS3DMODE_HEADRELATIVE then  
  'It's disabled. 
  End If 
You may well have noted that 
  this is no longer a DirectSound3DListener object being used; it's a DirectSound3DBuffer. 
  This means that it only affects one buffer. Therefore you can have all sounds 
  being on the world coordinate, and then one (or more) on HEADRELATIVE coordinates 
  - ie, one for your weapon firing that'll always be from the same place in relation 
  to you. 
 
CONES 
  Until your program changes these values, every 3D sound source created is omni-directional 
  and has no orientation, instead emits the same amount of sound in all directions. 
  A sound cone is defined as two cones - an inside cone and an outside cone. The 
  inside cone is always the buffers maximum volume (not necessarily maximum, just 
  the current buffer volume, Buffer.SetVolume). The outside cone is set to be 
  a certain amount less than the inside cones volume (in decibels). To specify 
  these cones we use angles; one for the inside and one for the outside. The outside 
  cone must be bigger (or the same size) than the inside cone. 
1. Setting the angles: 
  We use one call to get and set the cone angles: 
DirectSound3DBuffer.SetConeAngles(inCone 
  As Long, outCone As Long, applyFlag As CONST_DS3DAPPLYFLAGS) 
  DirectSound3DBuffer.GetConeAngles(inCone As Long, outCone As Long) 
Both the incone and outcone 
  values are in degrees (therefore between 0 and 360). The Apply flags are 
  either IMMEDIATE or DEFERRED - see Doppler effect for more details on the meaning. 
2. Setting the Volume 
  There is only one explicit property here - setting the outside volume; the 
  inside volume is set by changing the volume of the host buffer (a normal DirectSoundBuffer 
  object). 
DirectSound3DBuffer.SetConeOutsideVolume(coneOutsideVolume 
  As Long, applyFlag As CONST_DS3DAPPLYFLAGS) 
  DirectSound3DBuffer.GetConeOutsideVolume() As Long  
The volume is the same range 
  as a normal buffers volume; 0 (max volume) to -6000 (min volume). You can also 
  use the constants DSBVOLUME_MAX (maximum volume) or DSBVOLUME_MIN 
  (Minimum volume). The apply flags are the same as all the other property changes; 
  see the doppler effect for more details. 
3. Cone Orientation 
  This goes along with the position properties. The parameters supplied are 
  the vector from the source position, and they define where it's pointing too. 
  This can be very important, especially if you want the sound to point in a certain 
  direction. 
DirectSound3DBuffer.SetConeOrientation( 
  x As Single, y As Single, z As Single, applyFlag As CONST_DS3DAPPLYFLAGS) 
  DirectSound3DBuffer.GetConeOrientation(orientation As D3DVECTOR)  
These two are very easy. when 
  setting the orientation X,Y,Z are the vector that define which way it is pointing. 
  In the second statement, orientation as D3DVECTOR requires that you have 
  a defined D3DVECTOR, which you pass to the statement, and it fills with the 
  correct information. 
MINIMUM and MAXIMUM Distances 
  A sound coming from any source will get louder as it gets closer. But at 
  a certain distance it will get no louder, this is the minimum distance of a 
  sound. As a sound gets further away it gets quieter, the maximum distance of 
  a sound defines at what point it becomes silent. All measurements are in meters 
  (which is the same scale as everything in a 3D world). 
DirectSound3DBuffer.SetMinDistance(minDistance 
  As Single, applyFlag As CONST_DS3DAPPLYFLAGS) 
  DirectSound3DBuffer.SetMaxDistance(maxDistance As Single, applyFlag As CONST_DS3DAPPLYFLAGS) 
   
  -And- 
  DirectSound3DBuffer.GetMinDistance() As Single  
  DirectSound3DBuffer.GetMaxDistance() As Single  
The new values are allowed to 
  be decimal numbers; which give you a finer control over the distances, the applyflag 
  is the same for every property so far - IMMEDIATE for changing now, or DEFERRED 
  to be changed later. See doppler effect for more details. 
 
VELOCITY 
  Velocity doesn't actually make the sound source move. It just says "If 
  it were moving it would be going in this direction". It's up to you to 
  actually move the sound source by using SetPosition. The velocity is used when 
  calculating the doppler effect; so it is quite important. 
DirectSound3DBuffer.SetVelocity(x 
  As Single, y As Single, z As Single, applyFlag As CONST_DS3DAPPLYFLAGS) 
  DirectSound3DBuffer.GetVelocity(velocity As D3DVECTOR) 
The velocity is described as 
  a vector in the direction of which it is travelling. The SetVelocity statement 
  allows you to specify this in the X,Y,Z parameters and the GetVelocity statement 
  will fill out a D3DVECTOR type describing the current velocity. 
 
POSITION 
  The position is very important when creating 3D sounds. The position may well 
  require a modifier, as any value passed to this procedure above +10 and below 
  -10 will be below audible range. Therefore you may want to create a multiplier/divider 
  formula so that the sound can be related properly. 
DirectSound3DBuffer.SetPosition(x 
  As Single, y As Single, z As Single, applyFlag As CONST_DS3DAPPLYFLAGS) 
  Directsound3DBuffer.GetPosition(position As D3DVECTOR)  
The coordinates you give will 
  be set based on what mode DS3D is in - HEADRELATIVE or NORMAL (see above). Setting 
  the position of a sound is identical to the positioning of an object in a 3D 
  scene. When it comes to retrieving the current position, it will fill out a 
  D3DVECTOR that contains the X,Y,Z values for the sound. 
OVERVIEW 
  You should now be perfectly capable of creating a real sounding 3D environment. 
  Only practice or trial and error will allow you to progress with this field. 
                                       |