-- v6: winecoreaudio: Switch to mmdevapi's unixlib.h. winecoreaudio: Adapt "get_capture_buffer_params" struct to mmdevapi's. winecoreaudio: Adapt "release_render_buffer_params" struct to mmdevapi's. winecoreaudio: Adapt "release_stream_params" struct to mmdevapi's. winecoreaudio: Adapt "create_stream_params" struct to mmdevapi's. winecoreaudio: Drop "unix_" prefix in unixlib enum, apply it to the functions instead. mmdevapi: Integrate winecoreaudio's additions in unixlib.h. winecoreaudio: Switch to string as device identifier, to match other drivers.
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/coreaudio.c | 52 ++++++++++++++++++------------ dlls/winecoreaudio.drv/mmdevdrv.c | 37 +++++++++++---------- dlls/winecoreaudio.drv/unixlib.h | 8 ++--- 3 files changed, 56 insertions(+), 41 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index 2a9dcde0675..dc67ccca376 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -72,6 +72,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(coreaudio);
+#define MAX_DEV_NAME_LEN 10 /* Max 32 bit digits */ + struct coreaudio_stream { OSSpinLock lock; @@ -266,17 +268,20 @@ static NTSTATUS get_endpoint_ids(void *args) endpoint = params->endpoints;
for(i = 0; i < params->num; i++){ - SIZE_T len = CFStringGetLength(info[i].name); - needed += (len + 1) * sizeof(WCHAR); + const SIZE_T name_len = CFStringGetLength(info[i].name) + 1; + const SIZE_T device_len = MAX_DEV_NAME_LEN + 1; + needed += name_len * sizeof(WCHAR) + ((device_len + 1) & ~1);
if(needed <= params->size){ endpoint->name = offset; ptr = (UniChar *)((char *)params->endpoints + offset); - CFStringGetCharacters(info[i].name, CFRangeMake(0, len), ptr); - ptr[len] = 0; - endpoint->id = info[i].id; + CFStringGetCharacters(info[i].name, CFRangeMake(0, name_len - 1), ptr); + ptr[name_len - 1] = 0; + offset += name_len * sizeof(WCHAR); + endpoint->device = offset; + sprintf((char *)params->endpoints + offset, "%u", (unsigned int)info[i].id); + offset += (device_len + 1) & ~1; endpoint++; - offset += (len + 1) * sizeof(WCHAR); } CFRelease(info[i].name); if(info[i].id == default_id) params->default_idx = i; @@ -624,6 +629,11 @@ static ULONG_PTR zero_bits(void) #endif }
+static AudioDeviceID dev_id_from_device(const char *device) +{ + return strtoul(device, NULL, 10); +} + static NTSTATUS create_stream(void *args) { struct create_stream_params *params = args; @@ -645,7 +655,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 = dev_id_from_device(params->device); stream->flow = params->flow; stream->share = params->share;
@@ -903,6 +913,7 @@ static NTSTATUS get_mix_format(void *args) UInt32 size; OSStatus sc; int i; + const AudioDeviceID dev_id = dev_id_from_device(params->device);
params->fmt->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
@@ -910,10 +921,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 +953,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 +966,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 +984,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 +1013,7 @@ static NTSTATUS is_format_supported(void *args) AudioStreamBasicDescription dev_desc; AudioConverterRef converter; AudioComponentInstance unit; + const AudioDeviceID dev_id = dev_id_from_device(params->device);
params->result = S_OK;
@@ -1031,7 +1043,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 +1058,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 +1707,7 @@ static NTSTATUS wow64_create_stream(void *args) { struct { - DWORD dev_id; + PTR32 device; EDataFlow flow; AUDCLNT_SHAREMODE share; REFERENCE_TIME duration; @@ -1706,7 +1718,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 +1785,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 +1794,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 +1809,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..2d061db4e1b 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -97,7 +97,6 @@ struct ACImpl { HANDLE event; float *vols;
- DWORD dev_id; HANDLE timer;
AudioSession *session; @@ -105,6 +104,8 @@ struct ACImpl {
stream_handle stream; struct list entry; + + char device_name[1]; };
static const IAudioClient3Vtbl AudioClient3_Vtbl; @@ -261,7 +262,7 @@ exit: RegCloseKey(drv_key); }
-static void get_device_guid(EDataFlow flow, DWORD device_id, GUID *guid) +static void get_device_guid(EDataFlow flow, const char *dev, GUID *guid) { HKEY key = NULL, dev_key; DWORD type, size = sizeof(*guid); @@ -273,7 +274,7 @@ static void get_device_guid(EDataFlow flow, DWORD device_id, GUID *guid) key_name[0] = '0'; key_name[1] = ',';
- swprintf(key_name + 2, ARRAY_SIZE(key_name), L"%u", device_id); + MultiByteToWideChar(CP_UNIXCP, 0, dev, -1, key_name + 2, ARRAY_SIZE(key_name) - 2);
if(RegOpenKeyExW(HKEY_CURRENT_USER, drv_key_devicesW, 0, KEY_WRITE|KEY_READ, &key) == ERROR_SUCCESS){ if(RegOpenKeyExW(key, key_name, 0, KEY_READ, &dev_key) == ERROR_SUCCESS){ @@ -341,8 +342,9 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids_out, }
for(i = 0; i < params.num; i++){ - WCHAR *name = (WCHAR *)((char *)params.endpoints + params.endpoints[i].name); - int size = (wcslen(name) + 1) * sizeof(WCHAR); + const WCHAR *name = (WCHAR *)((char *)params.endpoints + params.endpoints[i].name); + const char *device = (char *)params.endpoints + params.endpoints[i].device; + const unsigned int size = (wcslen(name) + 1) * sizeof(WCHAR);
ids[i] = heap_alloc(size); if(!ids[i]){ @@ -350,7 +352,7 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids_out, goto end; } memcpy(ids[i], name, size); - get_device_guid(flow, params.endpoints[i].id, guids + i); + get_device_guid(flow, device, guids + i); } *def_index = params.default_idx;
@@ -371,7 +373,7 @@ end: return params.result; }
-static BOOL get_deviceid_by_guid(GUID *guid, DWORD *id, EDataFlow *flow) +static BOOL get_device_name_by_guid(const GUID *guid, char *name, const SIZE_T name_size, EDataFlow *flow) { HKEY devices_key; UINT i = 0; @@ -388,7 +390,7 @@ static BOOL get_deviceid_by_guid(GUID *guid, DWORD *id, EDataFlow *flow) DWORD size, type; GUID reg_guid;
- key_name_size = sizeof(key_name); + key_name_size = ARRAY_SIZE(key_name); if(RegEnumKeyExW(devices_key, i++, key_name, &key_name_size, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) break; @@ -416,7 +418,7 @@ static BOOL get_deviceid_by_guid(GUID *guid, DWORD *id, EDataFlow *flow) return FALSE; }
- *id = wcstoul(key_name + 2, NULL, 10); + WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, name, name_size, NULL, NULL);
return TRUE; } @@ -435,19 +437,21 @@ static BOOL get_deviceid_by_guid(GUID *guid, DWORD *id, EDataFlow *flow) HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) { ACImpl *This; - DWORD dev_id; + char name[256]; + SIZE_T name_len; EDataFlow dataflow; HRESULT hr;
TRACE("%s %p %p\n", debugstr_guid(guid), dev, out);
- if(!get_deviceid_by_guid(guid, &dev_id, &dataflow)) + if(!get_device_name_by_guid(guid, name, sizeof(name), &dataflow)) return AUDCLNT_E_DEVICE_INVALIDATED;
if(dataflow != eRender && dataflow != eCapture) return E_INVALIDARG;
- This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ACImpl)); + name_len = strlen(name); + This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, offsetof(ACImpl, device_name[name_len + 1])); if(!This) return E_OUTOFMEMORY;
@@ -459,6 +463,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl;
This->dataflow = dataflow; + memcpy(This->device_name, name, name_len + 1);
hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->pUnkFTMarshal); if (FAILED(hr)) { @@ -469,8 +474,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient This->parent = dev; IMMDevice_AddRef(This->parent);
- This->dev_id = dev_id; - *out = (IAudioClient *)&This->IAudioClient3_iface; IAudioClient3_AddRef(&This->IAudioClient3_iface);
@@ -731,7 +734,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, return AUDCLNT_E_ALREADY_INITIALIZED; }
- params.dev_id = This->dev_id; + params.device = This->device_name; params.flow = This->dataflow; params.share = mode; params.duration = duration; @@ -849,7 +852,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->device_name; params.flow = This->dataflow; params.share = mode; params.fmt_in = pwfx; @@ -882,7 +885,7 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, return E_POINTER; *pwfx = NULL;
- params.dev_id = This->dev_id; + params.device = This->device_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..f0b78f610d3 100644 --- a/dlls/winecoreaudio.drv/unixlib.h +++ b/dlls/winecoreaudio.drv/unixlib.h @@ -24,7 +24,7 @@ typedef UINT64 stream_handle; struct endpoint { unsigned int name; - DWORD id; + unsigned int device; };
struct get_endpoint_ids_params @@ -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;
From: Davide Beatrici git@davidebeatrici.dev
The data type for "done" was accidentally changed in e29dc33aebf4e1d4e30fd158b69338331edd3f65.
BOOL is basically the same as UINT32, but it should only be used for flags. BOOLEAN would be better for that though, as it's single-byte. --- dlls/mmdevapi/unixlib.h | 13 ++++++++++--- dlls/winealsa.drv/alsa.c | 12 ++++++++---- dlls/winealsa.drv/alsamidi.c | 6 +++--- dlls/winealsa.drv/mmdevdrv.c | 3 ++- dlls/wineoss.drv/mmdevdrv.c | 3 ++- dlls/wineoss.drv/oss.c | 12 ++++++++---- dlls/wineoss.drv/ossmidi.c | 6 +++--- dlls/winepulse.drv/mmdevdrv.c | 3 ++- dlls/winepulse.drv/pulse.c | 12 ++++++++---- 9 files changed, 46 insertions(+), 24 deletions(-)
diff --git a/dlls/mmdevapi/unixlib.h b/dlls/mmdevapi/unixlib.h index 97a35ffbc4d..ea0d2f9c4b9 100644 --- a/dlls/mmdevapi/unixlib.h +++ b/dlls/mmdevapi/unixlib.h @@ -1,6 +1,6 @@ /* * Copyright 2021 Jacek Caban for CodeWeavers - * Copyright 2022 Huw Davies + * Copyright 2021-2022 Huw Davies * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -126,7 +126,7 @@ struct get_capture_buffer_params struct release_capture_buffer_params { stream_handle stream; - BOOL done; + UINT32 done; HRESULT result; };
@@ -161,7 +161,7 @@ struct get_buffer_size_params { stream_handle stream; HRESULT result; - UINT32 *size; + UINT32 *frames; };
struct get_latency_params @@ -207,6 +207,7 @@ struct set_volumes_params float master_volume; const float *volumes; const float *session_volumes; + int channel; };
struct set_event_handle_params @@ -240,6 +241,11 @@ struct get_prop_value_params unsigned int *buffer_size; };
+struct midi_init_params +{ + UINT *err; +}; + struct notify_context { BOOL send_notify; @@ -321,6 +327,7 @@ enum unix_funcs test_connect, is_started, get_prop_value, + midi_init, midi_release, midi_out_message, midi_in_message, diff --git a/dlls/winealsa.drv/alsa.c b/dlls/winealsa.drv/alsa.c index c3daf25c85e..ffa39f5e484 100644 --- a/dlls/winealsa.drv/alsa.c +++ b/dlls/winealsa.drv/alsa.c @@ -2098,7 +2098,7 @@ static NTSTATUS alsa_get_buffer_size(void *args)
alsa_lock(stream);
- *params->size = stream->bufsize_frames; + *params->frames = stream->bufsize_frames;
return alsa_unlock_result(stream, ¶ms->result, S_OK); } @@ -2459,6 +2459,7 @@ unixlib_entry_t __wine_unix_call_funcs[] = NULL, alsa_is_started, alsa_get_prop_value, + NULL, alsa_midi_release, alsa_midi_out_message, alsa_midi_in_message, @@ -2647,12 +2648,12 @@ static NTSTATUS alsa_wow64_get_buffer_size(void *args) { stream_handle stream; HRESULT result; - PTR32 size; + PTR32 frames; } *params32 = args; struct get_buffer_size_params params = { .stream = params32->stream, - .size = ULongToPtr(params32->size) + .frames = ULongToPtr(params32->frames) }; alsa_get_buffer_size(¶ms); params32->result = params.result; @@ -2761,13 +2762,15 @@ static NTSTATUS alsa_wow64_set_volumes(void *args) float master_volume; PTR32 volumes; PTR32 session_volumes; + int channel; } *params32 = args; struct set_volumes_params params = { .stream = params32->stream, .master_volume = params32->master_volume, .volumes = ULongToPtr(params32->volumes), - .session_volumes = ULongToPtr(params32->session_volumes) + .session_volumes = ULongToPtr(params32->session_volumes), + .channel = params32->channel }; return alsa_set_volumes(¶ms); } @@ -2877,6 +2880,7 @@ unixlib_entry_t __wine_unix_call_wow64_funcs[] = NULL, alsa_is_started, alsa_wow64_get_prop_value, + NULL, alsa_midi_release, alsa_wow64_midi_out_message, alsa_wow64_midi_in_message, diff --git a/dlls/winealsa.drv/alsamidi.c b/dlls/winealsa.drv/alsamidi.c index 6fe6fee85a9..8b4207c50e1 100644 --- a/dlls/winealsa.drv/alsamidi.c +++ b/dlls/winealsa.drv/alsamidi.c @@ -414,7 +414,7 @@ static void port_add(snd_seq_client_info_t* cinfo, snd_seq_port_info_t* pinfo, u } }
-static UINT midi_init(void) +static UINT alsa_midi_init(void) { static BOOL init_done; snd_seq_client_info_t *cinfo; @@ -1398,7 +1398,7 @@ NTSTATUS alsa_midi_out_message(void *args) switch (params->msg) { case DRVM_INIT: - *params->err = midi_init(); + *params->err = alsa_midi_init(); break; case DRVM_EXIT: case DRVM_ENABLE: @@ -1456,7 +1456,7 @@ NTSTATUS alsa_midi_in_message(void *args) switch (params->msg) { case DRVM_INIT: - *params->err = midi_init(); + *params->err = alsa_midi_init(); break; case DRVM_EXIT: case DRVM_ENABLE: diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index ad322ccfa96..03499a3e40e 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -325,6 +325,7 @@ static void set_stream_volumes(ACImpl *This) params.master_volume = (This->session->mute ? 0.0f : This->session->master_vol); params.volumes = This->vols; params.session_volumes = This->session->channel_vols; + params.channel = 0;
ALSA_CALL(set_volumes, ¶ms); } @@ -801,7 +802,7 @@ static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, return AUDCLNT_E_NOT_INITIALIZED;
params.stream = This->stream; - params.size = out; + params.frames = out;
ALSA_CALL(get_buffer_size, ¶ms);
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 1b081e171b3..3bcb0f5f288 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -343,6 +343,7 @@ static void set_stream_volumes(ACImpl *This) params.master_volume = (This->session->mute ? 0.0f : This->session->master_vol); params.volumes = This->vols; params.session_volumes = This->session->channel_vols; + params.channel = 0; OSS_CALL(set_volumes, ¶ms); }
@@ -772,7 +773,7 @@ static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, return AUDCLNT_E_NOT_INITIALIZED;
params.stream = This->stream; - params.size = frames; + params.frames = frames;
OSS_CALL(get_buffer_size, ¶ms); TRACE("buffer size: %u\n", *frames); diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index 221e4e2ff71..4bc8bc20666 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -1247,7 +1247,7 @@ static NTSTATUS oss_get_buffer_size(void *args)
oss_lock(stream);
- *params->size = stream->bufsize_frames; + *params->frames = stream->bufsize_frames;
return oss_unlock_result(stream, ¶ms->result, S_OK); } @@ -1640,6 +1640,7 @@ unixlib_entry_t __wine_unix_call_funcs[] = oss_test_connect, oss_is_started, NULL, + NULL, oss_midi_release, oss_midi_out_message, oss_midi_in_message, @@ -1844,12 +1845,12 @@ static NTSTATUS oss_wow64_get_buffer_size(void *args) { stream_handle stream; HRESULT result; - PTR32 size; + PTR32 frames; } *params32 = args; struct get_buffer_size_params params = { .stream = params32->stream, - .size = ULongToPtr(params32->size) + .frames = ULongToPtr(params32->frames) }; oss_get_buffer_size(¶ms); params32->result = params.result; @@ -1958,13 +1959,15 @@ static NTSTATUS oss_wow64_set_volumes(void *args) float master_volume; PTR32 volumes; PTR32 session_volumes; + int channel; } *params32 = args; struct set_volumes_params params = { .stream = params32->stream, .master_volume = params32->master_volume, .volumes = ULongToPtr(params32->volumes), - .session_volumes = ULongToPtr(params32->session_volumes) + .session_volumes = ULongToPtr(params32->session_volumes), + .channel = params32->channel }; return oss_set_volumes(¶ms); } @@ -2041,6 +2044,7 @@ unixlib_entry_t __wine_unix_call_wow64_funcs[] = oss_wow64_test_connect, oss_is_started, NULL, + NULL, oss_midi_release, oss_wow64_midi_out_message, oss_wow64_midi_in_message, diff --git a/dlls/wineoss.drv/ossmidi.c b/dlls/wineoss.drv/ossmidi.c index f04f6212bf4..158132ca545 100644 --- a/dlls/wineoss.drv/ossmidi.c +++ b/dlls/wineoss.drv/ossmidi.c @@ -303,7 +303,7 @@ static int seq_close(int fd) return 0; }
-static UINT midi_init(void) +static UINT oss_midi_init(void) { int i, status, synth_devs = 255, midi_devs = 255, fd, len; struct synth_info sinfo; @@ -1694,7 +1694,7 @@ NTSTATUS oss_midi_out_message(void *args) switch (params->msg) { case DRVM_INIT: - *params->err = midi_init(); + *params->err = oss_midi_init(); break; case DRVM_EXIT: *params->err = midi_exit(); @@ -1754,7 +1754,7 @@ NTSTATUS oss_midi_in_message(void *args) switch (params->msg) { case DRVM_INIT: - *params->err = midi_init(); + *params->err = oss_midi_init(); break; case DRVM_EXIT: *params->err = midi_exit(); diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index d6765d4e26c..d1d9eee068b 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -370,6 +370,7 @@ static void set_stream_volumes(ACImpl *This) params.master_volume = This->session->mute ? 0.0f : This->session->master_vol; params.volumes = This->vol; params.session_volumes = This->session->channel_vols; + params.channel = 0; pulse_call(set_volumes, ¶ms); }
@@ -930,7 +931,7 @@ static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, return AUDCLNT_E_NOT_INITIALIZED;
params.stream = This->pulse_stream; - params.size = out; + params.frames = out; pulse_call(get_buffer_size, ¶ms); return params.result; } diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c index cbd9b3b97ae..41d988e692b 100644 --- a/dlls/winepulse.drv/pulse.c +++ b/dlls/winepulse.drv/pulse.c @@ -2095,7 +2095,7 @@ static NTSTATUS pulse_get_buffer_size(void *args) if (!pulse_stream_valid(stream)) params->result = AUDCLNT_E_DEVICE_INVALIDATED; else - *params->size = stream->bufsize_frames; + *params->frames = stream->bufsize_frames; pulse_unlock();
return STATUS_SUCCESS; @@ -2393,6 +2393,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = NULL, NULL, NULL, + NULL, };
#ifdef _WIN64 @@ -2587,12 +2588,12 @@ static NTSTATUS pulse_wow64_get_buffer_size(void *args) { stream_handle stream; HRESULT result; - PTR32 size; + PTR32 frames; } *params32 = args; struct get_buffer_size_params params = { .stream = params32->stream, - .size = ULongToPtr(params32->size) + .frames = ULongToPtr(params32->frames) }; pulse_get_buffer_size(¶ms); params32->result = params.result; @@ -2701,13 +2702,15 @@ static NTSTATUS pulse_wow64_set_volumes(void *args) float master_volume; PTR32 volumes; PTR32 session_volumes; + int channel; } *params32 = args; struct set_volumes_params params = { .stream = params32->stream, .master_volume = params32->master_volume, .volumes = ULongToPtr(params32->volumes), - .session_volumes = ULongToPtr(params32->session_volumes) + .session_volumes = ULongToPtr(params32->session_volumes), + .channel = params32->channel }; return pulse_set_volumes(¶ms); } @@ -2837,6 +2840,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = NULL, NULL, NULL, + NULL, };
#endif /* _WIN64 */
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/coreaudio.c | 194 ++++++++++++++--------------- dlls/winecoreaudio.drv/coremidi.c | 26 ++-- dlls/winecoreaudio.drv/unixlib.h | 70 +++++------ 3 files changed, 145 insertions(+), 145 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index dc67ccca376..e3e697dad88 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -184,7 +184,7 @@ static BOOL device_has_channels(AudioDeviceID device, EDataFlow flow) return ret; }
-static NTSTATUS get_endpoint_ids(void *args) +static NTSTATUS unix_get_endpoint_ids(void *args) { struct get_endpoint_ids_params *params = args; unsigned int num_devices, i, needed, offset; @@ -634,7 +634,7 @@ static AudioDeviceID dev_id_from_device(const char *device) return strtoul(device, NULL, 10); }
-static NTSTATUS create_stream(void *args) +static NTSTATUS unix_create_stream(void *args) { struct create_stream_params *params = args; struct coreaudio_stream *stream = calloc(1, sizeof(*stream)); @@ -729,7 +729,7 @@ end: return STATUS_SUCCESS; }
-static NTSTATUS release_stream( void *args ) +static NTSTATUS unix_release_stream( void *args ) { struct release_stream_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -903,7 +903,7 @@ static DWORD get_channel_mask(unsigned int channels) return 0; }
-static NTSTATUS get_mix_format(void *args) +static NTSTATUS unix_get_mix_format(void *args) { struct get_mix_format_params *params = args; AudioObjectPropertyAddress addr; @@ -1006,7 +1006,7 @@ static NTSTATUS get_mix_format(void *args) return STATUS_SUCCESS; }
-static NTSTATUS is_format_supported(void *args) +static NTSTATUS unix_is_format_supported(void *args) { struct is_format_supported_params *params = args; const WAVEFORMATEXTENSIBLE *fmtex = (const WAVEFORMATEXTENSIBLE *)params->fmt_in; @@ -1063,7 +1063,7 @@ unsupported: .fmt = params->fmt_out, };
- get_mix_format(&get_mix_params); + unix_get_mix_format(&get_mix_params); params->result = get_mix_params.result; if(SUCCEEDED(params->result)) params->result = S_FALSE; } @@ -1171,7 +1171,7 @@ static void capture_resample(struct coreaudio_stream *stream) } }
-static NTSTATUS get_buffer_size(void *args) +static NTSTATUS unix_get_buffer_size(void *args) { struct get_buffer_size_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -1235,7 +1235,7 @@ static HRESULT ca_get_max_stream_latency(struct coreaudio_stream *stream, UInt32 return S_OK; }
-static NTSTATUS get_latency(void *args) +static NTSTATUS unix_get_latency(void *args) { struct get_latency_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -1281,7 +1281,7 @@ static UINT32 get_current_padding_nolock(struct coreaudio_stream *stream) return stream->held_frames; }
-static NTSTATUS get_current_padding(void *args) +static NTSTATUS unix_get_current_padding(void *args) { struct get_current_padding_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -1293,7 +1293,7 @@ static NTSTATUS get_current_padding(void *args) return STATUS_SUCCESS; }
-static NTSTATUS start(void *args) +static NTSTATUS unix_start(void *args) { struct start_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -1312,7 +1312,7 @@ static NTSTATUS start(void *args) return STATUS_SUCCESS; }
-static NTSTATUS stop(void *args) +static NTSTATUS unix_stop(void *args) { struct stop_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -1331,7 +1331,7 @@ static NTSTATUS stop(void *args) return STATUS_SUCCESS; }
-static NTSTATUS reset(void *args) +static NTSTATUS unix_reset(void *args) { struct reset_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -1359,7 +1359,7 @@ static NTSTATUS reset(void *args) return STATUS_SUCCESS; }
-static NTSTATUS get_render_buffer(void *args) +static NTSTATUS unix_get_render_buffer(void *args) { struct get_render_buffer_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -1416,7 +1416,7 @@ end: return STATUS_SUCCESS; }
-static NTSTATUS release_render_buffer(void *args) +static NTSTATUS unix_release_render_buffer(void *args) { struct release_render_buffer_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -1460,7 +1460,7 @@ static NTSTATUS release_render_buffer(void *args) return STATUS_SUCCESS; }
-static NTSTATUS get_capture_buffer(void *args) +static NTSTATUS unix_get_capture_buffer(void *args) { struct get_capture_buffer_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -1516,7 +1516,7 @@ end: return STATUS_SUCCESS; }
-static NTSTATUS release_capture_buffer(void *args) +static NTSTATUS unix_release_capture_buffer(void *args) { struct release_capture_buffer_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -1544,7 +1544,7 @@ static NTSTATUS release_capture_buffer(void *args) return STATUS_SUCCESS; }
-static NTSTATUS get_next_packet_size(void *args) +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); @@ -1564,7 +1564,7 @@ static NTSTATUS get_next_packet_size(void *args) return STATUS_SUCCESS; }
-static NTSTATUS get_position(void *args) +static NTSTATUS unix_get_position(void *args) { struct get_position_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -1588,7 +1588,7 @@ static NTSTATUS get_position(void *args) return STATUS_SUCCESS; }
-static NTSTATUS get_frequency(void *args) +static NTSTATUS unix_get_frequency(void *args) { struct get_frequency_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -1602,7 +1602,7 @@ static NTSTATUS get_frequency(void *args) return STATUS_SUCCESS; }
-static NTSTATUS is_started(void *args) +static NTSTATUS unix_is_started(void *args) { struct is_started_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -1615,7 +1615,7 @@ static NTSTATUS is_started(void *args) return STATUS_SUCCESS; }
-static NTSTATUS set_volumes(void *args) +static NTSTATUS unix_set_volumes(void *args) { struct set_volumes_params *params = args; struct coreaudio_stream *stream = handle_get_stream(params->stream); @@ -1647,38 +1647,38 @@ static NTSTATUS set_volumes(void *args)
unixlib_entry_t __wine_unix_call_funcs[] = { - get_endpoint_ids, - create_stream, - release_stream, - start, - stop, - reset, - get_render_buffer, - release_render_buffer, - get_capture_buffer, - release_capture_buffer, - get_mix_format, - is_format_supported, - get_buffer_size, - get_latency, - get_current_padding, - get_next_packet_size, - get_position, - get_frequency, - is_started, - set_volumes, - midi_init, - midi_release, - midi_out_message, - midi_in_message, - midi_notify_wait, + unix_get_endpoint_ids, + unix_create_stream, + unix_release_stream, + unix_start, + unix_stop, + unix_reset, + unix_get_render_buffer, + unix_release_render_buffer, + unix_get_capture_buffer, + unix_release_capture_buffer, + unix_get_mix_format, + unix_is_format_supported, + unix_get_buffer_size, + unix_get_latency, + unix_get_current_padding, + unix_get_next_packet_size, + unix_get_position, + unix_get_frequency, + unix_is_started, + unix_set_volumes, + unix_midi_init, + unix_midi_release, + unix_midi_out_message, + unix_midi_in_message, + unix_midi_notify_wait, };
#ifdef _WIN64
typedef UINT PTR32;
-static NTSTATUS wow64_get_endpoint_ids(void *args) +static NTSTATUS unix_wow64_get_endpoint_ids(void *args) { struct { @@ -1695,7 +1695,7 @@ static NTSTATUS wow64_get_endpoint_ids(void *args) .endpoints = ULongToPtr(params32->endpoints), .size = params32->size }; - get_endpoint_ids(¶ms); + unix_get_endpoint_ids(¶ms); params32->size = params.size; params32->result = params.result; params32->num = params.num; @@ -1703,7 +1703,7 @@ static NTSTATUS wow64_get_endpoint_ids(void *args) return STATUS_SUCCESS; }
-static NTSTATUS wow64_create_stream(void *args) +static NTSTATUS unix_wow64_create_stream(void *args) { struct { @@ -1726,12 +1726,12 @@ static NTSTATUS wow64_create_stream(void *args) .fmt = ULongToPtr(params32->fmt), .stream = ULongToPtr(params32->stream) }; - create_stream(¶ms); + unix_create_stream(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_render_buffer(void *args) +static NTSTATUS unix_wow64_get_render_buffer(void *args) { struct { @@ -1747,13 +1747,13 @@ static NTSTATUS wow64_get_render_buffer(void *args) .frames = params32->frames, .data = &data }; - get_render_buffer(¶ms); + unix_get_render_buffer(¶ms); params32->result = params.result; *(unsigned int *)ULongToPtr(params32->data) = PtrToUlong(data); return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_capture_buffer(void *args) +static NTSTATUS unix_wow64_get_capture_buffer(void *args) { struct { @@ -1775,13 +1775,13 @@ static NTSTATUS wow64_get_capture_buffer(void *args) .devpos = ULongToPtr(params32->devpos), .qpcpos = ULongToPtr(params32->qpcpos) }; - get_capture_buffer(¶ms); + unix_get_capture_buffer(¶ms); params32->result = params.result; *(unsigned int *)ULongToPtr(params32->data) = PtrToUlong(data); return STATUS_SUCCESS; };
-static NTSTATUS wow64_is_format_supported(void *args) +static NTSTATUS unix_wow64_is_format_supported(void *args) { struct { @@ -1800,12 +1800,12 @@ static NTSTATUS wow64_is_format_supported(void *args) .fmt_in = ULongToPtr(params32->fmt_in), .fmt_out = ULongToPtr(params32->fmt_out) }; - is_format_supported(¶ms); + unix_is_format_supported(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_mix_format(void *args) +static NTSTATUS unix_wow64_get_mix_format(void *args) { struct { @@ -1820,12 +1820,12 @@ static NTSTATUS wow64_get_mix_format(void *args) .flow = params32->flow, .fmt = ULongToPtr(params32->fmt) }; - get_mix_format(¶ms); + unix_get_mix_format(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_buffer_size(void *args) +static NTSTATUS unix_wow64_get_buffer_size(void *args) { struct { @@ -1838,12 +1838,12 @@ static NTSTATUS wow64_get_buffer_size(void *args) .stream = params32->stream, .frames = ULongToPtr(params32->frames) }; - get_buffer_size(¶ms); + unix_get_buffer_size(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_latency(void *args) +static NTSTATUS unix_wow64_get_latency(void *args) { struct { @@ -1856,12 +1856,12 @@ static NTSTATUS wow64_get_latency(void *args) .stream = params32->stream, .latency = ULongToPtr(params32->latency) }; - get_latency(¶ms); + unix_get_latency(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_current_padding(void *args) +static NTSTATUS unix_wow64_get_current_padding(void *args) { struct { @@ -1874,12 +1874,12 @@ static NTSTATUS wow64_get_current_padding(void *args) .stream = params32->stream, .padding = ULongToPtr(params32->padding) }; - get_current_padding(¶ms); + unix_get_current_padding(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_next_packet_size(void *args) +static NTSTATUS unix_wow64_get_next_packet_size(void *args) { struct { @@ -1892,12 +1892,12 @@ static NTSTATUS wow64_get_next_packet_size(void *args) .stream = params32->stream, .frames = ULongToPtr(params32->frames) }; - get_next_packet_size(¶ms); + unix_get_next_packet_size(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_position(void *args) +static NTSTATUS unix_wow64_get_position(void *args) { struct { @@ -1912,12 +1912,12 @@ static NTSTATUS wow64_get_position(void *args) .pos = ULongToPtr(params32->pos), .qpctime = ULongToPtr(params32->qpctime) }; - get_position(¶ms); + unix_get_position(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_frequency(void *args) +static NTSTATUS unix_wow64_get_frequency(void *args) { struct { @@ -1930,12 +1930,12 @@ static NTSTATUS wow64_get_frequency(void *args) .stream = params32->stream, .freq = ULongToPtr(params32->freq) }; - get_frequency(¶ms); + unix_get_frequency(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_set_volumes(void *args) +static NTSTATUS unix_wow64_set_volumes(void *args) { struct { @@ -1953,36 +1953,36 @@ static NTSTATUS wow64_set_volumes(void *args) .session_volumes = ULongToPtr(params32->session_volumes), .channel = params32->channel }; - return set_volumes(¶ms); + return unix_set_volumes(¶ms); }
unixlib_entry_t __wine_unix_call_wow64_funcs[] = { - wow64_get_endpoint_ids, - wow64_create_stream, - release_stream, - start, - stop, - reset, - wow64_get_render_buffer, - release_render_buffer, - wow64_get_capture_buffer, - release_capture_buffer, - wow64_get_mix_format, - wow64_is_format_supported, - wow64_get_buffer_size, - wow64_get_latency, - wow64_get_current_padding, - wow64_get_next_packet_size, - wow64_get_position, - wow64_get_frequency, - is_started, - wow64_set_volumes, - wow64_midi_init, - midi_release, - wow64_midi_out_message, - wow64_midi_in_message, - wow64_midi_notify_wait, + unix_wow64_get_endpoint_ids, + unix_wow64_create_stream, + unix_release_stream, + unix_start, + unix_stop, + unix_reset, + unix_wow64_get_render_buffer, + unix_release_render_buffer, + unix_wow64_get_capture_buffer, + unix_release_capture_buffer, + unix_wow64_get_mix_format, + unix_wow64_is_format_supported, + unix_wow64_get_buffer_size, + unix_wow64_get_latency, + unix_wow64_get_current_padding, + unix_wow64_get_next_packet_size, + unix_wow64_get_position, + unix_wow64_get_frequency, + unix_is_started, + unix_wow64_set_volumes, + unix_wow64_midi_init, + unix_midi_release, + unix_wow64_midi_out_message, + unix_wow64_midi_in_message, + unix_wow64_midi_notify_wait, };
#endif /* _WIN64 */ diff --git a/dlls/winecoreaudio.drv/coremidi.c b/dlls/winecoreaudio.drv/coremidi.c index 445b760be76..c9b377f68b0 100644 --- a/dlls/winecoreaudio.drv/coremidi.c +++ b/dlls/winecoreaudio.drv/coremidi.c @@ -308,7 +308,7 @@ static void midi_in_read_proc(const MIDIPacketList *pktlist, void *refCon, void } }
-NTSTATUS midi_init(void *args) +NTSTATUS unix_midi_init(void *args) { CFStringRef name = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("wineMIDIClient.%d"), getpid()); struct midi_init_params *params = args; @@ -422,7 +422,7 @@ NTSTATUS midi_init(void *args) return STATUS_SUCCESS; }
-NTSTATUS midi_release(void *args) +NTSTATUS unix_midi_release(void *args) { /* stop the notify_wait thread */ notify_post(NULL); @@ -1122,7 +1122,7 @@ static UINT midi_in_reset(WORD dev_id, struct notify_context *notify) return err; }
-NTSTATUS midi_out_message(void *args) +NTSTATUS unix_midi_out_message(void *args) { struct midi_out_message_params *params = args;
@@ -1177,7 +1177,7 @@ NTSTATUS midi_out_message(void *args) return STATUS_SUCCESS; }
-NTSTATUS midi_in_message(void *args) +NTSTATUS unix_midi_in_message(void *args) { struct midi_in_message_params *params = args;
@@ -1229,7 +1229,7 @@ NTSTATUS midi_in_message(void *args) return STATUS_SUCCESS; }
-NTSTATUS midi_notify_wait(void *args) +NTSTATUS unix_midi_notify_wait(void *args) { struct midi_notify_wait_params *params = args;
@@ -1250,7 +1250,7 @@ NTSTATUS midi_notify_wait(void *args)
typedef UINT PTR32;
-NTSTATUS wow64_midi_init(void *args) +NTSTATUS unix_wow64_midi_init(void *args) { struct { @@ -1260,7 +1260,7 @@ NTSTATUS wow64_midi_init(void *args) { .err = ULongToPtr(params32->err) }; - return midi_init(¶ms); + return unix_midi_init(¶ms); }
struct notify_context32 @@ -1343,7 +1343,7 @@ static UINT wow64_midi_out_unprepare(WORD dev_id, struct midi_hdr32 *hdr, UINT h return MMSYSERR_NOERROR; }
-NTSTATUS wow64_midi_out_message(void *args) +NTSTATUS unix_wow64_midi_out_message(void *args) { struct { @@ -1414,7 +1414,7 @@ NTSTATUS wow64_midi_out_message(void *args) return STATUS_SUCCESS; }
- midi_out_message(¶ms); + unix_midi_out_message(¶ms);
switch (params32->msg) { @@ -1467,7 +1467,7 @@ static UINT wow64_midi_in_unprepare(WORD dev_id, struct midi_hdr32 *hdr, UINT hd return MMSYSERR_NOERROR; }
-NTSTATUS wow64_midi_in_message(void *args) +NTSTATUS unix_wow64_midi_in_message(void *args) { struct { @@ -1539,7 +1539,7 @@ NTSTATUS wow64_midi_in_message(void *args) return STATUS_SUCCESS; }
- midi_in_message(¶ms); + unix_midi_in_message(¶ms);
switch (params32->msg) { @@ -1574,7 +1574,7 @@ NTSTATUS wow64_midi_in_message(void *args) return STATUS_SUCCESS; }
-NTSTATUS wow64_midi_notify_wait(void *args) +NTSTATUS unix_wow64_midi_notify_wait(void *args) { struct { @@ -1592,7 +1592,7 @@ NTSTATUS wow64_midi_notify_wait(void *args) }; notify32->send_notify = FALSE;
- midi_notify_wait(¶ms); + unix_midi_notify_wait(¶ms);
if (!*params.quit && notify.send_notify) { diff --git a/dlls/winecoreaudio.drv/unixlib.h b/dlls/winecoreaudio.drv/unixlib.h index f0b78f610d3..a01999daffd 100644 --- a/dlls/winecoreaudio.drv/unixlib.h +++ b/dlls/winecoreaudio.drv/unixlib.h @@ -231,46 +231,46 @@ struct midi_notify_wait_params
enum unix_funcs { - unix_get_endpoint_ids, - unix_create_stream, - unix_release_stream, - unix_start, - unix_stop, - unix_reset, - unix_get_render_buffer, - unix_release_render_buffer, - unix_get_capture_buffer, - unix_release_capture_buffer, - unix_get_mix_format, - unix_is_format_supported, - unix_get_buffer_size, - unix_get_latency, - unix_get_current_padding, - unix_get_next_packet_size, - unix_get_position, - unix_get_frequency, - unix_is_started, - unix_set_volumes, - unix_midi_init, - unix_midi_release, - unix_midi_out_message, - unix_midi_in_message, - unix_midi_notify_wait, + get_endpoint_ids, + create_stream, + release_stream, + start, + stop, + reset, + get_render_buffer, + release_render_buffer, + get_capture_buffer, + release_capture_buffer, + get_mix_format, + is_format_supported, + get_buffer_size, + get_latency, + get_current_padding, + get_next_packet_size, + get_position, + get_frequency, + is_started, + set_volumes, + midi_init, + midi_release, + midi_out_message, + midi_in_message, + midi_notify_wait, };
-NTSTATUS midi_init( void * ) DECLSPEC_HIDDEN; -NTSTATUS midi_release( void * ) DECLSPEC_HIDDEN; -NTSTATUS midi_out_message( void * ) DECLSPEC_HIDDEN; -NTSTATUS midi_in_message( void * ) DECLSPEC_HIDDEN; -NTSTATUS midi_notify_wait( void * ) DECLSPEC_HIDDEN; +NTSTATUS unix_midi_init( void * ) DECLSPEC_HIDDEN; +NTSTATUS unix_midi_release( void * ) DECLSPEC_HIDDEN; +NTSTATUS unix_midi_out_message( void * ) DECLSPEC_HIDDEN; +NTSTATUS unix_midi_in_message( void * ) DECLSPEC_HIDDEN; +NTSTATUS unix_midi_notify_wait( void * ) DECLSPEC_HIDDEN;
#ifdef _WIN64 -NTSTATUS wow64_midi_init(void *args) DECLSPEC_HIDDEN; -NTSTATUS wow64_midi_out_message(void *args) DECLSPEC_HIDDEN; -NTSTATUS wow64_midi_in_message(void *args) DECLSPEC_HIDDEN; -NTSTATUS wow64_midi_notify_wait(void *args) DECLSPEC_HIDDEN; +NTSTATUS unix_wow64_midi_init(void *args) DECLSPEC_HIDDEN; +NTSTATUS unix_wow64_midi_out_message(void *args) DECLSPEC_HIDDEN; +NTSTATUS unix_wow64_midi_in_message(void *args) DECLSPEC_HIDDEN; +NTSTATUS unix_wow64_midi_notify_wait(void *args) DECLSPEC_HIDDEN; #endif
extern unixlib_handle_t coreaudio_handle;
-#define UNIX_CALL( func, params ) __wine_unix_call( coreaudio_handle, unix_ ## func, params ) +#define UNIX_CALL( func, params ) __wine_unix_call( coreaudio_handle, func, params )
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/coreaudio.c | 6 ++++++ dlls/winecoreaudio.drv/mmdevdrv.c | 3 +++ dlls/winecoreaudio.drv/unixlib.h | 3 +++ 3 files changed, 12 insertions(+)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index e3e697dad88..4f469b582ce 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -1707,23 +1707,29 @@ static NTSTATUS unix_wow64_create_stream(void *args) { struct { + 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 = { + .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 2d061db4e1b..79d617650f4 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -734,12 +734,15 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, return AUDCLNT_E_ALREADY_INITIALIZED; }
+ params.name = NULL; params.device = This->device_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 a01999daffd..2c22eef5cc4 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 { + 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; };
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/coreaudio.c | 20 +++++++++++++++++++- dlls/winecoreaudio.drv/mmdevdrv.c | 1 + dlls/winecoreaudio.drv/unixlib.h | 1 + 3 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index 4f469b582ce..25e74cc2712 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -1737,6 +1737,24 @@ static NTSTATUS unix_wow64_create_stream(void *args) return STATUS_SUCCESS; }
+static NTSTATUS unix_wow64_release_stream(void *args) +{ + struct + { + stream_handle stream; + PTR32 timer_thread; + HRESULT result; + } *params32 = args; + struct release_stream_params params = + { + .stream = params32->stream, + .timer_thread = ULongToHandle(params32->timer_thread) + }; + unix_release_stream(¶ms); + params32->result = params.result; + return STATUS_SUCCESS; +} + static NTSTATUS unix_wow64_get_render_buffer(void *args) { struct @@ -1966,7 +1984,7 @@ unixlib_entry_t __wine_unix_call_wow64_funcs[] = { unix_wow64_get_endpoint_ids, unix_wow64_create_stream, - unix_release_stream, + unix_wow64_release_stream, unix_start, unix_stop, unix_reset, diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index 79d617650f4..c6a31d2480b 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -535,6 +535,7 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) } if(This->stream){ params.stream = This->stream; + params.timer_thread = NULL; UNIX_CALL(release_stream, ¶ms); } if(This->session){ diff --git a/dlls/winecoreaudio.drv/unixlib.h b/dlls/winecoreaudio.drv/unixlib.h index 2c22eef5cc4..50e224e4c26 100644 --- a/dlls/winecoreaudio.drv/unixlib.h +++ b/dlls/winecoreaudio.drv/unixlib.h @@ -55,6 +55,7 @@ struct create_stream_params struct release_stream_params { stream_handle stream; + HANDLE timer_thread; HRESULT result; };
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/coreaudio.c | 14 +++++++------- dlls/winecoreaudio.drv/mmdevdrv.c | 2 +- dlls/winecoreaudio.drv/unixlib.h | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index 25e74cc2712..bfc637958bb 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -1424,12 +1424,12 @@ static NTSTATUS unix_release_render_buffer(void *args)
OSSpinLockLock(&stream->lock);
- if(!params->frames){ + if(!params->written_frames){ stream->getbuf_last = 0; params->result = S_OK; }else if(!stream->getbuf_last) params->result = AUDCLNT_E_OUT_OF_ORDER; - else if(params->frames > (stream->getbuf_last >= 0 ? stream->getbuf_last : -stream->getbuf_last)) + else if(params->written_frames > (stream->getbuf_last >= 0 ? stream->getbuf_last : -stream->getbuf_last)) params->result = AUDCLNT_E_INVALID_SIZE; else{ if(stream->getbuf_last >= 0) @@ -1438,18 +1438,18 @@ static NTSTATUS unix_release_render_buffer(void *args) buffer = stream->tmp_buffer;
if(params->flags & AUDCLNT_BUFFERFLAGS_SILENT) - silence_buffer(stream, buffer, params->frames); + silence_buffer(stream, buffer, params->written_frames);
if(stream->getbuf_last < 0) ca_wrap_buffer(stream->local_buffer, stream->wri_offs_frames * stream->fmt->nBlockAlign, stream->bufsize_frames * stream->fmt->nBlockAlign, - buffer, params->frames * stream->fmt->nBlockAlign); + buffer, params->written_frames * stream->fmt->nBlockAlign);
- stream->wri_offs_frames += params->frames; + stream->wri_offs_frames += params->written_frames; stream->wri_offs_frames %= stream->bufsize_frames; - stream->held_frames += params->frames; - stream->written_frames += params->frames; + stream->held_frames += params->written_frames; + stream->written_frames += params->written_frames; stream->getbuf_last = 0;
params->result = S_OK; diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index c6a31d2480b..03250a61cf7 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -1285,7 +1285,7 @@ static HRESULT WINAPI AudioRenderClient_ReleaseBuffer( TRACE("(%p)->(%u, %lx)\n", This, frames, flags);
params.stream = This->stream; - params.frames = frames; + params.written_frames = frames; params.flags = flags; UNIX_CALL(release_render_buffer, ¶ms); return params.result; diff --git a/dlls/winecoreaudio.drv/unixlib.h b/dlls/winecoreaudio.drv/unixlib.h index 50e224e4c26..603796e9510 100644 --- a/dlls/winecoreaudio.drv/unixlib.h +++ b/dlls/winecoreaudio.drv/unixlib.h @@ -88,8 +88,8 @@ struct get_render_buffer_params struct release_render_buffer_params { stream_handle stream; - UINT32 frames; - DWORD flags; + UINT32 written_frames; + UINT flags; HRESULT result; };
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/mmdevdrv.c | 2 +- dlls/winecoreaudio.drv/unixlib.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index 03250a61cf7..8902356d1e0 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -1357,7 +1357,7 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface, params.stream = This->stream; params.data = data; params.frames = frames; - params.flags = flags; + params.flags = (UINT *)flags; params.devpos = devpos; params.qpcpos = qpcpos; UNIX_CALL(get_capture_buffer, ¶ms); diff --git a/dlls/winecoreaudio.drv/unixlib.h b/dlls/winecoreaudio.drv/unixlib.h index 603796e9510..b91f90496d5 100644 --- a/dlls/winecoreaudio.drv/unixlib.h +++ b/dlls/winecoreaudio.drv/unixlib.h @@ -99,7 +99,7 @@ struct get_capture_buffer_params HRESULT result; BYTE **data; UINT32 *frames; - DWORD *flags; + UINT *flags; UINT64 *devpos; UINT64 *qpcpos; };
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/coreaudio.c | 30 +++- dlls/winecoreaudio.drv/mmdevdrv.c | 8 - dlls/winecoreaudio.drv/unixlib.h | 244 +---------------------------- 3 files changed, 25 insertions(+), 257 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index bfc637958bb..b48a0c751fd 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -1647,31 +1647,40 @@ static NTSTATUS unix_set_volumes(void *args)
unixlib_entry_t __wine_unix_call_funcs[] = { + NULL, + NULL, + NULL, unix_get_endpoint_ids, unix_create_stream, unix_release_stream, unix_start, unix_stop, unix_reset, + NULL, unix_get_render_buffer, unix_release_render_buffer, unix_get_capture_buffer, unix_release_capture_buffer, - unix_get_mix_format, unix_is_format_supported, + unix_get_mix_format, + NULL, unix_get_buffer_size, unix_get_latency, unix_get_current_padding, unix_get_next_packet_size, - unix_get_position, unix_get_frequency, - unix_is_started, + unix_get_position, unix_set_volumes, + NULL, + NULL, + unix_is_started, + NULL, unix_midi_init, unix_midi_release, unix_midi_out_message, unix_midi_in_message, unix_midi_notify_wait, + NULL, };
#ifdef _WIN64 @@ -1982,31 +1991,40 @@ static NTSTATUS unix_wow64_set_volumes(void *args)
unixlib_entry_t __wine_unix_call_wow64_funcs[] = { + NULL, + NULL, + NULL, unix_wow64_get_endpoint_ids, unix_wow64_create_stream, unix_wow64_release_stream, unix_start, unix_stop, unix_reset, + NULL, unix_wow64_get_render_buffer, unix_release_render_buffer, unix_wow64_get_capture_buffer, unix_release_capture_buffer, - unix_wow64_get_mix_format, unix_wow64_is_format_supported, + unix_wow64_get_mix_format, + NULL, unix_wow64_get_buffer_size, unix_wow64_get_latency, unix_wow64_get_current_padding, unix_wow64_get_next_packet_size, - unix_wow64_get_position, unix_wow64_get_frequency, - unix_is_started, + unix_wow64_get_position, unix_wow64_set_volumes, + NULL, + NULL, + unix_is_started, + NULL, unix_wow64_midi_init, unix_midi_release, unix_wow64_midi_out_message, unix_wow64_midi_in_message, unix_wow64_midi_notify_wait, + NULL, };
#endif /* _WIN64 */ diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index 8902356d1e0..5d8a9654a3a 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -214,14 +214,6 @@ BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) return TRUE; }
-/* From <dlls/mmdevapi/mmdevapi.h> */ -enum DriverPriority { - Priority_Unavailable = 0, - Priority_Low, - Priority_Neutral, - Priority_Preferred -}; - int WINAPI AUDDRV_GetPriority(void) { return Priority_Neutral; diff --git a/dlls/winecoreaudio.drv/unixlib.h b/dlls/winecoreaudio.drv/unixlib.h index b91f90496d5..caa352d2dfa 100644 --- a/dlls/winecoreaudio.drv/unixlib.h +++ b/dlls/winecoreaudio.drv/unixlib.h @@ -17,250 +17,8 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "mmddk.h"
-typedef UINT64 stream_handle; - -struct endpoint -{ - unsigned int name; - unsigned int device; -}; - -struct get_endpoint_ids_params -{ - EDataFlow flow; - struct endpoint *endpoints; - unsigned int size; - HRESULT result; - unsigned int num; - unsigned int default_idx; -}; - -struct create_stream_params -{ - 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; -}; - -struct release_stream_params -{ - stream_handle stream; - HANDLE timer_thread; - HRESULT result; -}; - -struct start_params -{ - stream_handle stream; - HRESULT result; -}; - -struct stop_params -{ - stream_handle stream; - HRESULT result; -}; - -struct reset_params -{ - stream_handle stream; - HRESULT result; -}; - -struct get_render_buffer_params -{ - stream_handle stream; - UINT32 frames; - HRESULT result; - BYTE **data; -}; - -struct release_render_buffer_params -{ - stream_handle stream; - UINT32 written_frames; - UINT flags; - HRESULT result; -}; - -struct get_capture_buffer_params -{ - stream_handle stream; - HRESULT result; - BYTE **data; - UINT32 *frames; - UINT *flags; - UINT64 *devpos; - UINT64 *qpcpos; -}; - -struct release_capture_buffer_params -{ - stream_handle stream; - UINT32 done; - HRESULT result; -}; - -struct get_mix_format_params -{ - const char *device; - EDataFlow flow; - WAVEFORMATEXTENSIBLE *fmt; - HRESULT result; -}; - -struct is_format_supported_params -{ - const char *device; - EDataFlow flow; - AUDCLNT_SHAREMODE share; - const WAVEFORMATEX *fmt_in; - WAVEFORMATEXTENSIBLE *fmt_out; - HRESULT result; -}; - -struct get_buffer_size_params -{ - stream_handle stream; - HRESULT result; - UINT32 *frames; -}; - -struct get_latency_params -{ - stream_handle stream; - HRESULT result; - REFERENCE_TIME *latency; -}; - -struct get_current_padding_params -{ - stream_handle stream; - HRESULT result; - UINT32 *padding; -}; - -struct get_next_packet_size_params -{ - stream_handle stream; - HRESULT result; - UINT32 *frames; -}; - -struct get_position_params -{ - stream_handle stream; - HRESULT result; - UINT64 *pos; - UINT64 *qpctime; -}; - -struct get_frequency_params -{ - stream_handle stream; - HRESULT result; - UINT64 *freq; -}; - -struct is_started_params -{ - stream_handle stream; - HRESULT result; -}; - -struct set_volumes_params -{ - stream_handle stream; - float master_volume; - const float *volumes; - const float *session_volumes; - int channel; -}; - -struct midi_init_params -{ - UINT *err; -}; - -struct notify_context -{ - BOOL send_notify; - WORD dev_id; - WORD msg; - UINT_PTR param_1; - UINT_PTR param_2; - UINT_PTR callback; - UINT flags; - HANDLE device; - UINT_PTR instance; -}; - -struct midi_out_message_params -{ - UINT dev_id; - UINT msg; - UINT_PTR user; - UINT_PTR param_1; - UINT_PTR param_2; - UINT *err; - struct notify_context *notify; -}; - -struct midi_in_message_params -{ - UINT dev_id; - UINT msg; - UINT_PTR user; - UINT_PTR param_1; - UINT_PTR param_2; - UINT *err; - struct notify_context *notify; -}; - -struct midi_notify_wait_params -{ - struct notify_context *notify; - BOOL *quit; -}; - -enum unix_funcs -{ - get_endpoint_ids, - create_stream, - release_stream, - start, - stop, - reset, - get_render_buffer, - release_render_buffer, - get_capture_buffer, - release_capture_buffer, - get_mix_format, - is_format_supported, - get_buffer_size, - get_latency, - get_current_padding, - get_next_packet_size, - get_position, - get_frequency, - is_started, - set_volumes, - midi_init, - midi_release, - midi_out_message, - midi_in_message, - midi_notify_wait, -}; +#include "../mmdevapi/unixlib.h"
NTSTATUS unix_midi_init( void * ) DECLSPEC_HIDDEN; NTSTATUS unix_midi_release( void * ) DECLSPEC_HIDDEN;
I just realized I, once again, started with a capital letter after the colon in the commit messages.
I'll fix that right after you confirm everything else looks good.
On Fri Sep 16 08:05:24 2022 +0000, Davide Beatrici wrote:
This MR will also fix a bug I just found: https://gitlab.winehq.org/wine/wine/-/blob/5fa25d00d7edca295e38030006b14f405... `ARRAY_SIZE` should be used instead, as [`RegEnumKeyExW()`](https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regenumk...) takes the number of characters.
In which case that fix should be a separate commit.
On Fri Sep 16 08:05:24 2022 +0000, Huw Davies wrote:
In which case that fix should be a separate commit.
Right before the first?
Right before the first?
Yes, that would be a good place for it.