[PATCH 2/4] dsound: Mix float natively
Andrew Eikum
aeikum at codeweavers.com
Fri Apr 8 13:38:10 CDT 2016
From: Maarten Lankhorst <maarten.lankhorst at canonical.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
---
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
More information about the wine-patches
mailing list