Module: wine Branch: stable Commit: 3c148a76f2486a0884a67d049ada3a3ad853fc81 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3c148a76f2486a0884a67d049a...
Author: Andrew Eikum aeikum@codeweavers.com Date: Tue Nov 12 10:17:21 2013 -0600
mmdevapi: Fill buffer with silence in IAudioRenderClient::GetBuffer.
(cherry picked from commit a5975bb6013a45d36b4b554e6e31cf087ab30982)
---
dlls/winealsa.drv/mmdevdrv.c | 22 ++++++++++++++++------ dlls/winecoreaudio.drv/mmdevdrv.c | 27 +++++++++++++++------------ dlls/wineoss.drv/mmdevdrv.c | 22 ++++++++++++++-------- 3 files changed, 45 insertions(+), 26 deletions(-)
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index ce4b2c8..32da8a1 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -2448,6 +2448,18 @@ static ULONG WINAPI AudioRenderClient_Release(IAudioRenderClient *iface) return AudioClient_Release(&This->IAudioClient_iface); }
+static void silence_buffer(ACImpl *This, BYTE *buffer, UINT32 frames) +{ + WAVEFORMATEXTENSIBLE *fmtex = (WAVEFORMATEXTENSIBLE*)This->fmt; + if((This->fmt->wFormatTag == WAVE_FORMAT_PCM || + (This->fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE && + IsEqualGUID(&fmtex->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM))) && + This->fmt->wBitsPerSample == 8) + memset(buffer, 128, frames * This->fmt->nBlockAlign); + else + memset(buffer, 0, frames * This->fmt->nBlockAlign); +} + static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, UINT32 frames, BYTE **data) { @@ -2497,6 +2509,8 @@ static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, This->getbuf_last = frames; }
+ silence_buffer(This, *data, frames); + LeaveCriticalSection(&This->lock);
return S_OK; @@ -2550,12 +2564,8 @@ static HRESULT WINAPI AudioRenderClient_ReleaseBuffer( else buffer = This->tmp_buffer;
- if(flags & AUDCLNT_BUFFERFLAGS_SILENT){ - if(This->fmt->wBitsPerSample == 8) - memset(buffer, 128, written_frames * This->fmt->nBlockAlign); - else - memset(buffer, 0, written_frames * This->fmt->nBlockAlign); - } + if(flags & AUDCLNT_BUFFERFLAGS_SILENT) + silence_buffer(This, buffer, written_frames);
if(This->getbuf_last < 0) alsa_wrap_buffer(This, buffer, written_frames); diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index d4250a7..92be329 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -1966,6 +1966,18 @@ static ULONG WINAPI AudioRenderClient_Release(IAudioRenderClient *iface) return AudioClient_Release(&This->IAudioClient_iface); }
+static void silence_buffer(ACImpl *This, BYTE *buffer, UINT32 frames) +{ + WAVEFORMATEXTENSIBLE *fmtex = (WAVEFORMATEXTENSIBLE*)This->fmt; + if((This->fmt->wFormatTag == WAVE_FORMAT_PCM || + (This->fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE && + IsEqualGUID(&fmtex->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM))) && + This->fmt->wBitsPerSample == 8) + memset(buffer, 128, frames * This->fmt->nBlockAlign); + else + memset(buffer, 0, frames * This->fmt->nBlockAlign); +} + static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, UINT32 frames, BYTE **data) { @@ -2036,6 +2048,7 @@ static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface,
This->getbuf_last = frames; *data = This->public_buffer->mAudioData; + silence_buffer(This, *data, frames);
OSSpinLockUnlock(&This->lock);
@@ -2075,18 +2088,8 @@ static HRESULT WINAPI AudioRenderClient_ReleaseBuffer( return AUDCLNT_E_INVALID_SIZE; }
- if(flags & AUDCLNT_BUFFERFLAGS_SILENT){ - WAVEFORMATEXTENSIBLE *fmtex = (WAVEFORMATEXTENSIBLE*)This->fmt; - if((This->fmt->wFormatTag == WAVE_FORMAT_PCM || - (This->fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE && - IsEqualGUID(&fmtex->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM))) && - This->fmt->wBitsPerSample == 8) - memset(This->public_buffer->mAudioData, 128, - frames * This->fmt->nBlockAlign); - else - memset(This->public_buffer->mAudioData, 0, - frames * This->fmt->nBlockAlign); - } + if(flags & AUDCLNT_BUFFERFLAGS_SILENT) + silence_buffer(This, This->public_buffer->mAudioData, frames);
This->public_buffer->mAudioDataByteSize = frames * This->fmt->nBlockAlign;
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 0db7bb7..e13880e 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -1354,12 +1354,16 @@ static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient *iface, return S_OK; }
-static void oss_silence_buffer(ACImpl *This, BYTE *buf, UINT32 frames) -{ - if(This->fmt->wBitsPerSample == 8) - memset(buf, 128, frames * This->fmt->nBlockAlign); +static void silence_buffer(ACImpl *This, BYTE *buffer, UINT32 frames) +{ + WAVEFORMATEXTENSIBLE *fmtex = (WAVEFORMATEXTENSIBLE*)This->fmt; + if((This->fmt->wFormatTag == WAVE_FORMAT_PCM || + (This->fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE && + IsEqualGUID(&fmtex->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM))) && + This->fmt->wBitsPerSample == 8) + memset(buffer, 128, frames * This->fmt->nBlockAlign); else - memset(buf, 0, frames * This->fmt->nBlockAlign); + memset(buffer, 0, frames * This->fmt->nBlockAlign); }
static void oss_write_data(ACImpl *This) @@ -1406,7 +1410,7 @@ static void oss_write_data(ACImpl *This) to_write_bytes = to_write_frames * This->fmt->nBlockAlign;
if(This->session->mute) - oss_silence_buffer(This, buf, to_write_frames); + silence_buffer(This, buf, to_write_frames);
written_bytes = write(This->fd, buf, to_write_bytes); if(written_bytes < 0){ @@ -1432,7 +1436,7 @@ static void oss_write_data(ACImpl *This) to_write_bytes = to_write_frames * This->fmt->nBlockAlign;
if(This->session->mute) - oss_silence_buffer(This, This->local_buffer, to_write_frames); + silence_buffer(This, This->local_buffer, to_write_frames);
written_bytes = write(This->fd, This->local_buffer, to_write_bytes); if(written_bytes < 0){ @@ -1830,6 +1834,8 @@ static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, This->getbuf_last = frames; }
+ silence_buffer(This, *data, frames); + LeaveCriticalSection(&This->lock);
return S_OK; @@ -1886,7 +1892,7 @@ static HRESULT WINAPI AudioRenderClient_ReleaseBuffer( buffer = This->tmp_buffer;
if(flags & AUDCLNT_BUFFERFLAGS_SILENT) - oss_silence_buffer(This, buffer, written_frames); + silence_buffer(This, buffer, written_frames);
if(This->getbuf_last < 0) oss_wrap_buffer(This, buffer, written_frames);