Follow-up to !600.
---
The version check logic is removed because redundant.
`SNDCTL_SYSINFO` was introduced in OSS 4.0: [oss4white.pdf](/uploads/e85c3196b611560db849cfac9e158bd2/oss4white.pdf)
The `ioctl()` call fails with OSS 3.x.
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/unixlib.h | 11 +++++++++++ dlls/winealsa.drv/alsa.c | 2 ++ dlls/winepulse.drv/pulse.c | 2 ++ 3 files changed, 15 insertions(+)
diff --git a/dlls/mmdevapi/unixlib.h b/dlls/mmdevapi/unixlib.h index 163272c4398..49426f127c3 100644 --- a/dlls/mmdevapi/unixlib.h +++ b/dlls/mmdevapi/unixlib.h @@ -273,6 +273,16 @@ struct midi_notify_wait_params struct notify_context *notify; };
+struct aux_message_params +{ + UINT dev_id; + UINT msg; + UINT_PTR user; + UINT_PTR param_1; + UINT_PTR param_2; + UINT *err; +}; + enum unix_funcs { process_attach, @@ -307,4 +317,5 @@ enum unix_funcs midi_out_message, midi_in_message, midi_notify_wait, + aux_message, }; diff --git a/dlls/winealsa.drv/alsa.c b/dlls/winealsa.drv/alsa.c index 7ac404fd6a4..c3daf25c85e 100644 --- a/dlls/winealsa.drv/alsa.c +++ b/dlls/winealsa.drv/alsa.c @@ -2463,6 +2463,7 @@ unixlib_entry_t __wine_unix_call_funcs[] = alsa_midi_out_message, alsa_midi_in_message, alsa_midi_notify_wait, + NULL, };
#ifdef _WIN64 @@ -2880,6 +2881,7 @@ unixlib_entry_t __wine_unix_call_wow64_funcs[] = alsa_wow64_midi_out_message, alsa_wow64_midi_in_message, alsa_wow64_midi_notify_wait, + NULL, };
#endif /* _WIN64 */ diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c index a75184e712a..2d8b408321a 100644 --- a/dlls/winepulse.drv/pulse.c +++ b/dlls/winepulse.drv/pulse.c @@ -2392,6 +2392,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = NULL, NULL, NULL, + NULL, };
#ifdef _WIN64 @@ -2835,6 +2836,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = NULL, NULL, NULL, + NULL, };
#endif /* _WIN64 */
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/oss.c | 224 ++++++++++++++++++------------------- dlls/wineoss.drv/ossmidi.c | 20 ++-- dlls/wineoss.drv/unixlib.h | 72 ++++++------ 3 files changed, 158 insertions(+), 158 deletions(-)
diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index 07a2a1ed7c1..4368523684d 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -116,7 +116,7 @@ static struct oss_stream *handle_get_stream(stream_handle h) return (struct oss_stream *)(UINT_PTR)h; }
-static NTSTATUS test_connect(void *args) +static NTSTATUS oss_test_connect(void *args) { struct test_connect_params *params = args; int mixer_fd; @@ -213,7 +213,7 @@ static void get_default_device(EDataFlow flow, char device[OSS_DEVNODE_SIZE]) return; }
-static NTSTATUS get_endpoint_ids(void *args) +static NTSTATUS oss_get_endpoint_ids(void *args) { struct get_endpoint_ids_params *params = args; oss_sysinfo sysinfo; @@ -544,7 +544,7 @@ static ULONG_PTR zero_bits(void) #endif }
-static NTSTATUS create_stream(void *args) +static NTSTATUS oss_create_stream(void *args) { struct create_stream_params *params = args; WAVEFORMATEXTENSIBLE *fmtex; @@ -633,7 +633,7 @@ exit: return STATUS_SUCCESS; }
-static NTSTATUS release_stream(void *args) +static NTSTATUS oss_release_stream(void *args) { struct release_stream_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -662,7 +662,7 @@ static NTSTATUS release_stream(void *args) return STATUS_SUCCESS; }
-static NTSTATUS start(void *args) +static NTSTATUS oss_start(void *args) { struct start_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -680,7 +680,7 @@ static NTSTATUS start(void *args) return oss_unlock_result(stream, ¶ms->result, S_OK); }
-static NTSTATUS stop(void *args) +static NTSTATUS oss_stop(void *args) { struct stop_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -696,7 +696,7 @@ static NTSTATUS stop(void *args) return oss_unlock_result(stream, ¶ms->result, S_OK); }
-static NTSTATUS reset(void *args) +static NTSTATUS oss_reset(void *args) { struct reset_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -869,7 +869,7 @@ static void oss_read_data(struct oss_stream *stream) } }
-static NTSTATUS timer_loop(void *args) +static NTSTATUS oss_timer_loop(void *args) { struct timer_loop_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -911,7 +911,7 @@ static NTSTATUS timer_loop(void *args) return STATUS_SUCCESS; }
-static NTSTATUS get_render_buffer(void *args) +static NTSTATUS oss_get_render_buffer(void *args) { struct get_render_buffer_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -977,7 +977,7 @@ static void oss_wrap_buffer(struct oss_stream *stream, BYTE *buffer, UINT32 writ } }
-static NTSTATUS release_render_buffer(void *args) +static NTSTATUS oss_release_render_buffer(void *args) { struct release_render_buffer_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -1017,7 +1017,7 @@ static NTSTATUS release_render_buffer(void *args) return oss_unlock_result(stream, ¶ms->result, S_OK); }
-static NTSTATUS get_capture_buffer(void *args) +static NTSTATUS oss_get_capture_buffer(void *args) { struct get_capture_buffer_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -1083,7 +1083,7 @@ static NTSTATUS get_capture_buffer(void *args) return oss_unlock_result(stream, ¶ms->result, *frames ? S_OK : AUDCLNT_S_BUFFER_EMPTY); }
-static NTSTATUS release_capture_buffer(void *args) +static NTSTATUS oss_release_capture_buffer(void *args) { struct release_capture_buffer_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -1111,7 +1111,7 @@ static NTSTATUS release_capture_buffer(void *args) return oss_unlock_result(stream, ¶ms->result, S_OK); }
-static NTSTATUS is_format_supported(void *args) +static NTSTATUS oss_is_format_supported(void *args) { struct is_format_supported_params *params = args; int fd; @@ -1140,7 +1140,7 @@ static NTSTATUS is_format_supported(void *args) return STATUS_SUCCESS; }
-static NTSTATUS get_mix_format(void *args) +static NTSTATUS oss_get_mix_format(void *args) { struct get_mix_format_params *params = args; WAVEFORMATEXTENSIBLE *fmt = params->fmt; @@ -1240,7 +1240,7 @@ static NTSTATUS get_mix_format(void *args) return STATUS_SUCCESS; }
-static NTSTATUS get_buffer_size(void *args) +static NTSTATUS oss_get_buffer_size(void *args) { struct get_buffer_size_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -1252,7 +1252,7 @@ static NTSTATUS get_buffer_size(void *args) return oss_unlock_result(stream, ¶ms->result, S_OK); }
-static NTSTATUS get_latency(void *args) +static NTSTATUS oss_get_latency(void *args) { struct get_latency_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -1266,7 +1266,7 @@ static NTSTATUS get_latency(void *args) return oss_unlock_result(stream, ¶ms->result, S_OK); }
-static NTSTATUS get_current_padding(void *args) +static NTSTATUS oss_get_current_padding(void *args) { struct get_current_padding_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -1278,7 +1278,7 @@ static NTSTATUS get_current_padding(void *args) return oss_unlock_result(stream, ¶ms->result, S_OK); }
-static NTSTATUS get_next_packet_size(void *args) +static NTSTATUS oss_get_next_packet_size(void *args) { struct get_next_packet_size_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -1291,7 +1291,7 @@ static NTSTATUS get_next_packet_size(void *args) return oss_unlock_result(stream, ¶ms->result, S_OK); }
-static NTSTATUS get_frequency(void *args) +static NTSTATUS oss_get_frequency(void *args) { struct get_frequency_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -1307,7 +1307,7 @@ static NTSTATUS get_frequency(void *args) return oss_unlock_result(stream, ¶ms->result, S_OK); }
-static NTSTATUS get_position(void *args) +static NTSTATUS oss_get_position(void *args) { struct get_position_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -1351,7 +1351,7 @@ static NTSTATUS get_position(void *args) return oss_unlock_result(stream, ¶ms->result, S_OK); }
-static NTSTATUS set_volumes(void *args) +static NTSTATUS oss_set_volumes(void *args) { struct set_volumes_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -1363,7 +1363,7 @@ static NTSTATUS set_volumes(void *args) return STATUS_SUCCESS; }
-static NTSTATUS set_event_handle(void *args) +static NTSTATUS oss_set_event_handle(void *args) { struct set_event_handle_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -1383,7 +1383,7 @@ static NTSTATUS set_event_handle(void *args) return oss_unlock_result(stream, ¶ms->result, S_OK); }
-static NTSTATUS is_started(void *args) +static NTSTATUS oss_is_started(void *args) { struct is_started_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); @@ -1571,7 +1571,7 @@ static UINT aux_set_volume(WORD dev_id, UINT vol) return MMSYSERR_NOERROR; }
-static NTSTATUS aux_message(void *args) +static NTSTATUS oss_aux_message(void *args) { struct aux_message_params *params = args;
@@ -1612,41 +1612,41 @@ static NTSTATUS aux_message(void *args)
unixlib_entry_t __wine_unix_call_funcs[] = { - test_connect, - get_endpoint_ids, - create_stream, - release_stream, - start, - stop, - reset, - timer_loop, - get_render_buffer, - release_render_buffer, - get_capture_buffer, - release_capture_buffer, - is_format_supported, - get_mix_format, - get_buffer_size, - get_latency, - get_current_padding, - get_next_packet_size, - get_frequency, - get_position, - set_volumes, - set_event_handle, - is_started, - midi_release, - midi_out_message, - midi_in_message, - midi_notify_wait, - aux_message, + oss_test_connect, + oss_get_endpoint_ids, + oss_create_stream, + oss_release_stream, + oss_start, + oss_stop, + oss_reset, + oss_timer_loop, + oss_get_render_buffer, + oss_release_render_buffer, + oss_get_capture_buffer, + oss_release_capture_buffer, + oss_is_format_supported, + oss_get_mix_format, + oss_get_buffer_size, + oss_get_latency, + oss_get_current_padding, + oss_get_next_packet_size, + oss_get_frequency, + oss_get_position, + oss_set_volumes, + oss_set_event_handle, + oss_is_started, + oss_midi_release, + oss_midi_out_message, + oss_midi_in_message, + oss_midi_notify_wait, + oss_aux_message, };
#ifdef _WIN64
typedef UINT PTR32;
-static NTSTATUS wow64_get_endpoint_ids(void *args) +static NTSTATUS oss_wow64_get_endpoint_ids(void *args) { struct { @@ -1663,7 +1663,7 @@ static NTSTATUS wow64_get_endpoint_ids(void *args) .endpoints = ULongToPtr(params32->endpoints), .size = params32->size }; - get_endpoint_ids(¶ms); + oss_get_endpoint_ids(¶ms); params32->size = params.size; params32->result = params.result; params32->num = params.num; @@ -1671,7 +1671,7 @@ static NTSTATUS wow64_get_endpoint_ids(void *args) return STATUS_SUCCESS; }
-static NTSTATUS wow64_create_stream(void *args) +static NTSTATUS oss_wow64_create_stream(void *args) { struct { @@ -1696,12 +1696,12 @@ static NTSTATUS wow64_create_stream(void *args) .fmt = ULongToPtr(params32->fmt), .stream = ULongToPtr(params32->stream) }; - create_stream(¶ms); + oss_create_stream(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_release_stream(void *args) +static NTSTATUS oss_wow64_release_stream(void *args) { struct { @@ -1714,12 +1714,12 @@ static NTSTATUS wow64_release_stream(void *args) .stream = params32->stream, .timer_thread = ULongToHandle(params32->timer_thread) }; - release_stream(¶ms); + oss_release_stream(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_render_buffer(void *args) +static NTSTATUS oss_wow64_get_render_buffer(void *args) { struct { @@ -1735,13 +1735,13 @@ static NTSTATUS wow64_get_render_buffer(void *args) .frames = params32->frames, .data = &data }; - get_render_buffer(¶ms); + oss_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 oss_wow64_get_capture_buffer(void *args) { struct { @@ -1763,13 +1763,13 @@ static NTSTATUS wow64_get_capture_buffer(void *args) .devpos = ULongToPtr(params32->devpos), .qpcpos = ULongToPtr(params32->qpcpos) }; - get_capture_buffer(¶ms); + oss_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 oss_wow64_is_format_supported(void *args) { struct { @@ -1788,12 +1788,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); + oss_is_format_supported(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_mix_format(void *args) +static NTSTATUS oss_wow64_get_mix_format(void *args) { struct { @@ -1808,12 +1808,12 @@ static NTSTATUS wow64_get_mix_format(void *args) .flow = params32->flow, .fmt = ULongToPtr(params32->fmt) }; - get_mix_format(¶ms); + oss_get_mix_format(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_buffer_size(void *args) +static NTSTATUS oss_wow64_get_buffer_size(void *args) { struct { @@ -1826,12 +1826,12 @@ static NTSTATUS wow64_get_buffer_size(void *args) .stream = params32->stream, .size = ULongToPtr(params32->size) }; - get_buffer_size(¶ms); + oss_get_buffer_size(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_latency(void *args) +static NTSTATUS oss_wow64_get_latency(void *args) { struct { @@ -1844,12 +1844,12 @@ static NTSTATUS wow64_get_latency(void *args) .stream = params32->stream, .latency = ULongToPtr(params32->latency) }; - get_latency(¶ms); + oss_get_latency(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_current_padding(void *args) +static NTSTATUS oss_wow64_get_current_padding(void *args) { struct { @@ -1862,12 +1862,12 @@ static NTSTATUS wow64_get_current_padding(void *args) .stream = params32->stream, .padding = ULongToPtr(params32->padding) }; - get_current_padding(¶ms); + oss_get_current_padding(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_next_packet_size(void *args) +static NTSTATUS oss_wow64_get_next_packet_size(void *args) { struct { @@ -1880,12 +1880,12 @@ static NTSTATUS wow64_get_next_packet_size(void *args) .stream = params32->stream, .frames = ULongToPtr(params32->frames) }; - get_next_packet_size(¶ms); + oss_get_next_packet_size(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_frequency(void *args) +static NTSTATUS oss_wow64_get_frequency(void *args) { struct { @@ -1898,12 +1898,12 @@ static NTSTATUS wow64_get_frequency(void *args) .stream = params32->stream, .frequency = ULongToPtr(params32->frequency) }; - get_frequency(¶ms); + oss_get_frequency(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_get_position(void *args) +static NTSTATUS oss_wow64_get_position(void *args) { struct { @@ -1918,12 +1918,12 @@ static NTSTATUS wow64_get_position(void *args) .position = ULongToPtr(params32->position), .qpctime = ULongToPtr(params32->qpctime) }; - get_position(¶ms); + oss_get_position(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_set_volumes(void *args) +static NTSTATUS oss_wow64_set_volumes(void *args) { struct { @@ -1939,10 +1939,10 @@ static NTSTATUS wow64_set_volumes(void *args) .volumes = ULongToPtr(params32->volumes), .session_volumes = ULongToPtr(params32->session_volumes) }; - return set_volumes(¶ms); + return oss_set_volumes(¶ms); }
-static NTSTATUS wow64_set_event_handle(void *args) +static NTSTATUS oss_wow64_set_event_handle(void *args) { struct { @@ -1956,12 +1956,12 @@ static NTSTATUS wow64_set_event_handle(void *args) .event = ULongToHandle(params32->event) };
- set_event_handle(¶ms); + oss_set_event_handle(¶ms); params32->result = params.result; return STATUS_SUCCESS; }
-static NTSTATUS wow64_aux_message(void *args) +static NTSTATUS oss_wow64_aux_message(void *args) { struct { @@ -1981,39 +1981,39 @@ static NTSTATUS wow64_aux_message(void *args) .param_2 = params32->param_2, .err = ULongToPtr(params32->err), }; - return aux_message(¶ms); + return oss_aux_message(¶ms); }
unixlib_entry_t __wine_unix_call_wow64_funcs[] = { - test_connect, - wow64_get_endpoint_ids, - wow64_create_stream, - wow64_release_stream, - start, - stop, - reset, - timer_loop, - wow64_get_render_buffer, - release_render_buffer, - wow64_get_capture_buffer, - release_capture_buffer, - wow64_is_format_supported, - wow64_get_mix_format, - wow64_get_buffer_size, - wow64_get_latency, - wow64_get_current_padding, - wow64_get_next_packet_size, - wow64_get_frequency, - wow64_get_position, - wow64_set_volumes, - wow64_set_event_handle, - is_started, - midi_release, - wow64_midi_out_message, - wow64_midi_in_message, - wow64_midi_notify_wait, - wow64_aux_message, + oss_test_connect, + oss_wow64_get_endpoint_ids, + oss_wow64_create_stream, + oss_wow64_release_stream, + oss_start, + oss_stop, + oss_reset, + oss_timer_loop, + oss_wow64_get_render_buffer, + oss_release_render_buffer, + oss_wow64_get_capture_buffer, + oss_release_capture_buffer, + oss_wow64_is_format_supported, + oss_wow64_get_mix_format, + oss_wow64_get_buffer_size, + oss_wow64_get_latency, + oss_wow64_get_current_padding, + oss_wow64_get_next_packet_size, + oss_wow64_get_frequency, + oss_wow64_get_position, + oss_wow64_set_volumes, + oss_wow64_set_event_handle, + oss_is_started, + oss_midi_release, + oss_wow64_midi_out_message, + oss_wow64_midi_in_message, + oss_wow64_midi_notify_wait, + oss_wow64_aux_message, };
#endif /* _WIN64 */ diff --git a/dlls/wineoss.drv/ossmidi.c b/dlls/wineoss.drv/ossmidi.c index 1fd9cc216a1..f04f6212bf4 100644 --- a/dlls/wineoss.drv/ossmidi.c +++ b/dlls/wineoss.drv/ossmidi.c @@ -522,7 +522,7 @@ static UINT midi_exit(void) return 0; }
-NTSTATUS midi_release(void *args) +NTSTATUS oss_midi_release(void *args) { /* stop the notify_wait thread */ notify_post(NULL); @@ -1685,7 +1685,7 @@ static UINT midi_in_reset(WORD dev_id, struct notify_context *notify) return err; }
-NTSTATUS midi_out_message(void *args) +NTSTATUS oss_midi_out_message(void *args) { struct midi_out_message_params *params = args;
@@ -1745,7 +1745,7 @@ NTSTATUS midi_out_message(void *args) return STATUS_SUCCESS; }
-NTSTATUS midi_in_message(void *args) +NTSTATUS oss_midi_in_message(void *args) { struct midi_in_message_params *params = args;
@@ -1802,7 +1802,7 @@ NTSTATUS midi_in_message(void *args) return STATUS_SUCCESS; }
-NTSTATUS midi_notify_wait(void *args) +NTSTATUS oss_midi_notify_wait(void *args) { struct midi_notify_wait_params *params = args;
@@ -1906,7 +1906,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 oss_wow64_midi_out_message(void *args) { struct { @@ -1977,7 +1977,7 @@ NTSTATUS wow64_midi_out_message(void *args) return STATUS_SUCCESS; }
- midi_out_message(¶ms); + oss_midi_out_message(¶ms);
switch (params32->msg) { @@ -2030,7 +2030,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 oss_wow64_midi_in_message(void *args) { struct { @@ -2102,7 +2102,7 @@ NTSTATUS wow64_midi_in_message(void *args) return STATUS_SUCCESS; }
- midi_in_message(¶ms); + oss_midi_in_message(¶ms);
switch (params32->msg) { @@ -2137,7 +2137,7 @@ NTSTATUS wow64_midi_in_message(void *args) return STATUS_SUCCESS; }
-NTSTATUS wow64_midi_notify_wait(void *args) +NTSTATUS oss_wow64_midi_notify_wait(void *args) { struct { @@ -2155,7 +2155,7 @@ NTSTATUS wow64_midi_notify_wait(void *args) }; notify32->send_notify = FALSE;
- midi_notify_wait(¶ms); + oss_midi_notify_wait(¶ms);
if (!*params.quit && notify.send_notify) { diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h index e36c82ff35b..b418bb70d2d 100644 --- a/dlls/wineoss.drv/unixlib.h +++ b/dlls/wineoss.drv/unixlib.h @@ -262,47 +262,47 @@ struct aux_message_params
enum oss_funcs { - oss_test_connect, - oss_get_endpoint_ids, - oss_create_stream, - oss_release_stream, - oss_start, - oss_stop, - oss_reset, - oss_timer_loop, - oss_get_render_buffer, - oss_release_render_buffer, - oss_get_capture_buffer, - oss_release_capture_buffer, - oss_is_format_supported, - oss_get_mix_format, - oss_get_buffer_size, - oss_get_latency, - oss_get_current_padding, - oss_get_next_packet_size, - oss_get_frequency, - oss_get_position, - oss_set_volumes, - oss_set_event_handle, - oss_is_started, - oss_midi_release, - oss_midi_out_message, - oss_midi_in_message, - oss_midi_notify_wait, - oss_aux_message, + test_connect, + get_endpoint_ids, + create_stream, + release_stream, + start, + stop, + reset, + timer_loop, + get_render_buffer, + release_render_buffer, + get_capture_buffer, + release_capture_buffer, + is_format_supported, + get_mix_format, + get_buffer_size, + get_latency, + get_current_padding, + get_next_packet_size, + get_frequency, + get_position, + set_volumes, + set_event_handle, + is_started, + midi_release, + midi_out_message, + midi_in_message, + midi_notify_wait, + aux_message, };
-NTSTATUS midi_release(void *args) DECLSPEC_HIDDEN; -NTSTATUS midi_out_message(void *args) DECLSPEC_HIDDEN; -NTSTATUS midi_in_message(void *args) DECLSPEC_HIDDEN; -NTSTATUS midi_notify_wait(void *args) DECLSPEC_HIDDEN; +NTSTATUS oss_midi_release(void *args) DECLSPEC_HIDDEN; +NTSTATUS oss_midi_out_message(void *args) DECLSPEC_HIDDEN; +NTSTATUS oss_midi_in_message(void *args) DECLSPEC_HIDDEN; +NTSTATUS oss_midi_notify_wait(void *args) DECLSPEC_HIDDEN;
#ifdef _WIN64 -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 oss_wow64_midi_out_message(void *args) DECLSPEC_HIDDEN; +NTSTATUS oss_wow64_midi_in_message(void *args) DECLSPEC_HIDDEN; +NTSTATUS oss_wow64_midi_notify_wait(void *args) DECLSPEC_HIDDEN; #endif
extern unixlib_handle_t oss_handle;
-#define OSS_CALL(func, params) __wine_unix_call(oss_handle, oss_ ## func, params) +#define OSS_CALL(func, params) __wine_unix_call(oss_handle, func, params)
From: Davide Beatrici git@davidebeatrici.dev
The version check logic is removed because redundant.
SNDCTL_SYSINFO was introduced in OSS 4.0: http://developer.opensound.com/oss4white.pdf
The ioctl() call fails with OSS 3.x. --- dlls/wineoss.drv/mmdevdrv.c | 2 +- dlls/wineoss.drv/oss.c | 17 +++-------------- dlls/wineoss.drv/unixlib.h | 3 ++- 3 files changed, 6 insertions(+), 16 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index dbd9c5a0490..1bb1ab01574 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -236,7 +236,7 @@ int WINAPI AUDDRV_GetPriority(void)
OSS_CALL(test_connect, ¶ms);
- return params.priority; + return SUCCEEDED(params.result) ? Priority_Preferred : Priority_Unavailable; }
static HRESULT stream_release(stream_handle stream, HANDLE timer_thread) diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index 4368523684d..d74466f51c2 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -130,7 +130,7 @@ static NTSTATUS oss_test_connect(void *args) mixer_fd = open("/dev/mixer", O_RDONLY, 0); if(mixer_fd < 0){ TRACE("Priority_Unavailable: open failed\n"); - params->priority = Priority_Unavailable; + params->result = E_FAIL; return STATUS_SUCCESS; }
@@ -139,26 +139,15 @@ static NTSTATUS oss_test_connect(void *args) if(ioctl(mixer_fd, SNDCTL_SYSINFO, &sysinfo) < 0){ TRACE("Priority_Unavailable: ioctl failed\n"); close(mixer_fd); - params->priority = Priority_Unavailable; + params->result = E_FAIL; return STATUS_SUCCESS; }
close(mixer_fd);
- if(sysinfo.version[0] < '4' || sysinfo.version[0] > '9'){ - TRACE("Priority_Low: sysinfo.version[0]: %x\n", sysinfo.version[0]); - params->priority = Priority_Low; - return STATUS_SUCCESS; - } - if(sysinfo.versionnum & 0x80000000){ - TRACE("Priority_Low: sysinfo.versionnum: %x\n", sysinfo.versionnum); - params->priority = Priority_Low; - return STATUS_SUCCESS; - } - TRACE("Priority_Preferred: Seems like valid OSS!\n");
- params->priority = Priority_Preferred; + params->result = S_OK; return STATUS_SUCCESS; }
diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h index b418bb70d2d..86a31f68001 100644 --- a/dlls/wineoss.drv/unixlib.h +++ b/dlls/wineoss.drv/unixlib.h @@ -31,7 +31,8 @@ enum DriverPriority
struct test_connect_params { - enum DriverPriority priority; + const char *name; + HRESULT result; };
struct endpoint
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 2 ++ dlls/wineoss.drv/oss.c | 4 ++++ dlls/wineoss.drv/unixlib.h | 2 ++ 3 files changed, 8 insertions(+)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 1bb1ab01574..cf30d92a69b 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -710,6 +710,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, return AUDCLNT_E_ALREADY_INITIALIZED; }
+ params.name = NULL; params.device = This->devnode; params.flow = This->dataflow; params.share = mode; @@ -717,6 +718,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, params.duration = duration; params.period = period; params.fmt = fmt; + params.channel_count = NULL; params.stream = &stream;
OSS_CALL(create_stream, ¶ms); diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index d74466f51c2..00ce263aaff 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -1664,6 +1664,7 @@ static NTSTATUS oss_wow64_create_stream(void *args) { struct { + PTR32 name; PTR32 device; EDataFlow flow; AUDCLNT_SHAREMODE share; @@ -1672,10 +1673,12 @@ static NTSTATUS oss_wow64_create_stream(void *args) 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, @@ -1683,6 +1686,7 @@ static NTSTATUS oss_wow64_create_stream(void *args) .duration = params32->duration, .period = params32->period, .fmt = ULongToPtr(params32->fmt), + .channel_count = ULongToPtr(params32->channel_count), .stream = ULongToPtr(params32->stream) }; oss_create_stream(¶ms); diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h index 86a31f68001..03d0cdb39c7 100644 --- a/dlls/wineoss.drv/unixlib.h +++ b/dlls/wineoss.drv/unixlib.h @@ -53,6 +53,7 @@ struct get_endpoint_ids_params
struct create_stream_params { + const char *name; const char *device; EDataFlow flow; AUDCLNT_SHAREMODE share; @@ -61,6 +62,7 @@ struct create_stream_params REFERENCE_TIME period; const WAVEFORMATEX *fmt; HRESULT result; + UINT32 *channel_count; stream_handle *stream; };
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 2 +- dlls/wineoss.drv/oss.c | 6 +++--- dlls/wineoss.drv/unixlib.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index cf30d92a69b..103684b0054 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -1412,7 +1412,7 @@ static HRESULT WINAPI AudioClock_GetFrequency(IAudioClock *iface, UINT64 *freq) TRACE("(%p)->(%p)\n", This, freq);
params.stream = This->stream; - params.frequency = freq; + params.freq = freq; OSS_CALL(get_frequency, ¶ms);
return params.result; diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index 00ce263aaff..00e24dd7b3c 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -1284,7 +1284,7 @@ static NTSTATUS oss_get_frequency(void *args) { struct get_frequency_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); - UINT64 *freq = params->frequency; + UINT64 *freq = params->freq;
oss_lock(stream);
@@ -1884,12 +1884,12 @@ static NTSTATUS oss_wow64_get_frequency(void *args) { stream_handle stream; HRESULT result; - PTR32 frequency; + PTR32 freq; } *params32 = args; struct get_frequency_params params = { .stream = params32->stream, - .frequency = ULongToPtr(params32->frequency) + .freq = ULongToPtr(params32->freq) }; oss_get_frequency(¶ms); params32->result = params.result; diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h index 03d0cdb39c7..1ea9f0995ef 100644 --- a/dlls/wineoss.drv/unixlib.h +++ b/dlls/wineoss.drv/unixlib.h @@ -180,7 +180,7 @@ struct get_frequency_params { stream_handle stream; HRESULT result; - UINT64 *frequency; + UINT64 *freq; };
struct get_position_params
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 3 ++- dlls/wineoss.drv/oss.c | 8 +++++--- dlls/wineoss.drv/unixlib.h | 3 ++- 3 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 103684b0054..ed3e8cbd8bf 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -1430,7 +1430,8 @@ static HRESULT WINAPI AudioClock_GetPosition(IAudioClock *iface, UINT64 *pos, return E_POINTER;
params.stream = This->stream; - params.position = pos; + params.device = FALSE; + params.pos = pos; params.qpctime = qpctime; OSS_CALL(get_position, ¶ms);
diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index 00e24dd7b3c..cea278fcac0 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -1300,7 +1300,7 @@ static NTSTATUS oss_get_position(void *args) { struct get_position_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); - UINT64 *pos = params->position, *qpctime = params->qpctime; + UINT64 *pos = params->pos, *qpctime = params->qpctime;
oss_lock(stream);
@@ -1901,14 +1901,16 @@ static NTSTATUS oss_wow64_get_position(void *args) struct { stream_handle stream; + BOOL device; HRESULT result; - PTR32 position; + PTR32 pos; PTR32 qpctime; } *params32 = args; struct get_position_params params = { .stream = params32->stream, - .position = ULongToPtr(params32->position), + .device = params32->device, + .pos = ULongToPtr(params32->pos), .qpctime = ULongToPtr(params32->qpctime) }; oss_get_position(¶ms); diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h index 1ea9f0995ef..38f2a4c6d74 100644 --- a/dlls/wineoss.drv/unixlib.h +++ b/dlls/wineoss.drv/unixlib.h @@ -186,8 +186,9 @@ struct get_frequency_params struct get_position_params { stream_handle stream; + BOOL device; HRESULT result; - UINT64 *position; + UINT64 *pos; UINT64 *qpctime; };
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 8 ++ dlls/wineoss.drv/oss.c | 14 +- dlls/wineoss.drv/unixlib.h | 280 +----------------------------------- 3 files changed, 21 insertions(+), 281 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index ed3e8cbd8bf..a27b55c5ce4 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -47,6 +47,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(oss);
#define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER)
+/* From <dlls/mmdevapi/mmdevapi.h> */ +enum DriverPriority { + Priority_Unavailable = 0, + Priority_Low, + Priority_Neutral, + Priority_Preferred +}; + unixlib_handle_t oss_handle = 0;
static const REFERENCE_TIME DefaultPeriod = 100000; diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index cea278fcac0..ab44e9e1a0a 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -1601,7 +1601,9 @@ static NTSTATUS oss_aux_message(void *args)
unixlib_entry_t __wine_unix_call_funcs[] = { - oss_test_connect, + NULL, + NULL, + NULL, oss_get_endpoint_ids, oss_create_stream, oss_release_stream, @@ -1615,6 +1617,7 @@ unixlib_entry_t __wine_unix_call_funcs[] = oss_release_capture_buffer, oss_is_format_supported, oss_get_mix_format, + NULL, oss_get_buffer_size, oss_get_latency, oss_get_current_padding, @@ -1623,7 +1626,9 @@ unixlib_entry_t __wine_unix_call_funcs[] = oss_get_position, oss_set_volumes, oss_set_event_handle, + oss_test_connect, oss_is_started, + NULL, oss_midi_release, oss_midi_out_message, oss_midi_in_message, @@ -1981,7 +1986,9 @@ static NTSTATUS oss_wow64_aux_message(void *args)
unixlib_entry_t __wine_unix_call_wow64_funcs[] = { - oss_test_connect, + NULL, + NULL, + NULL, oss_wow64_get_endpoint_ids, oss_wow64_create_stream, oss_wow64_release_stream, @@ -1995,6 +2002,7 @@ unixlib_entry_t __wine_unix_call_wow64_funcs[] = oss_release_capture_buffer, oss_wow64_is_format_supported, oss_wow64_get_mix_format, + NULL, oss_wow64_get_buffer_size, oss_wow64_get_latency, oss_wow64_get_current_padding, @@ -2003,7 +2011,9 @@ unixlib_entry_t __wine_unix_call_wow64_funcs[] = oss_wow64_get_position, oss_wow64_set_volumes, oss_wow64_set_event_handle, + oss_test_connect, oss_is_started, + NULL, oss_midi_release, oss_wow64_midi_out_message, oss_wow64_midi_in_message, diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h index 38f2a4c6d74..1c3ee7b93b3 100644 --- a/dlls/wineoss.drv/unixlib.h +++ b/dlls/wineoss.drv/unixlib.h @@ -16,285 +16,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "mmdeviceapi.h" - -typedef UINT64 stream_handle; - -/* From <dlls/mmdevapi/mmdevapi.h> */ -enum DriverPriority -{ - Priority_Unavailable = 0, - Priority_Low, - Priority_Neutral, - Priority_Preferred -}; - -struct test_connect_params -{ - const char *name; - HRESULT result; -}; - -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; - UINT 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 timer_loop_params -{ - stream_handle stream; -}; - -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 is_format_supported_params -{ - const char *device; - EDataFlow flow; - AUDCLNT_SHAREMODE share; - const WAVEFORMATEX *fmt_in; - WAVEFORMATEXTENSIBLE *fmt_out; - HRESULT result; -}; - -struct get_mix_format_params -{ - const char *device; - EDataFlow flow; - WAVEFORMATEXTENSIBLE *fmt; - HRESULT result; -}; - -struct get_buffer_size_params -{ - stream_handle stream; - HRESULT result; - UINT32 *size; -}; - -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_frequency_params -{ - stream_handle stream; - HRESULT result; - UINT64 *freq; -}; - -struct get_position_params -{ - stream_handle stream; - BOOL device; - HRESULT result; - UINT64 *pos; - UINT64 *qpctime; -}; - -struct set_volumes_params -{ - stream_handle stream; - float master_volume; - const float *volumes; - const float *session_volumes; -}; - -struct set_event_handle_params -{ - stream_handle stream; - HANDLE event; - HRESULT result; -}; - -struct is_started_params -{ - stream_handle stream; - HRESULT result; -}; - -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 -{ - BOOL *quit; - struct notify_context *notify; -}; - -struct aux_message_params -{ - UINT dev_id; - UINT msg; - UINT_PTR user; - UINT_PTR param_1; - UINT_PTR param_2; - UINT *err; -}; - -enum oss_funcs -{ - test_connect, - get_endpoint_ids, - create_stream, - release_stream, - start, - stop, - reset, - timer_loop, - get_render_buffer, - release_render_buffer, - get_capture_buffer, - release_capture_buffer, - is_format_supported, - get_mix_format, - get_buffer_size, - get_latency, - get_current_padding, - get_next_packet_size, - get_frequency, - get_position, - set_volumes, - set_event_handle, - is_started, - midi_release, - midi_out_message, - midi_in_message, - midi_notify_wait, - aux_message, -}; +#include "../mmdevapi/unixlib.h"
NTSTATUS oss_midi_release(void *args) DECLSPEC_HIDDEN; NTSTATUS oss_midi_out_message(void *args) DECLSPEC_HIDDEN;
Huw Davies (@huw) commented about dlls/wineoss.drv/oss.c:
return STATUS_SUCCESS; } close(mixer_fd);
- if(sysinfo.version[0] < '4' || sysinfo.version[0] > '9'){
TRACE("Priority_Low: sysinfo.version[0]: %x\n", sysinfo.version[0]);
params->priority = Priority_Low;
return STATUS_SUCCESS;
- }
- if(sysinfo.versionnum & 0x80000000){
TRACE("Priority_Low: sysinfo.versionnum: %x\n", sysinfo.versionnum);
params->priority = Priority_Low;
return STATUS_SUCCESS;
- }
I'd prefer that we didn't make these sort of changes (and if we do, it should be in a separate commit). Having the unixlib return the priority seems reasonable to me, and it wouldn't be hard to change the pulse driver to do likewise. It might make sense to rename the call from `test_connect` to `get_priority`.
On Wed Sep 7 09:11:20 2022 +0000, Huw Davies wrote:
I'd prefer that we didn't make these sort of changes (and if we do, it should be in a separate commit). Having the unixlib return the priority seems reasonable to me, and it wouldn't be hard to change the pulse driver to do likewise. It might make sense to rename the call from `test_connect` to `get_priority`.
We have make the change in `winealsa` too, but it's not an issue.
Returning the priority actually makes more sense in my opinion, as it's the driver itself that is supposed to know whether it can work reliably.
I also agree with the name change, but I would do it in a separate MR, perhaps when merging the various `mmdevdrv.c` files.