From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/coreaudio.c | 30 ++++++++++++++++-------------- dlls/winecoreaudio.drv/mmdevdrv.c | 12 +++++++----- dlls/winecoreaudio.drv/unixlib.h | 6 +++--- 3 files changed, 26 insertions(+), 22 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index 2a9dcde0675..8acfefd4494 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -645,7 +645,7 @@ static NTSTATUS create_stream(void *args)
stream->period_ms = params->period / 10000; stream->period_frames = muldiv(params->period, stream->fmt->nSamplesPerSec, 10000000); - stream->dev_id = params->dev_id; + stream->dev_id = strtoul(params->device, NULL, 10); stream->flow = params->flow; stream->share = params->share;
@@ -903,6 +903,7 @@ static NTSTATUS get_mix_format(void *args) UInt32 size; OSStatus sc; int i; + const AudioDeviceID dev_id = strtoul(params->device, NULL, 10);
params->fmt->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
@@ -910,10 +911,10 @@ static NTSTATUS get_mix_format(void *args) addr.mElement = 0; addr.mSelector = kAudioDevicePropertyPreferredChannelLayout;
- sc = AudioObjectGetPropertyDataSize(params->dev_id, &addr, 0, NULL, &size); + sc = AudioObjectGetPropertyDataSize(dev_id, &addr, 0, NULL, &size); if(sc == noErr){ layout = malloc(size); - sc = AudioObjectGetPropertyData(params->dev_id, &addr, 0, NULL, &size, layout); + sc = AudioObjectGetPropertyData(dev_id, &addr, 0, NULL, &size, layout); if(sc == noErr){ TRACE("Got channel layout: {tag: 0x%x, bitmap: 0x%x, num_descs: %u}\n", (unsigned int)layout->mChannelLayoutTag, (unsigned int)layout->mChannelBitmap, @@ -942,7 +943,7 @@ static NTSTATUS get_mix_format(void *args) addr.mElement = 0; addr.mSelector = kAudioDevicePropertyStreamConfiguration;
- sc = AudioObjectGetPropertyDataSize(params->dev_id, &addr, 0, NULL, &size); + sc = AudioObjectGetPropertyDataSize(dev_id, &addr, 0, NULL, &size); if(sc != noErr){ WARN("Unable to get size for _StreamConfiguration property: %x\n", (int)sc); params->result = osstatus_to_hresult(sc); @@ -955,7 +956,7 @@ static NTSTATUS get_mix_format(void *args) return STATUS_SUCCESS; }
- sc = AudioObjectGetPropertyData(params->dev_id, &addr, 0, NULL, &size, buffers); + sc = AudioObjectGetPropertyData(dev_id, &addr, 0, NULL, &size, buffers); if(sc != noErr){ free(buffers); WARN("Unable to get _StreamConfiguration property: %x\n", (int)sc); @@ -973,7 +974,7 @@ static NTSTATUS get_mix_format(void *args)
addr.mSelector = kAudioDevicePropertyNominalSampleRate; size = sizeof(Float64); - sc = AudioObjectGetPropertyData(params->dev_id, &addr, 0, NULL, &size, &rate); + sc = AudioObjectGetPropertyData(dev_id, &addr, 0, NULL, &size, &rate); if(sc != noErr){ WARN("Unable to get _NominalSampleRate property: %x\n", (int)sc); params->result = osstatus_to_hresult(sc); @@ -1002,6 +1003,7 @@ static NTSTATUS is_format_supported(void *args) AudioStreamBasicDescription dev_desc; AudioConverterRef converter; AudioComponentInstance unit; + const AudioDeviceID dev_id = strtoul(params->device, NULL, 10);
params->result = S_OK;
@@ -1031,7 +1033,7 @@ static NTSTATUS is_format_supported(void *args) params->result = AUDCLNT_E_UNSUPPORTED_FORMAT; return STATUS_SUCCESS; } - unit = get_audiounit(params->flow, params->dev_id); + unit = get_audiounit(params->flow, dev_id);
converter = NULL; params->result = ca_setup_audiounit(params->flow, unit, params->fmt_in, &dev_desc, &converter); @@ -1046,8 +1048,8 @@ unsupported: if(params->fmt_out){ struct get_mix_format_params get_mix_params = { + .device = params->device, .flow = params->flow, - .dev_id = params->dev_id, .fmt = params->fmt_out, };
@@ -1695,7 +1697,7 @@ static NTSTATUS wow64_create_stream(void *args) { struct { - DWORD dev_id; + PTR32 device; EDataFlow flow; AUDCLNT_SHAREMODE share; REFERENCE_TIME duration; @@ -1706,7 +1708,7 @@ static NTSTATUS wow64_create_stream(void *args) } *params32 = args; struct create_stream_params params = { - .dev_id = params32->dev_id, + .device = ULongToPtr(params32->device), .flow = params32->flow, .share = params32->share, .duration = params32->duration, @@ -1773,8 +1775,8 @@ static NTSTATUS wow64_is_format_supported(void *args) { struct { + PTR32 device; EDataFlow flow; - DWORD dev_id; AUDCLNT_SHAREMODE share; PTR32 fmt_in; PTR32 fmt_out; @@ -1782,8 +1784,8 @@ static NTSTATUS wow64_is_format_supported(void *args) } *params32 = args; struct is_format_supported_params params = { + .device = ULongToPtr(params32->device), .flow = params32->flow, - .dev_id = params32->dev_id, .share = params32->share, .fmt_in = ULongToPtr(params32->fmt_in), .fmt_out = ULongToPtr(params32->fmt_out) @@ -1797,15 +1799,15 @@ static NTSTATUS wow64_get_mix_format(void *args) { struct { + PTR32 device; EDataFlow flow; - DWORD dev_id; PTR32 fmt; HRESULT result; } *params32 = args; struct get_mix_format_params params = { + .device = ULongToPtr(params32->device), .flow = params32->flow, - .dev_id = params32->dev_id, .fmt = ULongToPtr(params32->fmt) }; get_mix_format(¶ms); diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index da6c05bdc1f..404568c427b 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -47,6 +47,8 @@ unixlib_handle_t coreaudio_handle = 0;
#define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER)
+#define MAX_DEV_NAME_LEN 10 /* Max 32 bit digits */ + static const REFERENCE_TIME DefaultPeriod = 100000; static const REFERENCE_TIME MinimumPeriod = 50000;
@@ -97,7 +99,7 @@ struct ACImpl { HANDLE event; float *vols;
- DWORD dev_id; + char dev_name[MAX_DEV_NAME_LEN + 1]; HANDLE timer;
AudioSession *session; @@ -469,7 +471,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient This->parent = dev; IMMDevice_AddRef(This->parent);
- This->dev_id = dev_id; + snprintf(This->dev_name, sizeof(This->dev_name), "%lu", dev_id);
*out = (IAudioClient *)&This->IAudioClient3_iface; IAudioClient3_AddRef(&This->IAudioClient3_iface); @@ -731,7 +733,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, return AUDCLNT_E_ALREADY_INITIALIZED; }
- params.dev_id = This->dev_id; + params.device = This->dev_name; params.flow = This->dataflow; params.share = mode; params.duration = duration; @@ -849,7 +851,7 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, TRACE("(%p)->(%x, %p, %p)\n", This, mode, pwfx, outpwfx); if(pwfx) dump_fmt(pwfx);
- params.dev_id = This->dev_id; + params.device = This->dev_name; params.flow = This->dataflow; params.share = mode; params.fmt_in = pwfx; @@ -882,7 +884,7 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, return E_POINTER; *pwfx = NULL;
- params.dev_id = This->dev_id; + params.device = This->dev_name; params.flow = This->dataflow; params.fmt = CoTaskMemAlloc(sizeof(WAVEFORMATEXTENSIBLE)); if(!params.fmt) diff --git a/dlls/winecoreaudio.drv/unixlib.h b/dlls/winecoreaudio.drv/unixlib.h index 1c7dcebb52d..1c0bbe130e2 100644 --- a/dlls/winecoreaudio.drv/unixlib.h +++ b/dlls/winecoreaudio.drv/unixlib.h @@ -39,7 +39,7 @@ struct get_endpoint_ids_params
struct create_stream_params { - DWORD dev_id; + const char *device; EDataFlow flow; AUDCLNT_SHAREMODE share; REFERENCE_TIME duration; @@ -109,16 +109,16 @@ struct release_capture_buffer_params
struct get_mix_format_params { + const char *device; EDataFlow flow; - DWORD dev_id; WAVEFORMATEXTENSIBLE *fmt; HRESULT result; };
struct is_format_supported_params { + const char *device; EDataFlow flow; - DWORD dev_id; AUDCLNT_SHAREMODE share; const WAVEFORMATEX *fmt_in; WAVEFORMATEXTENSIBLE *fmt_out;