From: Andrew Eikum Subject: [PATCH 2/4] dsound: Mix float natively Message-Id: <20160408183810.GE31257@foghorn.codeweavers.com> Date: Fri, 8 Apr 2016 13:38:10 -0500 From: Maarten Lankhorst Signed-off-by: Andrew Eikum --- 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 f650089..59ee21d 100644 --- a/dlls/dsound/mixer.c +++ b/dlls/dsound/mixer.c @@ -684,6 +684,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 */ @@ -698,22 +699,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) { -- 2.8.0