-- v3: wineoss: Implement get_device_period in unixlib. winecoreaudio: Implement get_device_period in unixlib. winealsa: Implement get_device_period in unixlib.
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winealsa.drv/alsa.c | 44 +++++++++++++++++++++++++++++++++--- dlls/winealsa.drv/mmdevdrv.c | 15 +++++++----- 2 files changed, 50 insertions(+), 9 deletions(-)
diff --git a/dlls/winealsa.drv/alsa.c b/dlls/winealsa.drv/alsa.c index f1a55e842db..2ac126f411d 100644 --- a/dlls/winealsa.drv/alsa.c +++ b/dlls/winealsa.drv/alsa.c @@ -82,7 +82,9 @@ struct alsa_stream pthread_mutex_t lock; };
-#define EXTRA_SAFE_RT 40000 +#define EXTRA_SAFE_RT 40000 + +static const REFERENCE_TIME def_period = 100000;
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 +2098,20 @@ 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 = def_period; + if (params->min_period) + *params->min_period = def_period; + + params->result = S_OK; + + return STATUS_SUCCESS; +} + static NTSTATUS alsa_get_buffer_size(void *args) { struct get_buffer_size_params *params = args; @@ -2458,7 +2474,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 +2669,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 +2915,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..0126b1357a2 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -824,18 +824,21 @@ 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;
- return S_OK; + ALSA_CALL(get_device_period, ¶ms); + + return params.result; }
static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface)
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/coreaudio.c | 43 ++++++++++++++++++++++++++++-- dlls/winecoreaudio.drv/mmdevdrv.c | 15 ++++++----- 2 files changed, 50 insertions(+), 8 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index ecd137ce609..89265558a1d 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -100,6 +100,9 @@ struct coreaudio_stream BYTE *local_buffer, *cap_buffer, *wrap_buffer, *resamp_buffer, *tmp_buffer; };
+static const REFERENCE_TIME def_period = 100000; +static const REFERENCE_TIME min_period = 50000; + static NTSTATUS unix_not_implemented(void *args) { return STATUS_SUCCESS; @@ -1087,6 +1090,20 @@ unsupported: return STATUS_SUCCESS; }
+static NTSTATUS unix_get_device_period(void *args) +{ + struct get_device_period_params *params = args; + + if (params->def_period) + *params->def_period = def_period; + if (params->min_period) + *params->min_period = min_period; + + params->result = S_OK; + + return STATUS_SUCCESS; +} + static UINT buf_ptr_diff(UINT left, UINT right, UINT bufsize) { if(left <= right) @@ -1739,7 +1756,7 @@ unixlib_entry_t __wine_unix_call_funcs[] = unix_release_capture_buffer, unix_is_format_supported, unix_get_mix_format, - unix_not_implemented, + unix_get_device_period, unix_get_buffer_size, unix_get_latency, unix_get_current_padding, @@ -1934,6 +1951,28 @@ static NTSTATUS unix_wow64_get_mix_format(void *args) return STATUS_SUCCESS; }
+static NTSTATUS unix_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), + }; + unix_get_device_period(¶ms); + params32->result = params.result; + return STATUS_SUCCESS; +} + static NTSTATUS unix_wow64_get_buffer_size(void *args) { struct @@ -2099,7 +2138,7 @@ unixlib_entry_t __wine_unix_call_wow64_funcs[] = unix_release_capture_buffer, unix_wow64_is_format_supported, unix_wow64_get_mix_format, - unix_not_implemented, + unix_wow64_get_device_period, unix_wow64_get_buffer_size, unix_wow64_get_latency, unix_wow64_get_current_padding, diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index 756aab93f71..d8a2e9e5d21 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -790,18 +790,21 @@ 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 = MinimumPeriod; + params.device = This->device_name; + params.flow = This->dataflow; + params.def_period = defperiod; + params.min_period = minperiod;
- return S_OK; + UNIX_CALL(get_device_period, ¶ms); + + return params.result; }
static DWORD WINAPI ca_timer_thread(void *user)
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 15 +++++++------ dlls/wineoss.drv/oss.c | 43 +++++++++++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 8 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index dac5790e384..c55176307f0 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -785,18 +785,21 @@ 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 = MinimumPeriod; + params.device = This->device_name; + params.flow = This->dataflow; + params.def_period = defperiod; + params.min_period = minperiod;
- return S_OK; + OSS_CALL(get_device_period, ¶ms); + + return params.result; }
static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index d8225b65889..585df97bc43 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -69,6 +69,9 @@ struct oss_stream
WINE_DEFAULT_DEBUG_CHANNEL(oss);
+static const REFERENCE_TIME def_period = 100000; +static const REFERENCE_TIME min_period = 50000; + static NTSTATUS oss_not_implemented(void *args) { return STATUS_SUCCESS; @@ -1245,6 +1248,20 @@ static NTSTATUS oss_get_mix_format(void *args) return STATUS_SUCCESS; }
+static NTSTATUS oss_get_device_period(void *args) +{ + struct get_device_period_params *params = args; + + if (params->def_period) + *params->def_period = def_period; + if (params->min_period) + *params->min_period = min_period; + + params->result = S_OK; + + return STATUS_SUCCESS; +} + static NTSTATUS oss_get_buffer_size(void *args) { struct get_buffer_size_params *params = args; @@ -1649,7 +1666,7 @@ unixlib_entry_t __wine_unix_call_funcs[] = oss_release_capture_buffer, oss_is_format_supported, oss_get_mix_format, - oss_not_implemented, + oss_get_device_period, oss_get_buffer_size, oss_get_latency, oss_get_current_padding, @@ -1860,6 +1877,28 @@ static NTSTATUS oss_wow64_get_mix_format(void *args) return STATUS_SUCCESS; }
+static NTSTATUS oss_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), + }; + oss_get_device_period(¶ms); + params32->result = params.result; + return STATUS_SUCCESS; +} + static NTSTATUS oss_wow64_get_buffer_size(void *args) { struct @@ -2051,7 +2090,7 @@ unixlib_entry_t __wine_unix_call_wow64_funcs[] = oss_release_capture_buffer, oss_wow64_is_format_supported, oss_wow64_get_mix_format, - oss_not_implemented, + oss_wow64_get_device_period, oss_wow64_get_buffer_size, oss_wow64_get_latency, oss_wow64_get_current_padding,
This merge request was approved by Huw Davies.