Signed-off-by: Huw Davies huw@codeweavers.com --- 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,
Signed-off-by: Andrew Eikum aeikum@codeweavers.com
On Tue, Nov 23, 2021 at 07:55:06AM +0000, Huw Davies wrote:
Signed-off-by: Huw Davies huw@codeweavers.com
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,
free(stream->fmt); params->result = S_OK; return STATUS_SUCCESS;&stream->tmp_buffer_size, MEM_RELEASE);
@@ -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,
-- 2.23.0