Changed some stuff so distance attenuation works for both 3d
authorRok Mandeljc <rokmandeljc@hotmail.com>
Wed, 5 Mar 2003 02:47:39 +0000 (02:47 +0000)
committerAlexandre Julliard <julliard@winehq.org>
Wed, 5 Mar 2003 02:47:39 +0000 (02:47 +0000)
processing modes.

dlls/dsound/sound3d.c

index 865476f4cbc32812d2223a659fed061a6bcb56e2..f7afa0c43d270c3e759761cd49e8a7104a0e0411 100644 (file)
@@ -174,59 +174,63 @@ static void WINAPI DSOUND_Mix3DBuffer(IDirectSound3DBufferImpl *ds3db)
        
        dsl = ds3db->dsb->dsound->listener;
 
-       /* FIXME: i guess initial volume should be that, but if it's set, sounds get too quiet */
+       /* FIXME: i guess initial volume should be that, but if it's set, sounds get too quiet.
+                 It makes sense, though: at min. distance we hear sound with practically no
+                 attuneation. If someone has idea, please do it.*/
 /*     lVolume = ds3db->lVolume; */
        
        switch (ds3db->ds3db.dwMode)
        {
+               case DS3DMODE_DISABLE:
+                       TRACE("3D processing disabled\n");      
+                       DSOUND_RecalcVolPan (&ds3db->dsb->volpan);
+                       DSOUND_ForceRemix (ds3db->dsb);
+                       break;
                case DS3DMODE_NORMAL:
-               {
-                       /* distance attuneation stuff */
+                       TRACE("Normal 3D processing mode\n");
+                       /* we need to calculate distance between buffer and listener*/
                        vDistance = VectorBetweenTwoPoints(&ds3db->ds3db.vPosition, &dsl->ds3dl.vPosition);
                        flDistance = VectorMagnitude (&vDistance);
-                       
-                       if (flDistance > ds3db->ds3db.flMaxDistance)
-                       {
-                               /* some apps don't want you to hear too distant sounds... */
-                               if (ds3db->dsb->dsbd.dwFlags & DSBCAPS_MUTE3DATMAXDISTANCE)
-                               {
-                                       ds3db->dsb->volpan.lVolume = DSBVOLUME_MIN;
-                                       DSOUND_RecalcVolPan (&ds3db->dsb->volpan);              
-                                       /* i guess mixing here would be a waste of power */
-                                       return;
-                               }
-                               else
-                                       flDistance = ds3db->ds3db.flMaxDistance;
-                       }
-                       
-                       if (flDistance < ds3db->ds3db.flMinDistance)
-                               flDistance = ds3db->ds3db.flMinDistance;
-                       /* the following formula is taken from my physics book. I think it's ok for the *real* world...i hope m$ does it that way */
-                       lVolume += 10000; /* ms likes working with negative volume...i don't */
-                       lVolume /= 1000; /* convert hundreths of dB into B */
-                       /* intensity level (loudness) = log10(Intensity/DefaultIntensity)...therefore */
-                       flIntensity = pow(10,lVolume)/DEFAULT_INTENSITY;        
-                       flTemp = (flDistance/ds3db->ds3db.flMinDistance)*(flDistance/ds3db->ds3db.flMinDistance);
-                       flIntensity /= flTemp;
-                       lVolume = log10(flIntensity*DEFAULT_INTENSITY);
-                       lVolume *= 1000; /* convert back to hundreths of dB */
-                       lVolume -= 10000; /* we need to do it in ms way */
-                       TRACE("dist. att: Distance = %f, MinDistance = %f => adjusting volume %ld to %ld\n", flDistance, ds3db->ds3db.flMinDistance, ds3db->lVolume, lVolume);
-
-                       /* add correct conning here */
-                       
-                       /* at last, we got the desired volume */
-                       ds3db->dsb->volpan.lVolume = lVolume;
-                       DSOUND_RecalcVolPan (&ds3db->dsb->volpan);
-                       DSOUND_ForceRemix (ds3db->dsb);                 
                        break;
-               }
                case DS3DMODE_HEADRELATIVE:
-               case DS3DMODE_DISABLE:
-                       DSOUND_RecalcVolPan (&ds3db->dsb->volpan);
-                       DSOUND_ForceRemix (ds3db->dsb);
-                       break;
-       }
+                       TRACE("Head-relative 3D processing mode\n");
+                       /* distance between buffer and listener is same as buffer's position */
+                       flDistance = VectorMagnitude (&ds3db->ds3db.vPosition);
+               break;
+       }       
+       
+       if (flDistance > ds3db->ds3db.flMaxDistance)
+       {
+               /* some apps don't want you to hear too distant sounds... */
+               if (ds3db->dsb->dsbd.dwFlags & DSBCAPS_MUTE3DATMAXDISTANCE)
+               {
+                       ds3db->dsb->volpan.lVolume = DSBVOLUME_MIN;
+                       DSOUND_RecalcVolPan (&ds3db->dsb->volpan);              
+                       /* i guess mixing here would be a waste of power */
+                       return;
+               }
+               else
+                       flDistance = ds3db->ds3db.flMaxDistance;
+       }               
+       if (flDistance < ds3db->ds3db.flMinDistance)
+                               flDistance = ds3db->ds3db.flMinDistance;
+       
+       /* the following formula is taken from my physics book. I think it's ok for the *real* world...i hope m$ does it that way */
+       lVolume += 10000; /* ms likes working with negative volume...i don't */
+       lVolume /= 1000; /* convert hundreths of dB into B */
+       /* intensity level (loudness) = log10(Intensity/DefaultIntensity)...therefore */
+       flIntensity = pow(10,lVolume)/DEFAULT_INTENSITY;        
+       flTemp = (flDistance/ds3db->ds3db.flMinDistance)*(flDistance/ds3db->ds3db.flMinDistance);
+       flIntensity /= flTemp;
+       lVolume = log10(flIntensity*DEFAULT_INTENSITY);
+       lVolume *= 1000; /* convert back to hundreths of dB */
+       lVolume -= 10000; /* we need to do it in ms way */
+       TRACE("dist. att: Distance = %f, MinDistance = %f => adjusting volume %ld to %ld\n", flDistance, ds3db->ds3db.flMinDistance, ds3db->lVolume, lVolume);
+       /* add correct conning here */                  
+       /* at last, we got the desired volume */
+       ds3db->dsb->volpan.lVolume = lVolume;
+       DSOUND_RecalcVolPan (&ds3db->dsb->volpan);
+       DSOUND_ForceRemix (ds3db->dsb);
 }
 
 static void WINAPI DSOUND_ChangeListener(IDirectSound3DListenerImpl *ds3dl)