[PATCH] dsound: Fix volume and panning for primary buffer

Maarten Lankhorst maarten at codeweavers.com
Sun Sep 28 13:47:28 CDT 2008


---
 dlls/dsound/dsound.c         |    2 +-
 dlls/dsound/dsound_private.h |    2 +
 dlls/dsound/primary.c        |   72 +++++++++++++++++++++++------------------
 3 files changed, 43 insertions(+), 33 deletions(-)

diff --git a/dlls/dsound/dsound.c b/dlls/dsound/dsound.c
index 87e9bba..7032774 100644
--- a/dlls/dsound/dsound.c
+++ b/dlls/dsound/dsound.c
@@ -1471,7 +1471,7 @@ HRESULT DirectSoundDevice_Initialize(DirectSoundDevice ** ppDevice, LPCGUID lpcG
             device->drvcaps.dwFlags |= DSCAPS_EMULDRIVER;
         device->drvcaps.dwMinSecondarySampleRate = DSBFREQUENCY_MIN;
         device->drvcaps.dwMaxSecondarySampleRate = DSBFREQUENCY_MAX;
-        device->drvcaps.dwPrimaryBuffers = 1;
+        ZeroMemory(&device->volpan, sizeof(device->volpan));
     }
 
     hr = DSOUND_PrimaryCreate(device);
diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h
index 262e9ec..2d87263 100644
--- a/dlls/dsound/dsound_private.h
+++ b/dlls/dsound/dsound_private.h
@@ -108,6 +108,8 @@ struct DirectSoundDevice
     LPBYTE                      tmp_buffer, mix_buffer;
     DWORD                       tmp_buffer_len, mix_buffer_len;
 
+    DSVOLUMEPAN                 volpan;
+
     mixfunc mixfunction;
     normfunc normfunction;
 
diff --git a/dlls/dsound/primary.c b/dlls/dsound/primary.c
index 4e80778..661cd8c 100644
--- a/dlls/dsound/primary.c
+++ b/dlls/dsound/primary.c
@@ -169,7 +169,10 @@ static HRESULT DSOUND_PrimaryOpen(DirectSoundDevice *device)
 				return err;
 			}
 		}
-		DSOUND_RecalcPrimary(device);
+                if (device->hwbuf)
+                    IDsDriverBuffer_SetVolumePan(device->hwbuf, &device->volpan);
+
+                DSOUND_RecalcPrimary(device);
 		device->prebuf = ds_snd_queue_max;
 		if (device->helfrags < ds_snd_queue_min)
 		{
@@ -582,7 +585,6 @@ static HRESULT WINAPI PrimaryBufferImpl_SetVolume(
 ) {
 	DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
 	DWORD ampfactors;
-	DSVOLUMEPAN volpan;
         HRESULT hres = DS_OK;
 	TRACE("(%p,%d)\n", iface, vol);
 
@@ -600,18 +602,18 @@ static HRESULT WINAPI PrimaryBufferImpl_SetVolume(
 	EnterCriticalSection(&(device->mixlock));
 
         waveOutGetVolume(device->hwo, &ampfactors);
-        volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff;
-        volpan.dwTotalRightAmpFactor=ampfactors >> 16;
-        DSOUND_AmpFactorToVolPan(&volpan);
-        if (vol != volpan.lVolume) {
-            volpan.lVolume=vol;
-            DSOUND_RecalcVolPan(&volpan);
+        device->volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff;
+        device->volpan.dwTotalRightAmpFactor=ampfactors >> 16;
+        DSOUND_AmpFactorToVolPan(&device->volpan);
+        if (vol != device->volpan.lVolume) {
+            device->volpan.lVolume=vol;
+            DSOUND_RecalcVolPan(&device->volpan);
             if (device->hwbuf) {
-                hres = IDsDriverBuffer_SetVolumePan(device->hwbuf, &volpan);
+                hres = IDsDriverBuffer_SetVolumePan(device->hwbuf, &device->volpan);
                 if (hres != DS_OK)
                     WARN("IDsDriverBuffer_SetVolumePan failed\n");
             } else {
-                ampfactors = (volpan.dwTotalLeftAmpFactor & 0xffff) | (volpan.dwTotalRightAmpFactor << 16);
+                ampfactors = (device->volpan.dwTotalLeftAmpFactor & 0xffff) | (device->volpan.dwTotalRightAmpFactor << 16);
                 waveOutSetVolume(device->hwo, ampfactors);
             }
         }
@@ -627,7 +629,6 @@ static HRESULT WINAPI PrimaryBufferImpl_GetVolume(
 ) {
 	DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
 	DWORD ampfactors;
-	DSVOLUMEPAN volpan;
 	TRACE("(%p,%p)\n", iface, vol);
 
 	if (!(device->dsbd.dwFlags & DSBCAPS_CTRLVOLUME)) {
@@ -640,11 +641,14 @@ static HRESULT WINAPI PrimaryBufferImpl_GetVolume(
 		return DSERR_INVALIDPARAM;
 	}
 
-	waveOutGetVolume(device->hwo, &ampfactors);
-	volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff;
-	volpan.dwTotalRightAmpFactor=ampfactors >> 16;
-	DSOUND_AmpFactorToVolPan(&volpan);
-	*vol = volpan.lVolume;
+        if (!device->hwbuf)
+        {
+	    waveOutGetVolume(device->hwo, &ampfactors);
+	    device->volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff;
+	    device->volpan.dwTotalRightAmpFactor=ampfactors >> 16;
+	    DSOUND_AmpFactorToVolPan(&device->volpan);
+        }
+        *vol = device->volpan.lVolume;
 	return DS_OK;
 }
 
@@ -907,7 +911,6 @@ static HRESULT WINAPI PrimaryBufferImpl_SetPan(
 ) {
         DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
 	DWORD ampfactors;
-	DSVOLUMEPAN volpan;
         HRESULT hres = DS_OK;
 	TRACE("(%p,%d)\n", iface, pan);
 
@@ -924,19 +927,22 @@ static HRESULT WINAPI PrimaryBufferImpl_SetPan(
 	/* **** */
 	EnterCriticalSection(&(device->mixlock));
 
-        waveOutGetVolume(device->hwo, &ampfactors);
-        volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff;
-        volpan.dwTotalRightAmpFactor=ampfactors >> 16;
-        DSOUND_AmpFactorToVolPan(&volpan);
-        if (pan != volpan.lPan) {
-            volpan.lPan=pan;
-            DSOUND_RecalcVolPan(&volpan);
+        if (!device->hwbuf)
+        {
+            waveOutGetVolume(device->hwo, &ampfactors);
+            device->volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff;
+            device->volpan.dwTotalRightAmpFactor=ampfactors >> 16;
+            DSOUND_AmpFactorToVolPan(&device->volpan);
+        }
+        if (pan != device->volpan.lPan) {
+            device->volpan.lPan=pan;
+            DSOUND_RecalcVolPan(&device->volpan);
             if (device->hwbuf) {
-                hres = IDsDriverBuffer_SetVolumePan(device->hwbuf, &volpan);
+                hres = IDsDriverBuffer_SetVolumePan(device->hwbuf, &device->volpan);
                 if (hres != DS_OK)
                     WARN("IDsDriverBuffer_SetVolumePan failed\n");
             } else {
-                ampfactors = (volpan.dwTotalLeftAmpFactor & 0xffff) | (volpan.dwTotalRightAmpFactor << 16);
+                ampfactors = (device->volpan.dwTotalLeftAmpFactor & 0xffff) | (device->volpan.dwTotalRightAmpFactor << 16);
                 waveOutSetVolume(device->hwo, ampfactors);
             }
         }
@@ -952,7 +958,6 @@ static HRESULT WINAPI PrimaryBufferImpl_GetPan(
 ) {
         DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
 	DWORD ampfactors;
-	DSVOLUMEPAN volpan;
 	TRACE("(%p,%p)\n", iface, pan);
 
 	if (!(device->dsbd.dwFlags & DSBCAPS_CTRLPAN)) {
@@ -965,11 +970,14 @@ static HRESULT WINAPI PrimaryBufferImpl_GetPan(
 		return DSERR_INVALIDPARAM;
 	}
 
-	waveOutGetVolume(device->hwo, &ampfactors);
-	volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff;
-	volpan.dwTotalRightAmpFactor=ampfactors >> 16;
-	DSOUND_AmpFactorToVolPan(&volpan);
-	*pan = volpan.lPan;
+        if (!device->hwbuf)
+        {
+	    waveOutGetVolume(device->hwo, &ampfactors);
+	    device->volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff;
+	    device->volpan.dwTotalRightAmpFactor=ampfactors >> 16;
+	    DSOUND_AmpFactorToVolPan(&device->volpan);
+        }
+	*pan = device->volpan.lPan;
 	return DS_OK;
 }
 
-- 
1.5.6.5


--------------000507050108070901020609--



More information about the wine-patches mailing list