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; }
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/coreaudio.c | 41 ++++++++++++++++++++++++++++-- dlls/winecoreaudio.drv/mmdevdrv.c | 13 ++++++---- 2 files changed, 47 insertions(+), 7 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index ecd137ce609..03f979de3e6 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 g_def_period = 100000; +static const REFERENCE_TIME g_min_period = 50000; + static NTSTATUS unix_not_implemented(void *args) { return STATUS_SUCCESS; @@ -1087,6 +1090,18 @@ 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 = g_def_period; + if (params->min_period) + *params->min_period = g_min_period; + + return STATUS_SUCCESS; +} + static UINT buf_ptr_diff(UINT left, UINT right, UINT bufsize) { if(left <= right) @@ -1739,7 +1754,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 +1949,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 +2136,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..5be8aa06926 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -790,16 +790,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 = MinimumPeriod; + params.device = This->device_name; + params.flow = This->dataflow; + params.def_period = defperiod; + params.min_period = minperiod; + + UNIX_CALL(get_device_period, ¶ms);
return S_OK; }
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 13 +++++++----- dlls/wineoss.drv/oss.c | 41 +++++++++++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 7 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index dac5790e384..b866c5ea431 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -785,16 +785,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 = MinimumPeriod; + params.device = This->device_name; + params.flow = This->dataflow; + params.def_period = defperiod; + params.min_period = minperiod; + + OSS_CALL(get_device_period, ¶ms);
return S_OK; } diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index d8225b65889..e5d29464824 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 g_def_period = 100000; +static const REFERENCE_TIME g_min_period = 50000; + static NTSTATUS oss_not_implemented(void *args) { return STATUS_SUCCESS; @@ -1245,6 +1248,18 @@ 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 = g_def_period; + if (params->min_period) + *params->min_period = g_min_period; + + return STATUS_SUCCESS; +} + static NTSTATUS oss_get_buffer_size(void *args) { struct get_buffer_size_params *params = args; @@ -1649,7 +1664,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 +1875,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 +2088,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,
Davide Beatrici (@davidebeatrici) commented about dlls/winealsa.drv/mmdevdrv.c:
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;
I'm assuming this is a bug.
Davide Beatrici (@davidebeatrici) commented about dlls/winealsa.drv/alsa.c:
pthread_mutex_t lock;
};
-#define EXTRA_SAFE_RT 40000 +#define EXTRA_SAFE_RT (40000)
Are the added parentheses okay?
On Sun May 21 07:24:31 2023 +0000, Davide Beatrici wrote:
I'm assuming this is a bug.
Well this was changed as part of d301254e72f0, so I'm not so sure.
On Sun May 21 07:28:57 2023 +0000, Davide Beatrici wrote:
Are the added parentheses okay?
Not really, why are you changing this?
Huw Davies (@huw) commented about dlls/winealsa.drv/alsa.c:
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;
I'm not a fan of the `g_` prefix; `default_period` and `minimum_period` are fine names.
On Mon May 22 08:48:54 2023 +0000, Huw Davies wrote:
Well this was changed as part of d301254e72f0, so I'm not so sure.
Mmm... looks like a debugging leftover. @julliard
In any case, I'm going to set it back to `DefaultPeriod`. We can always fix it in a dedicated commit.
On Mon May 22 08:48:55 2023 +0000, Huw Davies wrote:
Not really, why are you changing this?
It's considered good practice as without the parentheses you risk breaking arithmetic operations.
Not our case though, I'm going to remove them for consistency.
On Mon May 22 08:48:55 2023 +0000, Huw Davies wrote:
I'm not a fan of the `g_` prefix; `default_period` and `minimum_period` are fine names.
Noted, in future commits I will omit the prefix.