Huw Davies : winecoreaudio: Move release_render_buffer to the unixlib.
Alexandre Julliard
julliard at winehq.org
Tue Nov 23 16:03:30 CST 2021
Module: wine
Branch: master
Commit: e9b92297540415d15e5ecaaec111d81ffd0f2803
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e9b92297540415d15e5ecaaec111d81ffd0f2803
Author: Huw Davies <huw at codeweavers.com>
Date: Tue Nov 23 07:55:07 2021 +0000
winecoreaudio: Move release_render_buffer to the unixlib.
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winecoreaudio.drv/coreaudio.c | 45 +++++++++++++++++++++++
dlls/winecoreaudio.drv/mmdevdrv.c | 73 ++++----------------------------------
dlls/winecoreaudio.drv/unixlib.h | 9 +++++
3 files changed, 60 insertions(+), 67 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c
index 0bf21cd6c7d..2519a6bcfaa 100644
--- a/dlls/winecoreaudio.drv/coreaudio.c
+++ b/dlls/winecoreaudio.drv/coreaudio.c
@@ -1358,6 +1358,50 @@ end:
return STATUS_SUCCESS;
}
+static NTSTATUS release_render_buffer(void *args)
+{
+ struct release_render_buffer_params *params = args;
+ struct coreaudio_stream *stream = params->stream;
+ BYTE *buffer;
+
+ OSSpinLockLock(&stream->lock);
+
+ if(!params->frames){
+ stream->getbuf_last = 0;
+ params->result = S_OK;
+ }else if(!stream->getbuf_last)
+ params->result = AUDCLNT_E_OUT_OF_ORDER;
+ else if(params->frames > (stream->getbuf_last >= 0 ? stream->getbuf_last : -stream->getbuf_last))
+ params->result = AUDCLNT_E_INVALID_SIZE;
+ else{
+ if(stream->getbuf_last >= 0)
+ buffer = stream->local_buffer + stream->wri_offs_frames * stream->fmt->nBlockAlign;
+ else
+ buffer = stream->tmp_buffer;
+
+ if(params->flags & AUDCLNT_BUFFERFLAGS_SILENT)
+ silence_buffer(stream, buffer, params->frames);
+
+ if(stream->getbuf_last < 0)
+ ca_wrap_buffer(stream->local_buffer,
+ stream->wri_offs_frames * stream->fmt->nBlockAlign,
+ stream->bufsize_frames * stream->fmt->nBlockAlign,
+ buffer, params->frames * stream->fmt->nBlockAlign);
+
+ stream->wri_offs_frames += params->frames;
+ stream->wri_offs_frames %= stream->bufsize_frames;
+ stream->held_frames += params->frames;
+ stream->written_frames += params->frames;
+ stream->getbuf_last = 0;
+
+ params->result = S_OK;
+ }
+
+ OSSpinLockUnlock(&stream->lock);
+
+ return STATUS_SUCCESS;
+}
+
unixlib_entry_t __wine_unix_call_funcs[] =
{
get_endpoint_ids,
@@ -1367,6 +1411,7 @@ unixlib_entry_t __wine_unix_call_funcs[] =
stop,
reset,
get_render_buffer,
+ release_render_buffer,
get_mix_format,
is_format_supported,
get_buffer_size,
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c
index 5dca497594a..1874382304b 100644
--- a/dlls/winecoreaudio.drv/mmdevdrv.c
+++ b/dlls/winecoreaudio.drv/mmdevdrv.c
@@ -683,30 +683,6 @@ static HRESULT get_audio_session(const GUID *sessionguid,
return S_OK;
}
-static void ca_wrap_buffer(BYTE *dst, UINT32 dst_offs, UINT32 dst_bytes,
- BYTE *src, UINT32 src_bytes)
-{
- UINT32 chunk_bytes = dst_bytes - dst_offs;
-
- if(chunk_bytes < src_bytes){
- memcpy(dst + dst_offs, src, chunk_bytes);
- memcpy(dst, src + chunk_bytes, src_bytes - chunk_bytes);
- }else
- memcpy(dst + dst_offs, src, src_bytes);
-}
-
-static void silence_buffer(struct coreaudio_stream *stream, BYTE *buffer, UINT32 frames)
-{
- WAVEFORMATEXTENSIBLE *fmtex = (WAVEFORMATEXTENSIBLE*)stream->fmt;
- if((stream->fmt->wFormatTag == WAVE_FORMAT_PCM ||
- (stream->fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
- IsEqualGUID(&fmtex->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM))) &&
- stream->fmt->wBitsPerSample == 8)
- memset(buffer, 128, frames * stream->fmt->nBlockAlign);
- else
- memset(buffer, 0, frames * stream->fmt->nBlockAlign);
-}
-
static void capture_resample(ACImpl *This)
{
UNIX_CALL(capture_resample, This->stream);
@@ -1322,52 +1298,15 @@ static HRESULT WINAPI AudioRenderClient_ReleaseBuffer(
IAudioRenderClient *iface, UINT32 frames, DWORD flags)
{
ACImpl *This = impl_from_IAudioRenderClient(iface);
- BYTE *buffer;
+ struct release_render_buffer_params params;
TRACE("(%p)->(%u, %x)\n", This, frames, flags);
- OSSpinLockLock(&This->stream->lock);
-
- if(!frames){
- This->stream->getbuf_last = 0;
- OSSpinLockUnlock(&This->stream->lock);
- return S_OK;
- }
-
- if(!This->stream->getbuf_last){
- OSSpinLockUnlock(&This->stream->lock);
- return AUDCLNT_E_OUT_OF_ORDER;
- }
-
- if(frames > (This->stream->getbuf_last >= 0 ? This->stream->getbuf_last : -This->stream->getbuf_last)){
- OSSpinLockUnlock(&This->stream->lock);
- return AUDCLNT_E_INVALID_SIZE;
- }
-
- if(This->stream->getbuf_last >= 0)
- buffer = This->stream->local_buffer + This->stream->wri_offs_frames * This->stream->fmt->nBlockAlign;
- else
- buffer = This->stream->tmp_buffer;
-
- if(flags & AUDCLNT_BUFFERFLAGS_SILENT)
- silence_buffer(This->stream, buffer, frames);
-
- if(This->stream->getbuf_last < 0)
- ca_wrap_buffer(This->stream->local_buffer,
- This->stream->wri_offs_frames * This->stream->fmt->nBlockAlign,
- This->stream->bufsize_frames * This->stream->fmt->nBlockAlign,
- buffer, frames * This->stream->fmt->nBlockAlign);
-
-
- This->stream->wri_offs_frames += frames;
- This->stream->wri_offs_frames %= This->stream->bufsize_frames;
- This->stream->held_frames += frames;
- This->stream->written_frames += frames;
- This->stream->getbuf_last = 0;
-
- OSSpinLockUnlock(&This->stream->lock);
-
- return S_OK;
+ params.stream = This->stream;
+ params.frames = frames;
+ params.flags = flags;
+ UNIX_CALL(release_render_buffer, ¶ms);
+ return params.result;
}
static const IAudioRenderClientVtbl AudioRenderClient_Vtbl = {
diff --git a/dlls/winecoreaudio.drv/unixlib.h b/dlls/winecoreaudio.drv/unixlib.h
index e2ae457e705..80f42741e34 100644
--- a/dlls/winecoreaudio.drv/unixlib.h
+++ b/dlls/winecoreaudio.drv/unixlib.h
@@ -101,6 +101,14 @@ struct get_render_buffer_params
BYTE **data;
};
+struct release_render_buffer_params
+{
+ struct coreaudio_stream *stream;
+ UINT32 frames;
+ DWORD flags;
+ HRESULT result;
+};
+
struct get_mix_format_params
{
EDataFlow flow;
@@ -149,6 +157,7 @@ enum unix_funcs
unix_stop,
unix_reset,
unix_get_render_buffer,
+ unix_release_render_buffer,
unix_get_mix_format,
unix_is_format_supported,
unix_get_buffer_size,
More information about the wine-cvs
mailing list