[PATCH 2/5] dsound: mix float natively

Maarten Lankhorst m.b.lankhorst at gmail.com
Wed Jan 2 07:46:44 CST 2013


---
 dlls/dsound/mixer.c | 43 ++++++++++++++++++++++++++++++++-----------
 1 file changed, 32 insertions(+), 11 deletions(-)

diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c
index 8ba1348..1bf4857 100644
--- a/dlls/dsound/mixer.c
+++ b/dlls/dsound/mixer.c
@@ -643,6 +643,7 @@ static void DSOUND_PerformMix(DirectSoundDevice *device)
 	if (device->priolevel != DSSCL_WRITEPRIMARY) {
 		BOOL all_stopped = FALSE;
 		int nfiller;
+		BOOL native = device->normfunction == normfunctions[4];
 		DWORD bpp = device->pwfx->wBitsPerSample>>3;
 
 		/* the sound of silence */
@@ -657,22 +658,42 @@ static void DSOUND_PerformMix(DirectSoundDevice *device)
 			TRACE("Buffer restarting\n");
 		}
 
-		memset(device->mix_buffer, nfiller, maxq);
+		if (native) {
+			void *buffer = NULL;
 
-		/* do the mixing */
-		DSOUND_MixToPrimary(device, device->mix_buffer, writepos, maxq, &all_stopped);
+			hr = IAudioRenderClient_GetBuffer(device->render, maxq / block, (void*)&buffer);
+			if(FAILED(hr)){
+				WARN("GetBuffer failed: %08x\n", hr);
+				LeaveCriticalSection(&device->mixlock);
+				return;
+			}
+			memset(buffer, nfiller, maxq);
 
-		if (maxq + writepos > device->buflen) {
-			DWORD todo = device->buflen - writepos;
+			DSOUND_MixToPrimary(device, buffer, writepos, maxq, &all_stopped);
 
-			device->normfunction(device->mix_buffer, device->buffer + writepos, todo);
-			DSOUND_WaveQueue(device, device->buffer + writepos, todo);
+			hr = IAudioRenderClient_ReleaseBuffer(device->render, maxq / block, 0);
+			if(FAILED(hr))
+				ERR("ReleaseBuffer failed: %08x\n", hr);
 
-			device->normfunction(device->mix_buffer + todo / bpp, device->buffer, (maxq - todo));
-			DSOUND_WaveQueue(device, device->buffer, maxq - todo);
+			device->pad += maxq;
 		} else {
-			device->normfunction(device->mix_buffer, device->buffer + writepos, maxq);
-			DSOUND_WaveQueue(device, device->buffer + writepos, maxq);
+			memset(device->mix_buffer, nfiller, maxq);
+
+			/* do the mixing */
+			DSOUND_MixToPrimary(device, device->mix_buffer, writepos, maxq, &all_stopped);
+
+			if (maxq + writepos > device->buflen) {
+				DWORD todo = device->buflen - writepos;
+
+				device->normfunction(device->mix_buffer, device->buffer + writepos, todo);
+				DSOUND_WaveQueue(device, device->buffer + writepos, todo);
+
+				device->normfunction(device->mix_buffer + todo / bpp, device->buffer, (maxq - todo));
+				DSOUND_WaveQueue(device, device->buffer, maxq - todo);
+			} else {
+				device->normfunction(device->mix_buffer, device->buffer + writepos, maxq);
+				DSOUND_WaveQueue(device, device->buffer + writepos, maxq);
+			}
 		}
 
 		if (maxq) {
-- 
1.8.0.3




More information about the wine-patches mailing list