[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