windows: Enable wasapi on windows

This commit is contained in:
Igor Sharonov 2024-04-15 12:21:10 +03:00 committed by Maxim Logaev
parent c438592ab0
commit 2eb0052663
5 changed files with 28 additions and 6 deletions

View file

@ -13,6 +13,7 @@ endif ()
include(CTest)
option(PLUGIN_RTP_WEBRTC_AUDIO_PROCESSING "Use WebRTC audio processing" ON)
option(WITH_WASAPI "Use wasapi instead of directsound on windows" ON)
# https://gitlab.kitware.com/cmake/cmake/-/issues/19804
if (WIN32)

View file

@ -16,3 +16,4 @@ option('plugin-rtp-vp9', type: 'feature', value: 'disabled', description: 'VP9 c
option('plugin-rtp-webrtc-audio-processing', type: 'feature', description: 'Voice preprocessing')
option('use-soup2', type: 'boolean', value: false, description: 'Use libsoup version 2 instead of 3')
option('with-wasapi', type: 'boolean', value: true, description: 'Use wasapi insted of directsound on windows')

View file

@ -58,6 +58,10 @@ if(RTP_ENABLE_MSDK)
set(RTP_DEFINITIONS ${RTP_DEFINITIONS} ENABLE_MSDK)
endif()
if(WIN32 AND WITH_WASAPI)
list(APPEND RTP_DEFINITIONS WITH_WASAPI)
endif()
vala_precompile(RTP_VALA_C
SOURCES
src/codec_util.vala

View file

@ -55,5 +55,8 @@ endif
if get_option('plugin-rtp-vp9').allowed()
vala_args += ['-D', 'ENABLE_VP9']
endif
if host_machine.system() == 'windows' and get_option('with-wasapi')
vala_args += ['-D', 'WITH_WASAPI']
endif
lib_rtp = shared_library('rtp', sources, name_prefix: '', c_args: c_args, vala_args: vala_args, include_directories: include_directories('src'), dependencies: dependencies, kwargs: install_options)
dep_rtp = declare_dependency(link_with: lib_rtp, include_directories: include_directories('.'))

View file

@ -42,6 +42,19 @@ public class Dino.Plugins.Rtp.Plugin : RootInterface, VideoCallPlugin, Object {
if (pause_count < 0) warning("Pause count below zero!");
}
private bool is_skipped(Gst.Device device) {
bool is_noprops = device.properties == null;
#if WITH_WASAPI
bool is_disabled_sound = device.properties.get_string("device.api") == "directsound";
#else
bool is_disabled_sound = device.properties.get_string("device.api") == "wasapi";
#endif
bool is_proplist = device.properties.has_name("pipewire-proplist") && device.has_classes("Audio");
bool is_monitor = device.properties.get_string("device.class") == "monitor";
bool is_in_devices = devices.any_match((it) => it.matches(device));
return is_noprops || is_disabled_sound || is_proplist || is_monitor || is_in_devices;
}
private void init_device_monitor() {
if (device_monitor != null) return;
device_monitor = new Gst.DeviceMonitor();
@ -49,11 +62,8 @@ public class Dino.Plugins.Rtp.Plugin : RootInterface, VideoCallPlugin, Object {
device_monitor.get_bus().add_watch(Priority.DEFAULT, on_device_monitor_message);
device_monitor.start();
foreach (Gst.Device device in device_monitor.get_devices()) {
if (device.properties == null) continue;
if (device.properties.get_string("device.api") == "wasapi") continue;
if (device.properties.has_name("pipewire-proplist") && device.has_classes("Audio")) continue;
if (device.properties.get_string("device.class") == "monitor") continue;
if (devices.any_match((it) => it.matches(device))) continue;
if (is_skipped(device)) continue;
debug(@"(Init) Add name=$(device.name) device=$(device.display_name)");
devices.add(new Device(this, device));
}
}
@ -227,20 +237,23 @@ public class Dino.Plugins.Rtp.Plugin : RootInterface, VideoCallPlugin, Object {
switch (message.type) {
case Gst.MessageType.DEVICE_ADDED:
message.parse_device_added(out gst_device);
if (devices.any_match((it) => it.matches(gst_device))) return Source.CONTINUE;
if (is_skipped(gst_device)) return Source.CONTINUE;
device = new Device(this, gst_device);
debug(@"(Notify) Add name=$(gst_device.name) device=$(gst_device.display_name)");
devices.add(device);
break;
#if GST_1_16
case Gst.MessageType.DEVICE_CHANGED:
message.parse_device_changed(out gst_device, out old_gst_device);
device = devices.first_match((it) => it.matches(old_gst_device));
debug(@"(Notify) Change name=$(gst_device.name) device=$(gst_device.display_name)");
if (device != null) device.update(gst_device);
break;
#endif
case Gst.MessageType.DEVICE_REMOVED:
message.parse_device_removed(out gst_device);
device = devices.first_match((it) => it.matches(gst_device));
debug(@"(Notify) Remove name=$(gst_device.name) device=$(gst_device.display_name)");
if (device != null) devices.remove(device);
break;
default: