[PATCH] dsound: More accurate volume calculation.

Krzysztof Nikiel knik00 at gmail.com
Fri Feb 11 03:38:40 CST 2011


I have changed this when creating the new resampler patch but it's not
really related to the main patchset.

---
 dlls/dsound/mixer.c |   40 ++++++++++++++++++++++------------------
 1 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c
index 4e9e2c9..6e9fdf5 100644
--- a/dlls/dsound/mixer.c
+++ b/dlls/dsound/mixer.c
@@ -46,36 +46,40 @@ WINE_DEFAULT_DEBUG_CHANNEL(dsound);
 void DSOUND_RecalcVolPan(PDSVOLUMEPAN volpan)
 {
     double temp;
-    TRACE("(%p)\n",volpan);

-    TRACE("Vol=%d Pan=%d\n", volpan->lVolume, volpan->lPan);
+    /* 0.01dB units: vol=100*20*log(amp); amp = 10^(vol/2000) */
+    temp = pow(10.0, volpan->lVolume / 2e3);
+
     /* the AmpFactors are expressed in 16.16 fixed point */
-    volpan->dwVolAmpFactor = (ULONG) (pow(2.0, volpan->lVolume / 600.0) *
0xffff);
-    /* FIXME: dwPan{Left|Right}AmpFactor */
+    volpan->dwVolAmpFactor = (DWORD)(temp*(DOUBLE)0x10000);
+    volpan->dwTotalLeftAmpFactor = volpan->dwVolAmpFactor;
+    volpan->dwTotalRightAmpFactor = volpan->dwVolAmpFactor;

-    /* FIXME: use calculated vol and pan ampfactors */
-    temp = (double) (volpan->lVolume - (volpan->lPan > 0 ? volpan->lPan :
0));
-    volpan->dwTotalLeftAmpFactor = (ULONG) (pow(2.0, temp / 600.0) *
0xffff);
-    temp = (double) (volpan->lVolume + (volpan->lPan < 0 ? volpan->lPan :
0));
-    volpan->dwTotalRightAmpFactor = (ULONG) (pow(2.0, temp / 600.0) *
0xffff);
+    if (volpan->lPan > 0) /* left channel attenuated */
+        volpan->dwTotalLeftAmpFactor = (DWORD)(temp*(DOUBLE)0x10000
+                    * pow(10.0, -volpan->lPan / 2e3));

-    TRACE("left = %x, right = %x\n", volpan->dwTotalLeftAmpFactor,
volpan->dwTotalRightAmpFactor);
+    if (volpan->lPan < 0) /* right channel attenuated */
+        volpan->dwTotalRightAmpFactor = (DWORD)(temp*(DOUBLE)0x10000
+                    * pow(10.0, volpan->lPan / 2e3));
 }

 void DSOUND_AmpFactorToVolPan(PDSVOLUMEPAN volpan)
 {
     double left,right;
-    TRACE("(%p)\n",volpan);

-    TRACE("left=%x,
right=%x\n",volpan->dwTotalLeftAmpFactor,volpan->dwTotalRightAmpFactor);
-    if (volpan->dwTotalLeftAmpFactor==0)
-        left=-10000;
+#define LOG10(x) log(x)/log(10)
+
+    if (volpan->dwTotalLeftAmpFactor == 0)
+        left = -10000;
     else
-        left=600 * log(((double)volpan->dwTotalLeftAmpFactor) / 0xffff) /
log(2);
-    if (volpan->dwTotalRightAmpFactor==0)
-        right=-10000;
+    left = 2e3 * LOG10((DOUBLE)volpan->dwTotalLeftAmpFactor / 0x10000);
+
+    if (volpan->dwTotalRightAmpFactor == 0)
+        right =- 10000;
     else
-        right=600 * log(((double)volpan->dwTotalRightAmpFactor) / 0xffff) /
log(2);
+    right= 2e3 * LOG10((DOUBLE)volpan->dwTotalRightAmpFactor / 0x10000);
+
     if (left<right)
     {
         volpan->lVolume=right;
-- 
1.7.2.3
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20110211/91d6a110/attachment-0001.htm>


More information about the wine-patches mailing list