From: Paul Gofman pgofman@codeweavers.com
--- dlls/mmdevapi/client.c | 39 ++++++++++++++++++++++++++++++ dlls/mmdevapi/unixlib.h | 10 ++++++++ dlls/winealsa.drv/alsa.c | 2 ++ dlls/winecoreaudio.drv/coreaudio.c | 2 ++ dlls/wineoss.drv/oss.c | 2 ++ dlls/winepulse.drv/pulse.c | 2 ++ 6 files changed, 57 insertions(+)
diff --git a/dlls/mmdevapi/client.c b/dlls/mmdevapi/client.c index 882ee32dd21..ee73ae608f1 100644 --- a/dlls/mmdevapi/client.c +++ b/dlls/mmdevapi/client.c @@ -21,6 +21,9 @@
#define COBJMACROS
+#include "ntstatus.h" +#define WIN32_NO_STATUS + #include <wchar.h>
#include <audiopolicy.h> @@ -402,6 +405,42 @@ static HRESULT stream_init(struct audio_client *client, const BOOLEAN force_def_ return params.result; }
+ if (flags & AUDCLNT_STREAMFLAGS_LOOPBACK) + { + struct get_loopback_capture_device_params params; + + if (client->dataflow != eRender) + { + sessions_unlock(); + return AUDCLNT_E_WRONG_ENDPOINT_TYPE; + } + + params.device = client->device_name; + params.name = name = get_application_name(); + params.ret_device_len = 0; + params.ret_device = NULL; + params.result = E_NOTIMPL; + wine_unix_call(get_loopback_capture_device, ¶ms); + while (params.result == STATUS_BUFFER_TOO_SMALL) + { + free(params.ret_device); + params.ret_device = malloc(params.ret_device_len); + wine_unix_call(get_loopback_capture_device, ¶ms); + } + free(name); + if (FAILED(params.result)) + { + sessions_unlock(); + free(params.ret_device); + if (params.result == E_NOTIMPL) + FIXME("get_loopback_capture_device is not supported by backend.\n"); + return params.result; + } + free(client->device_name); + client->device_name = params.ret_device; + client->dataflow = eCapture; + } + if (FAILED(params.result = adjust_timing(client, force_def_period, &duration, &period, mode, flags, fmt))) { sessions_unlock(); diff --git a/dlls/mmdevapi/unixlib.h b/dlls/mmdevapi/unixlib.h index d83ed918a51..4cb4c881bcf 100644 --- a/dlls/mmdevapi/unixlib.h +++ b/dlls/mmdevapi/unixlib.h @@ -140,6 +140,15 @@ struct is_format_supported_params HRESULT result; };
+struct get_loopback_capture_device_params +{ + const WCHAR *name; + const char *device; + char *ret_device; + UINT32 ret_device_len; + HRESULT result; +}; + struct get_mix_format_params { const char *device; @@ -313,6 +322,7 @@ enum unix_funcs get_capture_buffer, release_capture_buffer, is_format_supported, + get_loopback_capture_device, get_mix_format, get_device_period, get_buffer_size, diff --git a/dlls/winealsa.drv/alsa.c b/dlls/winealsa.drv/alsa.c index a24cb56d1d8..970db59ad12 100644 --- a/dlls/winealsa.drv/alsa.c +++ b/dlls/winealsa.drv/alsa.c @@ -2491,6 +2491,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = alsa_get_capture_buffer, alsa_release_capture_buffer, alsa_is_format_supported, + alsa_not_implemented, alsa_get_mix_format, alsa_get_device_period, alsa_get_buffer_size, @@ -2947,6 +2948,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = alsa_wow64_get_capture_buffer, alsa_release_capture_buffer, alsa_wow64_is_format_supported, + alsa_not_implemented, alsa_wow64_get_mix_format, alsa_wow64_get_device_period, alsa_wow64_get_buffer_size, diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index deb9df1b45a..db5e1116bf8 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -1837,6 +1837,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = unix_get_capture_buffer, unix_release_capture_buffer, unix_is_format_supported, + unix_not_implemented, unix_get_mix_format, unix_get_device_period, unix_get_buffer_size, @@ -2292,6 +2293,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = unix_wow64_get_capture_buffer, unix_release_capture_buffer, unix_wow64_is_format_supported, + unix_not_implemented, unix_wow64_get_mix_format, unix_wow64_get_device_period, unix_wow64_get_buffer_size, diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index 819e876606c..a017d242a98 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -1691,6 +1691,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = oss_get_capture_buffer, oss_release_capture_buffer, oss_is_format_supported, + oss_not_implemented, oss_get_mix_format, oss_get_device_period, oss_get_buffer_size, @@ -2186,6 +2187,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = oss_wow64_get_capture_buffer, oss_release_capture_buffer, oss_wow64_is_format_supported, + oss_not_implemented, oss_wow64_get_mix_format, oss_wow64_get_device_period, oss_wow64_get_buffer_size, diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c index 068245f03b2..9d3363e2638 100644 --- a/dlls/winepulse.drv/pulse.c +++ b/dlls/winepulse.drv/pulse.c @@ -2536,6 +2536,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = pulse_get_capture_buffer, pulse_release_capture_buffer, pulse_is_format_supported, + pulse_not_implemented, pulse_get_mix_format, pulse_get_device_period, pulse_get_buffer_size, @@ -3007,6 +3008,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = pulse_wow64_get_capture_buffer, pulse_release_capture_buffer, pulse_wow64_is_format_supported, + pulse_not_implemented, pulse_wow64_get_mix_format, pulse_wow64_get_device_period, pulse_wow64_get_buffer_size,