Allow devices with properties and use has_classes

This commit is contained in:
LAGonauta 2021-06-18 07:46:39 -03:00
parent 96fbbdd8bb
commit d7118c1b93
2 changed files with 30 additions and 22 deletions

View file

@ -17,19 +17,19 @@ public class Dino.Plugins.Rtp.Device : MediaDevice, Object {
return plugin.pipe; return plugin.pipe;
}} }}
public string? media { get { public string? media { get {
if (device.device_class.has_prefix("Audio/")) { if (device.has_classes("Audio")) {
return "audio"; return "audio";
} else if (device.device_class.has_prefix("Video/")) { } else if (device.has_classes("Video")) {
return "video"; return "video";
} else { } else {
return null; return null;
} }
}} }}
public bool is_source { get { public bool is_source { get {
return device.device_class.has_suffix("/Source"); return device.has_classes("Source");
}} }}
public bool is_sink { get { public bool is_sink { get {
return device.device_class.has_suffix("/Sink"); return device.has_classes("Sink");
}} }}
private Gst.Element element; private Gst.Element element;

View file

@ -48,12 +48,14 @@ public class Dino.Plugins.Rtp.Plugin : RootInterface, VideoCallPlugin, Object {
device_monitor.get_bus().add_watch(Priority.DEFAULT, on_device_monitor_message); device_monitor.get_bus().add_watch(Priority.DEFAULT, on_device_monitor_message);
device_monitor.start(); device_monitor.start();
foreach (Gst.Device device in device_monitor.get_devices()) { foreach (Gst.Device device in device_monitor.get_devices()) {
if (device.properties != null) {
if (device.properties.has_name("pipewire-proplist") && device.device_class.has_prefix("Audio/")) continue; if (device.properties.has_name("pipewire-proplist") && device.device_class.has_prefix("Audio/")) continue;
if (device.properties.get_string("device.api") == "wasapi") continue; if (device.properties.get_string("device.api") == "wasapi") continue;
if (device.properties.get_string("device.class") == "monitor") continue; if (device.properties.get_string("device.class") == "monitor") continue;
if (devices.any_match((it) => it.matches(device))) continue; if (devices.any_match((it) => it.matches(device))) continue;
devices.add(new Device(this, device)); devices.add(new Device(this, device));
} }
}
pipe = new Gst.Pipeline(null); pipe = new Gst.Pipeline(null);
@ -186,6 +188,7 @@ public class Dino.Plugins.Rtp.Plugin : RootInterface, VideoCallPlugin, Object {
switch (message.type) { switch (message.type) {
case Gst.MessageType.DEVICE_ADDED: case Gst.MessageType.DEVICE_ADDED:
message.parse_device_added(out device); message.parse_device_added(out device);
if (device.properties == null) return Source.CONTINUE;
if (device.properties.has_name("pipewire-proplist") && device.device_class.has_prefix("Audio/")) return Source.CONTINUE; if (device.properties.has_name("pipewire-proplist") && device.device_class.has_prefix("Audio/")) return Source.CONTINUE;
if (device.properties.get_string("device.api") == "wasapi") return Source.CONTINUE; if (device.properties.get_string("device.api") == "wasapi") return Source.CONTINUE;
if (device.properties.get_string("device.class") == "monitor") return Source.CONTINUE; if (device.properties.get_string("device.class") == "monitor") return Source.CONTINUE;
@ -195,6 +198,7 @@ public class Dino.Plugins.Rtp.Plugin : RootInterface, VideoCallPlugin, Object {
#if GST_1_16 #if GST_1_16
case Gst.MessageType.DEVICE_CHANGED: case Gst.MessageType.DEVICE_CHANGED:
message.parse_device_changed(out device, out old_device); message.parse_device_changed(out device, out old_device);
if (device.properties == null) return Source.CONTINUE;
if (device.properties.has_name("pipewire-proplist") && device.device_class.has_prefix("Audio/")) return Source.CONTINUE; if (device.properties.has_name("pipewire-proplist") && device.device_class.has_prefix("Audio/")) return Source.CONTINUE;
if (device.properties.get_string("device.api") == "wasapi") return Source.CONTINUE; if (device.properties.get_string("device.api") == "wasapi") return Source.CONTINUE;
if (device.properties.get_string("device.class") == "monitor") return Source.CONTINUE; if (device.properties.get_string("device.class") == "monitor") return Source.CONTINUE;
@ -204,6 +208,7 @@ public class Dino.Plugins.Rtp.Plugin : RootInterface, VideoCallPlugin, Object {
#endif #endif
case Gst.MessageType.DEVICE_REMOVED: case Gst.MessageType.DEVICE_REMOVED:
message.parse_device_removed(out device); message.parse_device_removed(out device);
if (device.properties == null) return Source.CONTINUE;
if (device.properties.has_name("pipewire-proplist") && device.device_class.has_prefix("Audio/")) return Source.CONTINUE; if (device.properties.has_name("pipewire-proplist") && device.device_class.has_prefix("Audio/")) return Source.CONTINUE;
if (device.properties.get_string("device.api") == "wasapi") return Source.CONTINUE; if (device.properties.get_string("device.api") == "wasapi") return Source.CONTINUE;
if (device.properties.get_string("device.class") == "monitor") return Source.CONTINUE; if (device.properties.get_string("device.class") == "monitor") return Source.CONTINUE;
@ -212,19 +217,22 @@ public class Dino.Plugins.Rtp.Plugin : RootInterface, VideoCallPlugin, Object {
break; break;
} }
if (device != null) { if (device != null) {
switch (device.device_class) { string type = null;
case "Audio/Source": if (device.has_classes("Audio")) {
devices_changed("audio", false); type = "audio";
break; } else if (device.has_classes("Video")) {
case "Audio/Sink": type = "video";
devices_changed("audio", true); }
break;
case "Video/Source": bool? is_sink = null;
devices_changed("video", false); if (device.has_classes("Source")) {
break; is_sink = false;
case "Video/Sink": } else if (device.has_classes("Sink")) {
devices_changed("video", true); is_sink = true;
break; }
if (type != null && is_sink != null) {
devices_changed(type, is_sink);
} }
} }
return Source.CONTINUE; return Source.CONTINUE;