From a5975bb6013a45d36b4b554e6e31cf087ab30982 Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Tue, 12 Nov 2013 10:17:21 -0600 Subject: [PATCH] mmdevapi: Fill buffer with silence in IAudioRenderClient::GetBuffer. --- dlls/mmdevapi/tests/render.c | 15 +++++++++++++-- dlls/winealsa.drv/mmdevdrv.c | 22 ++++++++++++++++------ dlls/winecoreaudio.drv/mmdevdrv.c | 27 +++++++++++++++------------ dlls/wineoss.drv/mmdevdrv.c | 20 +++++++++++++------- 4 files changed, 57 insertions(+), 27 deletions(-) diff --git a/dlls/mmdevapi/tests/render.c b/dlls/mmdevapi/tests/render.c index 2755dbf5ddf..38495dfaecf 100644 --- a/dlls/mmdevapi/tests/render.c +++ b/dlls/mmdevapi/tests/render.c @@ -692,8 +692,8 @@ static void test_padding(void) IAudioRenderClient *arc; WAVEFORMATEX *pwfx; REFERENCE_TIME minp, defp; - BYTE *buf; - UINT32 psize, pad, written; + BYTE *buf, silence; + UINT32 psize, pad, written, i; hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER, NULL, (void**)&ac); @@ -712,6 +712,11 @@ static void test_padding(void) if(hr != S_OK) return; + if(pwfx->wBitsPerSample == 8) + silence = 128; + else + silence = 0; + /** GetDevicePeriod * Default (= shared) device period is 10ms (e.g. 441 frames at 44100), * except when the HW/OS forces a particular alignment, @@ -738,6 +743,12 @@ static void test_padding(void) hr = IAudioRenderClient_GetBuffer(arc, psize, &buf); ok(hr == S_OK, "GetBuffer failed: %08x\n", hr); ok(buf != NULL, "NULL buffer returned\n"); + for(i = 0; i < psize * pwfx->nBlockAlign; ++i){ + if(buf[i] != silence){ + ok(0, "buffer has data in it already\n"); + break; + } + } hr = IAudioRenderClient_GetBuffer(arc, 0, &buf); ok(hr == AUDCLNT_E_OUT_OF_ORDER, "GetBuffer 0 size failed: %08x\n", hr); diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index ba70b025b05..6e854e410ef 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -2466,6 +2466,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) { @@ -2515,6 +2527,8 @@ static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, This->getbuf_last = frames; } + silence_buffer(This, *data, frames); + LeaveCriticalSection(&This->lock); return S_OK; @@ -2568,12 +2582,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 bfc6eb88fd4..914baa911c0 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -2024,6 +2024,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) { @@ -2094,6 +2106,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); @@ -2133,18 +2146,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 bbc26b1e684..eab4723e234 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -1367,12 +1367,16 @@ static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient *iface, return S_OK; } -static void oss_silence_buffer(ACImpl *This, BYTE *buf, UINT32 frames) +static void silence_buffer(ACImpl *This, BYTE *buffer, UINT32 frames) { - if(This->fmt->wBitsPerSample == 8) - memset(buf, 128, frames * This->fmt->nBlockAlign); + 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) @@ -1419,7 +1423,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){ @@ -1445,7 +1449,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){ @@ -1846,6 +1850,8 @@ static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, This->getbuf_last = frames; } + silence_buffer(This, *data, frames); + LeaveCriticalSection(&This->lock); return S_OK; @@ -1902,7 +1908,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);