summaryrefslogtreecommitdiff
path: root/src/wireplumber.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wireplumber.c')
-rw-r--r--src/wireplumber.c83
1 files changed, 67 insertions, 16 deletions
diff --git a/src/wireplumber.c b/src/wireplumber.c
index 8c52bf2..d50da83 100644
--- a/src/wireplumber.c
+++ b/src/wireplumber.c
@@ -1,9 +1,9 @@
-#include "wireplumber.h"
-
#include <wp/wp.h>
+#include "audio.h"
#include "endpoint-private.h"
#include "glib-object.h"
+#include "glib.h"
#include "wp.h"
struct _AstalWpWp {
@@ -34,6 +34,16 @@ static guint astal_wp_wp_signals[ASTAL_WP_WP_N_SIGNALS] = {
0,
};
+typedef enum {
+ ASTAL_WP_WP_PROP_AUDIO = 1,
+ ASTAL_WP_WP_PROP_ENDPOINTS,
+ ASTAL_WP_WP_N_PROPERTIES,
+} AstalWpWpProperties;
+
+static GParamSpec *astal_wp_wp_properties[ASTAL_WP_WP_N_PROPERTIES] = {
+ NULL,
+};
+
/**
* astal_wp_wp_get_endpoint:
* @self: the AstalWpWp object
@@ -48,18 +58,41 @@ AstalWpEndpoint *astal_wp_wp_get_endpoint(AstalWpWp *self, guint id) {
return endpoint;
}
-static void astal_wp_wp_default_changed(AstalWpWp *self) {
+/**
+ * astal_wp_wp_get_endpoints:
+ * @self: the AstalWpWp object
+ *
+ * Returns: (transfer container) (nullable) (type GList(AstalWpEndpoint)): a GList containing the
+ * endpoints
+ */
+GList *astal_wp_wp_get_endpoints(AstalWpWp *self) {
AstalWpWpPrivate *priv = astal_wp_wp_get_instance_private(self);
+ return g_hash_table_get_values(priv->endpoints);
+}
- guint defaultSinkId;
- guint defaultSourceId;
-
- g_signal_emit_by_name(priv->defaults, "get-default-node", "Audio/Sink", &defaultSinkId);
- g_signal_emit_by_name(priv->defaults, "get-default-node", "Audio/Source", &defaultSourceId);
+/**
+ * astal_wp_wp_get_audio
+ *
+ * Returns: (nullable) (transfer none): gets the audio object
+ */
+AstalWpAudio *astal_wp_wp_get_audio() { return astal_wp_audio_get_default(); }
- g_print("default nodes: sink: %d, source: %d\n", defaultSinkId, defaultSourceId);
+static void astal_wp_wp_get_property(GObject *object, guint property_id, GValue *value,
+ GParamSpec *pspec) {
+ AstalWpWp *self = ASTAL_WP_WP(object);
+ AstalWpWpPrivate *priv = astal_wp_wp_get_instance_private(self);
- g_signal_emit_by_name(self, "changed");
+ switch (property_id) {
+ case ASTAL_WP_WP_PROP_AUDIO:
+ g_value_set_object(value, astal_wp_wp_get_audio());
+ break;
+ case ASTAL_WP_WP_PROP_ENDPOINTS:
+ g_value_set_pointer(value, g_hash_table_get_values(priv->endpoints));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
+ break;
+ }
}
static void astal_wp_wp_object_added(AstalWpWp *self, gpointer object) {
@@ -79,12 +112,13 @@ static void astal_wp_wp_object_added(AstalWpWp *self, gpointer object) {
AstalWpWpPrivate *priv = astal_wp_wp_get_instance_private(self);
WpNode *node = WP_NODE(object);
- AstalWpEndpoint *endpoint = astal_wp_endpoint_create(node, priv->mixer);
+ AstalWpEndpoint *endpoint = astal_wp_endpoint_create(node, priv->mixer, priv->defaults);
g_hash_table_insert(priv->endpoints, GUINT_TO_POINTER(wp_proxy_get_bound_id(WP_PROXY(node))),
endpoint);
g_signal_emit_by_name(self, "endpoint-added", endpoint);
+ g_object_notify(G_OBJECT(self), "endpoints");
g_signal_emit_by_name(self, "changed");
}
@@ -100,6 +134,7 @@ static void astal_wp_wp_object_removed(AstalWpWp *self, gpointer object) {
g_hash_table_remove(priv->endpoints, GUINT_TO_POINTER(id));
g_signal_emit_by_name(self, "endpoint-removed", endpoint);
+ g_object_notify(G_OBJECT(self), "endpoints");
g_signal_emit_by_name(self, "changed");
}
@@ -135,8 +170,8 @@ static void astal_wp_wp_plugin_activated(WpObject *obj, GAsyncResult *result, As
g_signal_connect_swapped(priv->mixer, "changed", (GCallback)astal_wp_wp_mixer_changed,
self);
- g_signal_connect_swapped(priv->defaults, "changed", (GCallback)astal_wp_wp_default_changed,
- self);
+ // g_signal_connect_swapped(priv->defaults, "changed",
+ // (GCallback)astal_wp_wp_default_changed, self);
g_signal_connect_swapped(priv->obj_manager, "object-added",
G_CALLBACK(astal_wp_wp_object_added), self);
@@ -214,13 +249,14 @@ static void astal_wp_wp_init(AstalWpWp *self) {
}
priv->obj_manager = wp_object_manager_new();
+ wp_object_manager_request_object_features(priv->obj_manager, WP_TYPE_NODE,
+ WP_OBJECT_FEATURES_ALL);
wp_object_manager_add_interest(priv->obj_manager, WP_TYPE_NODE, WP_CONSTRAINT_TYPE_PW_PROPERTY,
"media.class", "=s", "Audio/Sink", NULL);
wp_object_manager_add_interest(priv->obj_manager, WP_TYPE_NODE, WP_CONSTRAINT_TYPE_PW_PROPERTY,
"media.class", "=s", "Audio/Source", NULL);
- wp_object_manager_add_interest(priv->obj_manager, WP_TYPE_NODE,
- WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY, "media.class", "=s",
- "Stream/Output/Audio", NULL);
+ wp_object_manager_add_interest(priv->obj_manager, WP_TYPE_NODE, WP_CONSTRAINT_TYPE_PW_PROPERTY,
+ "media.class", "=s", "Stream/Output/Audio", NULL);
wp_object_manager_add_interest(priv->obj_manager, WP_TYPE_NODE, WP_CONSTRAINT_TYPE_PW_PROPERTY,
"media.class", "=s", "Stream/Input/Audio", NULL);
@@ -239,6 +275,21 @@ static void astal_wp_wp_class_init(AstalWpWpClass *class) {
GObjectClass *object_class = G_OBJECT_CLASS(class);
object_class->finalize = astal_wp_wp_finalize;
object_class->dispose = astal_wp_wp_dispose;
+ object_class->get_property = astal_wp_wp_get_property;
+
+ astal_wp_wp_properties[ASTAL_WP_WP_PROP_AUDIO] =
+ g_param_spec_object("audio", "audio", "audio", ASTAL_WP_TYPE_AUDIO, G_PARAM_READABLE);
+
+ /**
+ * AstalWpWp:endpoints: (type GList(AstalWpEndpoint)) (transfer container)
+ *
+ * A list of AstalWpEndpoint objects
+ */
+ astal_wp_wp_properties[ASTAL_WP_WP_PROP_ENDPOINTS] =
+ g_param_spec_pointer("endpoints", "endpoints", "endpoints", G_PARAM_READABLE);
+
+ g_object_class_install_properties(object_class, ASTAL_WP_WP_N_PROPERTIES,
+ astal_wp_wp_properties);
astal_wp_wp_signals[ASTAL_WP_WP_SIGNAL_ENDPOINT_ADDED] =
g_signal_new("endpoint-added", G_TYPE_FROM_CLASS(class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL,