From: Brendan Shanks <bshanks(a)codeweavers.com> --- dlls/winecoreaudio.drv/coreaudio.c | 78 ++++++++++++++++-------------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index 0b2f9a1e114..3299b84d489 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -43,7 +43,6 @@ #include <fenv.h> #include <unistd.h> -#include <libkern/OSAtomic.h> #include <CoreAudio/CoreAudio.h> #include <AudioToolbox/AudioFormat.h> #include <AudioToolbox/AudioConverter.h> @@ -74,13 +73,22 @@ #define kAudioObjectPropertyElementMain kAudioObjectPropertyElementMaster #endif +#if defined(MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12 +#include <os/lock.h> +#else +#include <libkern/OSAtomic.h> +typedef OSSpinLock os_unfair_lock; +#define os_unfair_lock_lock(lock) OSSpinLockLock(lock) +#define os_unfair_lock_unlock(lock) OSSpinLockUnlock(lock) +#endif + WINE_DEFAULT_DEBUG_CHANNEL(coreaudio); #define MAX_DEV_NAME_LEN 10 /* Max 32 bit digits */ struct coreaudio_stream { - OSSpinLock lock; + os_unfair_lock lock; AudioComponentInstance unit; AudioConverterRef converter; AudioStreamBasicDescription dev_desc; /* audio unit format, not necessarily the same as fmt */ @@ -377,7 +385,7 @@ static OSStatus ca_render_cb(void *user, AudioUnitRenderActionFlags *flags, struct coreaudio_stream *stream = user; UINT32 to_copy_bytes, to_copy_frames, chunk_bytes, lcl_offs_bytes; - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); if(stream->playing){ lcl_offs_bytes = stream->lcl_offs_frames * stream->fmt->nBlockAlign; @@ -401,7 +409,7 @@ static OSStatus ca_render_cb(void *user, AudioUnitRenderActionFlags *flags, if(nframes > to_copy_frames) silence_buffer(stream, ((BYTE *)data->mBuffers[0].mData) + to_copy_bytes, nframes - to_copy_frames); - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); return noErr; } @@ -434,7 +442,7 @@ static OSStatus ca_capture_cb(void *user, AudioUnitRenderActionFlags *flags, OSStatus sc; UINT32 cap_wri_offs_frames; - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); cap_wri_offs_frames = (stream->cap_offs_frames + stream->cap_held_frames) % stream->cap_bufsize_frames; @@ -455,7 +463,7 @@ static OSStatus ca_capture_cb(void *user, AudioUnitRenderActionFlags *flags, sc = AudioUnitRender(stream->unit, flags, ts, bus, nframes, &list); if(sc != noErr){ - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); return sc; } @@ -475,7 +483,7 @@ static OSStatus ca_capture_cb(void *user, AudioUnitRenderActionFlags *flags, } } - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); return noErr; } @@ -1262,9 +1270,9 @@ static NTSTATUS unix_get_buffer_size(void *args) struct get_buffer_size_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); *params->frames = stream->bufsize_frames; - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); params->result = S_OK; return STATUS_SUCCESS; } @@ -1329,7 +1337,7 @@ static NTSTATUS unix_get_latency(void *args) AudioObjectPropertyAddress addr; OSStatus sc; - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); addr.mScope = get_scope(stream->flow); addr.mSelector = kAudioDevicePropertyLatency; @@ -1339,14 +1347,14 @@ static NTSTATUS unix_get_latency(void *args) sc = AudioObjectGetPropertyData(stream->dev_id, &addr, 0, NULL, &size, &latency); if(sc != noErr){ WARN("Couldn't get _Latency property: %x\n", (int)sc); - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); params->result = osstatus_to_hresult(sc); return STATUS_SUCCESS; } params->result = ca_get_max_stream_latency(stream, &stream_latency); if(FAILED(params->result)){ - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); return STATUS_SUCCESS; } @@ -1355,7 +1363,7 @@ static NTSTATUS unix_get_latency(void *args) * the period time */ *params->latency = muldiv(latency, 10000000, stream->fmt->nSamplesPerSec) + stream->period; - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); params->result = S_OK; return STATUS_SUCCESS; } @@ -1371,9 +1379,9 @@ static NTSTATUS unix_get_current_padding(void *args) struct get_current_padding_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); *params->padding = get_current_padding_nolock(stream); - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); params->result = S_OK; return STATUS_SUCCESS; } @@ -1383,7 +1391,7 @@ static NTSTATUS unix_start(void *args) struct start_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); if((stream->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) && !stream->event) params->result = AUDCLNT_E_EVENTHANDLE_NOT_SET; @@ -1394,7 +1402,7 @@ static NTSTATUS unix_start(void *args) params->result = S_OK; } - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); return STATUS_SUCCESS; } @@ -1404,7 +1412,7 @@ static NTSTATUS unix_stop(void *args) struct stop_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); if(!stream->playing) params->result = S_FALSE; @@ -1413,7 +1421,7 @@ static NTSTATUS unix_stop(void *args) params->result = S_OK; } - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); return STATUS_SUCCESS; } @@ -1423,7 +1431,7 @@ static NTSTATUS unix_reset(void *args) struct reset_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); if(stream->playing) params->result = AUDCLNT_E_NOT_STOPPED; @@ -1442,7 +1450,7 @@ static NTSTATUS unix_reset(void *args) params->result = S_OK; } - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); return STATUS_SUCCESS; } @@ -1482,7 +1490,7 @@ static NTSTATUS unix_get_render_buffer(void *args) SIZE_T size; UINT32 pad; - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); pad = get_current_padding_nolock(stream); @@ -1527,7 +1535,7 @@ static NTSTATUS unix_get_render_buffer(void *args) params->result = S_OK; end: - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); return STATUS_SUCCESS; } @@ -1538,7 +1546,7 @@ static NTSTATUS unix_release_render_buffer(void *args) struct coreaudio_stream *stream = handle_get_stream(params->stream); BYTE *buffer; - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); if(!params->written_frames){ stream->getbuf_last = 0; @@ -1571,7 +1579,7 @@ static NTSTATUS unix_release_render_buffer(void *args) params->result = S_OK; } - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); return STATUS_SUCCESS; } @@ -1584,7 +1592,7 @@ static NTSTATUS unix_get_capture_buffer(void *args) LARGE_INTEGER stamp, freq; SIZE_T size; - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); if(stream->getbuf_last){ params->result = AUDCLNT_E_OUT_OF_ORDER; @@ -1628,7 +1636,7 @@ static NTSTATUS unix_get_capture_buffer(void *args) params->result = S_OK; end: - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); return STATUS_SUCCESS; } @@ -1637,7 +1645,7 @@ static NTSTATUS unix_release_capture_buffer(void *args) struct release_capture_buffer_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); if(!params->done){ stream->getbuf_last = 0; @@ -1655,7 +1663,7 @@ static NTSTATUS unix_release_capture_buffer(void *args) params->result = S_OK; } - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); return STATUS_SUCCESS; } @@ -1665,7 +1673,7 @@ static NTSTATUS unix_get_next_packet_size(void *args) struct get_next_packet_size_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); capture_resample(stream); @@ -1674,7 +1682,7 @@ static NTSTATUS unix_get_next_packet_size(void *args) else *params->frames = 0; - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); params->result = S_OK; return STATUS_SUCCESS; @@ -1692,7 +1700,7 @@ static NTSTATUS unix_get_position(void *args) return STATUS_SUCCESS; } - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); *params->pos = stream->written_frames - stream->held_frames; @@ -1704,7 +1712,7 @@ static NTSTATUS unix_get_position(void *args) *params->qpctime = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart; } - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); params->result = S_OK; return STATUS_SUCCESS; @@ -1785,7 +1793,7 @@ static NTSTATUS unix_set_event_handle(void *args) struct coreaudio_stream *stream = handle_get_stream(params->stream); HRESULT hr = S_OK; - OSSpinLockLock(&stream->lock); + os_unfair_lock_lock(&stream->lock); if(!stream->unit) hr = AUDCLNT_E_DEVICE_INVALIDATED; else if(!(stream->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK)) @@ -1794,7 +1802,7 @@ static NTSTATUS unix_set_event_handle(void *args) hr = HRESULT_FROM_WIN32(ERROR_INVALID_NAME); else stream->event = params->event; - OSSpinLockUnlock(&stream->lock); + os_unfair_lock_unlock(&stream->lock); params->result = hr; return STATUS_SUCCESS; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3920