From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/coreaudio.c | 12 +++++++++--- dlls/winecoreaudio.drv/mmdevdrv.c | 9 ++++++++- dlls/winecoreaudio.drv/unixlib.h | 5 ++++- 3 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index 86b973b98eb..cd05b1d5ab1 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -645,7 +645,7 @@ static NTSTATUS unix_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;
@@ -1695,23 +1695,29 @@ static NTSTATUS unix_wow64_create_stream(void *args) { struct { - DWORD dev_id; + PTR32 name; + PTR32 device; EDataFlow flow; AUDCLNT_SHAREMODE share; + DWORD flags; REFERENCE_TIME duration; REFERENCE_TIME period; PTR32 fmt; HRESULT result; + PTR32 channel_count; PTR32 stream; } *params32 = args; struct create_stream_params params = { - .dev_id = params32->dev_id, + .name = ULongToPtr(params32->name), + .device = ULongToPtr(params32->device), .flow = params32->flow, .share = params32->share, + .flags = params32->flags, .duration = params32->duration, .period = params32->period, .fmt = ULongToPtr(params32->fmt), + .channel_count = ULongToPtr(params32->channel_count), .stream = ULongToPtr(params32->stream) }; unix_create_stream(¶ms); diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index e865296757b..c1e955712ca 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;
@@ -98,6 +100,7 @@ struct ACImpl { float *vols;
DWORD dev_id; + char dev_name[MAX_DEV_NAME_LEN + 1]; HANDLE timer;
AudioSession *session; @@ -470,6 +473,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient 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,12 +735,15 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, return AUDCLNT_E_ALREADY_INITIALIZED; }
- params.dev_id = This->dev_id; + params.name = NULL; + params.device = This->dev_name; params.flow = This->dataflow; params.share = mode; + params.flags = flags; params.duration = duration; params.period = period; params.fmt = fmt; + params.channel_count = NULL; params.stream = &stream;
UNIX_CALL(create_stream, ¶ms); diff --git a/dlls/winecoreaudio.drv/unixlib.h b/dlls/winecoreaudio.drv/unixlib.h index 66ded401cf2..de2617d8dd4 100644 --- a/dlls/winecoreaudio.drv/unixlib.h +++ b/dlls/winecoreaudio.drv/unixlib.h @@ -39,13 +39,16 @@ struct get_endpoint_ids_params
struct create_stream_params { - DWORD dev_id; + const char *name; + const char *device; EDataFlow flow; AUDCLNT_SHAREMODE share; + DWORD flags; REFERENCE_TIME duration; REFERENCE_TIME period; const WAVEFORMATEX *fmt; HRESULT result; + UINT32 *channel_count; stream_handle *stream; };