From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winealsa.drv/alsa.c | 43 +++++++++++++++++++++++++++++++++--- dlls/winealsa.drv/mmdevdrv.c | 13 ++++++----- 2 files changed, 48 insertions(+), 8 deletions(-)
diff --git a/dlls/winealsa.drv/alsa.c b/dlls/winealsa.drv/alsa.c index f1a55e842db..fb3ad65179b 100644 --- a/dlls/winealsa.drv/alsa.c +++ b/dlls/winealsa.drv/alsa.c @@ -82,7 +82,10 @@ struct alsa_stream pthread_mutex_t lock; };
-#define EXTRA_SAFE_RT 40000 +#define EXTRA_SAFE_RT (40000) + +static const REFERENCE_TIME g_def_period = 100000; +static const REFERENCE_TIME g_min_period = 50000;
static const WCHAR drv_keyW[] = {'S','o','f','t','w','a','r','e','\', 'W','i','n','e','\','D','r','i','v','e','r','s','\', @@ -2096,6 +2099,18 @@ exit: return STATUS_SUCCESS; }
+static NTSTATUS alsa_get_device_period(void *args) +{ + struct get_device_period_params *params = args; + + if (params->def_period) + *params->def_period = g_def_period; + if (params->min_period) + *params->min_period = g_min_period; + + return STATUS_SUCCESS; +} + static NTSTATUS alsa_get_buffer_size(void *args) { struct get_buffer_size_params *params = args; @@ -2458,7 +2473,7 @@ unixlib_entry_t __wine_unix_call_funcs[] = alsa_release_capture_buffer, alsa_is_format_supported, alsa_get_mix_format, - alsa_not_implemented, + alsa_get_device_period, alsa_get_buffer_size, alsa_get_latency, alsa_get_current_padding, @@ -2653,6 +2668,28 @@ static NTSTATUS alsa_wow64_get_mix_format(void *args) return STATUS_SUCCESS; }
+static NTSTATUS alsa_wow64_get_device_period(void *args) +{ + struct + { + PTR32 device; + EDataFlow flow; + HRESULT result; + PTR32 def_period; + PTR32 min_period; + } *params32 = args; + struct get_device_period_params params = + { + .device = ULongToPtr(params32->device), + .flow = params32->flow, + .def_period = ULongToPtr(params32->def_period), + .min_period = ULongToPtr(params32->min_period), + }; + alsa_get_device_period(¶ms); + params32->result = params.result; + return STATUS_SUCCESS; +} + static NTSTATUS alsa_wow64_get_buffer_size(void *args) { struct @@ -2877,7 +2914,7 @@ unixlib_entry_t __wine_unix_call_wow64_funcs[] = alsa_release_capture_buffer, alsa_wow64_is_format_supported, alsa_wow64_get_mix_format, - alsa_not_implemented, + alsa_wow64_get_device_period, alsa_wow64_get_buffer_size, alsa_wow64_get_latency, alsa_wow64_get_current_padding, diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index e556bf5d0c1..e68e90623ac 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -824,16 +824,19 @@ static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface, REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod) { ACImpl *This = impl_from_IAudioClient3(iface); + struct get_device_period_params params;
TRACE("(%p)->(%p, %p)\n", This, defperiod, minperiod);
- if(!defperiod && !minperiod) + if (!defperiod && !minperiod) return E_POINTER;
- if(defperiod) - *defperiod = DefaultPeriod; - if(minperiod) - *minperiod = DefaultPeriod; + params.device = This->device_name; + params.flow = This->dataflow; + params.def_period = defperiod; + params.min_period = minperiod; + + ALSA_CALL(get_device_period, ¶ms);
return S_OK; }