Andrew Eikum : mmdevapi: Fill buffer with silence in IAudioRenderClient:: GetBuffer.
Alexandre Julliard
julliard at winehq.org
Fri Jan 10 14:44:55 CST 2014
Module: wine
Branch: stable
Commit: 3c148a76f2486a0884a67d049ada3a3ad853fc81
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3c148a76f2486a0884a67d049ada3a3ad853fc81
Author: Andrew Eikum <aeikum at 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);
More information about the wine-cvs
mailing list