Huw Davies : winecoreaudio: Move get_render_buffer to the unixlib.
Alexandre Julliard
julliard at winehq.org
Tue Nov 23 16:03:30 CST 2021
Module: wine
Branch: master
Commit: c45df2763cb4a7897cb899fd086ee874e8fa2433
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c45df2763cb4a7897cb899fd086ee874e8fa2433
Author: Huw Davies <huw at codeweavers.com>
Date: Tue Nov 23 07:55:06 2021 +0000
winecoreaudio: Move get_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 | 60 +++++++++++++++++++++++++++++-
dlls/winecoreaudio.drv/mmdevdrv.c | 75 +++-----------------------------------
dlls/winecoreaudio.drv/unixlib.h | 10 ++++-
3 files changed, 73 insertions(+), 72 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c
index ee34cd29de1..0bf21cd6c7d 100644
--- a/dlls/winecoreaudio.drv/coreaudio.c
+++ b/dlls/winecoreaudio.drv/coreaudio.c
@@ -699,6 +699,9 @@ static NTSTATUS release_stream( void *args )
if(stream->local_buffer)
NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer,
&stream->local_buffer_size, MEM_RELEASE);
+ if(stream->tmp_buffer)
+ NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer,
+ &stream->tmp_buffer_size, MEM_RELEASE);
free(stream->fmt);
params->result = S_OK;
return STATUS_SUCCESS;
@@ -1230,9 +1233,9 @@ static NTSTATUS get_current_padding(void *args)
struct get_current_padding_params *params = args;
struct coreaudio_stream *stream = params->stream;
- if(params->lock) OSSpinLockLock(&stream->lock);
+ OSSpinLockLock(&stream->lock);
*params->padding = get_current_padding_nolock(stream);
- if(params->lock) OSSpinLockUnlock(&stream->lock);
+ OSSpinLockUnlock(&stream->lock);
params->result = S_OK;
return STATUS_SUCCESS;
}
@@ -1303,6 +1306,58 @@ static NTSTATUS reset(void *args)
return STATUS_SUCCESS;
}
+static NTSTATUS get_render_buffer(void *args)
+{
+ struct get_render_buffer_params *params = args;
+ struct coreaudio_stream *stream = params->stream;
+ UINT32 pad;
+
+ OSSpinLockLock(&stream->lock);
+
+ pad = get_current_padding_nolock(stream);
+
+ if(stream->getbuf_last){
+ params->result = AUDCLNT_E_OUT_OF_ORDER;
+ goto end;
+ }
+ if(!params->frames){
+ params->result = S_OK;
+ goto end;
+ }
+ if(pad + params->frames > stream->bufsize_frames){
+ params->result = AUDCLNT_E_BUFFER_TOO_LARGE;
+ goto end;
+ }
+
+ if(stream->wri_offs_frames + params->frames > stream->bufsize_frames){
+ if(stream->tmp_buffer_frames < params->frames){
+ NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer,
+ &stream->tmp_buffer_size, MEM_RELEASE);
+ stream->tmp_buffer_size = params->frames * stream->fmt->nBlockAlign;
+ if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, 0,
+ &stream->tmp_buffer_size, MEM_COMMIT, PAGE_READWRITE)){
+ stream->tmp_buffer_frames = 0;
+ params->result = E_OUTOFMEMORY;
+ goto end;
+ }
+ stream->tmp_buffer_frames = params->frames;
+ }
+ *params->data = stream->tmp_buffer;
+ stream->getbuf_last = -params->frames;
+ }else{
+ *params->data = stream->local_buffer + stream->wri_offs_frames * stream->fmt->nBlockAlign;
+ stream->getbuf_last = params->frames;
+ }
+
+ silence_buffer(stream, *params->data, params->frames);
+ params->result = S_OK;
+
+end:
+ OSSpinLockUnlock(&stream->lock);
+
+ return STATUS_SUCCESS;
+}
+
unixlib_entry_t __wine_unix_call_funcs[] =
{
get_endpoint_ids,
@@ -1311,6 +1366,7 @@ unixlib_entry_t __wine_unix_call_funcs[] =
start,
stop,
reset,
+ get_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 cf2c23a0f40..5dca497594a 100644
--- a/dlls/winecoreaudio.drv/mmdevdrv.c
+++ b/dlls/winecoreaudio.drv/mmdevdrv.c
@@ -554,9 +554,6 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface)
CloseHandle(event);
}
if(This->stream){
- if(This->stream->tmp_buffer)
- NtFreeVirtualMemory(GetCurrentProcess(), (void **)&This->stream->tmp_buffer,
- &This->stream->tmp_buffer_size, MEM_RELEASE);
params.stream = This->stream;
UNIX_CALL(release_stream, ¶ms);
}
@@ -871,21 +868,6 @@ static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface,
return params.result;
}
-static HRESULT AudioClient_GetCurrentPadding_nolock(ACImpl *This,
- UINT32 *numpad)
-{
- struct get_current_padding_params params;
-
- if(!This->stream)
- return AUDCLNT_E_NOT_INITIALIZED;
-
- params.stream = This->stream;
- params.padding = numpad;
- params.lock = FALSE;
- UNIX_CALL(get_current_padding, ¶ms);
- return params.result;
-}
-
static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface,
UINT32 *numpad)
{
@@ -902,7 +884,6 @@ static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface,
params.stream = This->stream;
params.padding = numpad;
- params.lock = TRUE;
UNIX_CALL(get_current_padding, ¶ms);
return params.result;
}
@@ -1322,8 +1303,7 @@ static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface,
UINT32 frames, BYTE **data)
{
ACImpl *This = impl_from_IAudioRenderClient(iface);
- UINT32 pad;
- HRESULT hr;
+ struct get_render_buffer_params params;
TRACE("(%p)->(%u, %p)\n", This, frames, data);
@@ -1331,54 +1311,11 @@ static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface,
return E_POINTER;
*data = NULL;
- OSSpinLockLock(&This->stream->lock);
-
- if(This->stream->getbuf_last){
- OSSpinLockUnlock(&This->stream->lock);
- return AUDCLNT_E_OUT_OF_ORDER;
- }
-
- if(!frames){
- OSSpinLockUnlock(&This->stream->lock);
- return S_OK;
- }
-
- hr = AudioClient_GetCurrentPadding_nolock(This, &pad);
- if(FAILED(hr)){
- OSSpinLockUnlock(&This->stream->lock);
- return hr;
- }
-
- if(pad + frames > This->stream->bufsize_frames){
- OSSpinLockUnlock(&This->stream->lock);
- return AUDCLNT_E_BUFFER_TOO_LARGE;
- }
-
- if(This->stream->wri_offs_frames + frames > This->stream->bufsize_frames){
- if(This->stream->tmp_buffer_frames < frames){
- NtFreeVirtualMemory(GetCurrentProcess(), (void **)&This->stream->tmp_buffer,
- &This->stream->tmp_buffer_size, MEM_RELEASE);
- This->stream->tmp_buffer_size = frames * This->stream->fmt->nBlockAlign;
- if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&This->stream->tmp_buffer, 0,
- &This->stream->tmp_buffer_size, MEM_COMMIT, PAGE_READWRITE)){
- This->stream->tmp_buffer_frames = 0;
- OSSpinLockUnlock(&This->stream->lock);
- return E_OUTOFMEMORY;
- }
- This->stream->tmp_buffer_frames = frames;
- }
- *data = This->stream->tmp_buffer;
- This->stream->getbuf_last = -frames;
- }else{
- *data = This->stream->local_buffer + This->stream->wri_offs_frames * This->stream->fmt->nBlockAlign;
- This->stream->getbuf_last = frames;
- }
-
- silence_buffer(This->stream, *data, frames);
-
- OSSpinLockUnlock(&This->stream->lock);
-
- return S_OK;
+ params.stream = This->stream;
+ params.frames = frames;
+ params.data = data;
+ UNIX_CALL(get_render_buffer, ¶ms);
+ return params.result;
}
static HRESULT WINAPI AudioRenderClient_ReleaseBuffer(
diff --git a/dlls/winecoreaudio.drv/unixlib.h b/dlls/winecoreaudio.drv/unixlib.h
index 450293052c7..e2ae457e705 100644
--- a/dlls/winecoreaudio.drv/unixlib.h
+++ b/dlls/winecoreaudio.drv/unixlib.h
@@ -93,6 +93,14 @@ struct reset_params
HRESULT result;
};
+struct get_render_buffer_params
+{
+ struct coreaudio_stream *stream;
+ UINT32 frames;
+ HRESULT result;
+ BYTE **data;
+};
+
struct get_mix_format_params
{
EDataFlow flow;
@@ -128,7 +136,6 @@ struct get_latency_params
struct get_current_padding_params
{
struct coreaudio_stream *stream;
- BOOL lock; /* temporary */
HRESULT result;
UINT32 *padding;
};
@@ -141,6 +148,7 @@ enum unix_funcs
unix_start,
unix_stop,
unix_reset,
+ unix_get_render_buffer,
unix_get_mix_format,
unix_is_format_supported,
unix_get_buffer_size,
More information about the wine-cvs
mailing list