diff options
author | kotontrion <[email protected]> | 2024-07-20 15:53:07 +0200 |
---|---|---|
committer | kotontrion <[email protected]> | 2024-07-20 15:53:07 +0200 |
commit | af2ae01f168d3eb1f622de0112c959e1390883e0 (patch) | |
tree | 4629758737435217bf4725ecbf647ce9125bddb5 /src/audio.c | |
parent | 86bff65898178fe6e58e8d02c9b6e588003621bc (diff) |
add audio devices and profiles
Diffstat (limited to 'src/audio.c')
-rw-r--r-- | src/audio.c | 86 |
1 files changed, 74 insertions, 12 deletions
diff --git a/src/audio.c b/src/audio.c index 53224a7..081bb6c 100644 --- a/src/audio.c +++ b/src/audio.c @@ -2,6 +2,7 @@ #include <wp/wp.h> +#include "device.h" #include "endpoint.h" #include "wp.h" @@ -25,6 +26,8 @@ typedef enum { ASTAL_WP_AUDIO_SIGNAL_STREAM_REMOVED, ASTAL_WP_AUDIO_SIGNAL_RECORDER_ADDED, ASTAL_WP_AUDIO_SIGNAL_RECORDER_REMOVED, + ASTAL_WP_AUDIO_SIGNAL_DEVICE_ADDED, + ASTAL_WP_AUDIO_SIGNAL_DEVICE_REMOVED, ASTAL_WP_AUDIO_N_SIGNALS } AstalWpWpSignals; @@ -37,6 +40,7 @@ typedef enum { ASTAL_WP_AUDIO_PROP_SPEAKERS, ASTAL_WP_AUDIO_PROP_STREAMS, ASTAL_WP_AUDIO_PROP_RECORDERS, + ASTAL_WP_AUDIO_PROP_DEVICES, ASTAL_WP_AUDIO_PROP_DEFAULT_SPEAKER, ASTAL_WP_AUDIO_PROP_DEFAULT_MICROPHONE, ASTAL_WP_AUDIO_N_PROPERTIES, @@ -111,6 +115,19 @@ AstalWpEndpoint *astal_wp_audio_get_stream(AstalWpAudio *self, guint id) { } /** + * astal_wp_audio_get_device: + * @self: the AstalWpAudio object + * @id: the id of the device + * + * Returns: (transfer none) (nullable): the device with the given id + */ +AstalWpDevice *astal_wp_audio_get_device(AstalWpAudio *self, guint id) { + AstalWpAudioPrivate *priv = astal_wp_audio_get_instance_private(self); + + return astal_wp_wp_get_device(priv->wp, id); +} + +/** * astal_wp_audio_get_microphones: * @self: the AstalWpAudio object * @@ -195,6 +212,28 @@ GList *astal_wp_audio_get_streams(AstalWpAudio *self) { } /** + * astal_wp_audio_get_devices: + * @self: the AstalWpAudio object + * + * Returns: (transfer container) (nullable) (type GList(AstalWpDevice)): a GList containing the + * devices + */ +GList *astal_wp_audio_get_devices(AstalWpAudio *self) { + AstalWpAudioPrivate *priv = astal_wp_audio_get_instance_private(self); + GList *eps = astal_wp_wp_get_devices(priv->wp); + // GList *mics = NULL; + + // for (GList *l = eps; l != NULL; l = l->next) { + // if (astal_wp_endpoint_get_media_class(l->data) == ASTAL_WP_MEDIA_CLASS_AUDIO_MICROPHONE) { + // mics = g_list_append(mics, l->data); + // } + // } + // g_list_free(eps); + // return mics; + return eps; +} + +/** * astal_wp_audio_get_endpoint: * @self: the AstalWpAudio object * @id: the id of the endpoint @@ -248,6 +287,9 @@ static void astal_wp_audio_get_property(GObject *object, guint property_id, GVal case ASTAL_WP_AUDIO_PROP_DEFAULT_SPEAKER: g_value_set_object(value, astal_wp_audio_get_default_speaker(self)); break; + case ASTAL_WP_AUDIO_PROP_DEVICES: + g_value_set_pointer(value, astal_wp_audio_get_devices(self)); + break; case ASTAL_WP_AUDIO_PROP_DEFAULT_MICROPHONE: g_value_set_object(value, astal_wp_audio_get_default_microphone(self)); break; @@ -257,6 +299,20 @@ static void astal_wp_audio_get_property(GObject *object, guint property_id, GVal } } +static void astal_wp_audio_device_added(AstalWpAudio *self, gpointer object) { + AstalWpDevice *endpoint = ASTAL_WP_DEVICE(object); + g_signal_emit_by_name(self, "device-added", endpoint); + g_object_notify(G_OBJECT(self), "devices"); + g_signal_emit_by_name(self, "changed"); +} + +static void astal_wp_audio_device_removed(AstalWpAudio *self, gpointer object) { + AstalWpDevice *endpoint = ASTAL_WP_DEVICE(object); + g_signal_emit_by_name(self, "device-removed", endpoint); + g_object_notify(G_OBJECT(self), "devices"); + g_signal_emit_by_name(self, "changed"); +} + static void astal_wp_audio_object_added(AstalWpAudio *self, gpointer object) { AstalWpEndpoint *endpoint = ASTAL_WP_ENDPOINT(object); switch (astal_wp_endpoint_get_media_class(endpoint)) { @@ -325,16 +381,6 @@ AstalWpAudio *astal_wp_audio_get_default() { */ AstalWpAudio *astal_wp_get_default_audio() { return astal_wp_audio_get_default(); } -static void astal_wp_audio_dispose(GObject *object) { - AstalWpAudio *self = ASTAL_WP_AUDIO(object); - AstalWpAudioPrivate *priv = astal_wp_audio_get_instance_private(self); -} - -static void astal_wp_audio_finalize(GObject *object) { - AstalWpAudio *self = ASTAL_WP_AUDIO(object); - AstalWpAudioPrivate *priv = astal_wp_audio_get_instance_private(self); -} - static void astal_wp_audio_init(AstalWpAudio *self) { AstalWpAudioPrivate *priv = astal_wp_audio_get_instance_private(self); @@ -344,12 +390,14 @@ static void astal_wp_audio_init(AstalWpAudio *self) { self); g_signal_connect_swapped(priv->wp, "endpoint-removed", G_CALLBACK(astal_wp_audio_object_removed), self); + g_signal_connect_swapped(priv->wp, "device-added", G_CALLBACK(astal_wp_audio_device_added), + self); + g_signal_connect_swapped(priv->wp, "device-removed", G_CALLBACK(astal_wp_audio_device_removed), + self); } static void astal_wp_audio_class_init(AstalWpAudioClass *class) { GObjectClass *object_class = G_OBJECT_CLASS(class); - object_class->finalize = astal_wp_audio_finalize; - object_class->dispose = astal_wp_audio_dispose; object_class->get_property = astal_wp_audio_get_property; /** @@ -381,6 +429,13 @@ static void astal_wp_audio_class_init(AstalWpAudioClass *class) { astal_wp_audio_properties[ASTAL_WP_AUDIO_PROP_STREAMS] = g_param_spec_pointer("streams", "streams", "streams", G_PARAM_READABLE); /** + * AstalWpAudio:devices: (type GList(AstalWpDevice)) (transfer container) + * + * A list of AstalWpEndpoint objects + */ + astal_wp_audio_properties[ASTAL_WP_AUDIO_PROP_DEVICES] = + g_param_spec_pointer("devices", "devices", "devices", G_PARAM_READABLE); + /** * AstalWpAudio:default-speaker: * * The AstalWndpoint object representing the default speaker @@ -424,6 +479,13 @@ static void astal_wp_audio_class_init(AstalWpAudioClass *class) { astal_wp_audio_signals[ASTAL_WP_AUDIO_SIGNAL_RECORDER_REMOVED] = g_signal_new("recorder-removed", G_TYPE_FROM_CLASS(class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, ASTAL_WP_TYPE_ENDPOINT); + astal_wp_audio_signals[ASTAL_WP_AUDIO_SIGNAL_DEVICE_ADDED] = + g_signal_new("device-added", G_TYPE_FROM_CLASS(class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, + NULL, G_TYPE_NONE, 1, ASTAL_WP_TYPE_DEVICE); + astal_wp_audio_signals[ASTAL_WP_AUDIO_SIGNAL_MICROPHONE_REMOVED] = + g_signal_new("device-removed", G_TYPE_FROM_CLASS(class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, + NULL, G_TYPE_NONE, 1, ASTAL_WP_TYPE_DEVICE); + astal_wp_audio_signals[ASTAL_WP_AUDIO_SIGNAL_CHANGED] = g_signal_new("changed", G_TYPE_FROM_CLASS(class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0); |