Skip to content
Snippets Groups Projects
Commit 453f9a34 authored by Julian Bouzas's avatar Julian Bouzas
Browse files

wpctl: implement set-default using the metadata API

parent f0d74401
No related branches found
No related tags found
No related merge requests found
...@@ -11,6 +11,9 @@ ...@@ -11,6 +11,9 @@
#include <pipewire/keys.h> #include <pipewire/keys.h>
#include <pipewire/extensions/session-manager/keys.h> #include <pipewire/extensions/session-manager/keys.h>
#define default_endpoint_key(dir) ((dir == WP_DIRECTION_INPUT) ? \
"default.session.endpoint.sink" : "default.session.endpoint.source")
typedef struct _WpCtl WpCtl; typedef struct _WpCtl WpCtl;
struct _WpCtl struct _WpCtl
{ {
...@@ -32,11 +35,9 @@ static struct { ...@@ -32,11 +35,9 @@ static struct {
gboolean show_referenced; gboolean show_referenced;
gboolean show_associated; gboolean show_associated;
} inspect; } inspect;
#if 0
struct { struct {
guint32 id; guint32 id;
} set_default; } set_default;
#endif
struct { struct {
guint32 id; guint32 id;
gfloat volume; gfloat volume;
...@@ -76,8 +77,11 @@ async_quit (WpCore *core, GAsyncResult *res, WpCtl * self) ...@@ -76,8 +77,11 @@ async_quit (WpCore *core, GAsyncResult *res, WpCtl * self)
static gboolean static gboolean
status_prepare (WpCtl * self, GError ** error) status_prepare (WpCtl * self, GError ** error)
{ {
wp_object_manager_add_interest (self->om, WP_TYPE_METADATA, NULL);
wp_object_manager_add_interest (self->om, WP_TYPE_SESSION, NULL); wp_object_manager_add_interest (self->om, WP_TYPE_SESSION, NULL);
wp_object_manager_add_interest (self->om, WP_TYPE_CLIENT, NULL); wp_object_manager_add_interest (self->om, WP_TYPE_CLIENT, NULL);
wp_object_manager_request_object_features (self->om, WP_TYPE_METADATA,
WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL);
wp_object_manager_request_object_features (self->om, WP_TYPE_SESSION, wp_object_manager_request_object_features (self->om, WP_TYPE_SESSION,
WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL | WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL |
WP_SESSION_FEATURE_ENDPOINTS | WP_SESSION_FEATURE_ENDPOINTS |
...@@ -194,6 +198,9 @@ status_run (WpCtl * self) ...@@ -194,6 +198,9 @@ status_run (WpCtl * self)
{ {
g_autoptr (WpIterator) it = NULL; g_autoptr (WpIterator) it = NULL;
g_auto (GValue) val = G_VALUE_INIT; g_auto (GValue) val = G_VALUE_INIT;
g_autoptr (WpMetadata) metadata = NULL;
metadata = wp_object_manager_lookup (self->om, WP_TYPE_METADATA, NULL);
/* server + clients */ /* server + clients */
printf ("PipeWire '%s' [%s, %s@%s, cookie:%u]\n", printf ("PipeWire '%s' [%s, %s@%s, cookie:%u]\n",
...@@ -225,15 +232,27 @@ status_run (WpCtl * self) ...@@ -225,15 +232,27 @@ status_run (WpCtl * self)
it = wp_object_manager_iterate_filtered (self->om, WP_TYPE_SESSION, NULL); it = wp_object_manager_iterate_filtered (self->om, WP_TYPE_SESSION, NULL);
for (; wp_iterator_next (it, &val); g_value_unset (&val)) { for (; wp_iterator_next (it, &val); g_value_unset (&val)) {
WpSession *session = g_value_get_object (&val); WpSession *session = g_value_get_object (&val);
guint session_id = wp_proxy_get_bound_id (WP_PROXY (session));
g_autoptr (WpIterator) child_it = NULL; g_autoptr (WpIterator) child_it = NULL;
guint32 default_sink = 0; guint32 default_sink = 0;
// wp_session_get_default_endpoint (session, WP_DIRECTION_INPUT);
guint32 default_source = 0; guint32 default_source = 0;
// wp_session_get_default_endpoint (session, WP_DIRECTION_OUTPUT);
printf ("Session %u (%s)\n", /* find default sink and source endpoints if metadata was found */
wp_proxy_get_bound_id (WP_PROXY (session)), if (metadata) {
wp_session_get_name (session)); g_autoptr (WpIterator) m_it = NULL;
g_auto (GValue) m_val = G_VALUE_INIT;
m_it = wp_metadata_iterate (metadata, session_id);
for (; wp_iterator_next (m_it, &m_val); g_value_unset (&m_val)) {
const gchar *k = NULL, *v = NULL;
wp_metadata_iterator_item_extract (&m_val, NULL, &k, NULL, &v);
if (!g_strcmp0 (k, default_endpoint_key (WP_DIRECTION_INPUT)))
default_sink = atoi (v);
else if (!g_strcmp0 (k, default_endpoint_key (WP_DIRECTION_OUTPUT)))
default_source = atoi (v);
}
}
printf ("Session %u (%s)\n", session_id, wp_session_get_name (session));
printf (TREE_INDENT_NODE "Sink endpoints:\n"); printf (TREE_INDENT_NODE "Sink endpoints:\n");
child_it = wp_session_iterate_endpoints_filtered (session, child_it = wp_session_iterate_endpoints_filtered (session,
...@@ -492,7 +511,6 @@ out_err: ...@@ -492,7 +511,6 @@ out_err:
} }
/* set-default */ /* set-default */
#if 0
static gboolean static gboolean
set_default_parse_positional (gint argc, gchar ** argv, GError **error) set_default_parse_positional (gint argc, gchar ** argv, GError **error)
{ {
...@@ -515,12 +533,12 @@ set_default_parse_positional (gint argc, gchar ** argv, GError **error) ...@@ -515,12 +533,12 @@ set_default_parse_positional (gint argc, gchar ** argv, GError **error)
static gboolean static gboolean
set_default_prepare (WpCtl * self, GError ** error) set_default_prepare (WpCtl * self, GError ** error)
{ {
wp_object_manager_add_interest (self->om, WP_TYPE_SESSION, NULL); wp_object_manager_add_interest (self->om, WP_TYPE_METADATA, NULL);
wp_object_manager_add_interest (self->om, WP_TYPE_ENDPOINT, wp_object_manager_add_interest (self->om, WP_TYPE_ENDPOINT,
WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY, WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY,
"object.id", "=u", cmdline.set_default.id, "object.id", "=u", cmdline.set_default.id,
NULL); NULL);
wp_object_manager_request_object_features (self->om, WP_TYPE_SESSION, wp_object_manager_request_object_features (self->om, WP_TYPE_METADATA,
WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL); WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL);
wp_object_manager_request_object_features (self->om, WP_TYPE_ENDPOINT, wp_object_manager_request_object_features (self->om, WP_TYPE_ENDPOINT,
WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL); WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL);
...@@ -531,28 +549,29 @@ static void ...@@ -531,28 +549,29 @@ static void
set_default_run (WpCtl * self) set_default_run (WpCtl * self)
{ {
g_autoptr (WpEndpoint) ep = NULL; g_autoptr (WpEndpoint) ep = NULL;
g_autoptr (WpSession) session = NULL; g_autoptr (WpMetadata) metadata = NULL;
guint32 id = cmdline.set_default.id; guint32 id = cmdline.set_default.id;
const gchar *sess_id_str; const gchar *sess_id_str;
g_autofree gchar *ep_id_str = NULL;
guint32 sess_id; guint32 sess_id;
WpDirection dir; WpDirection dir;
metadata = wp_object_manager_lookup (self->om, WP_TYPE_METADATA, NULL);
if (!metadata) {
printf ("No metadata found\n");
goto out;
}
ep = wp_object_manager_lookup (self->om, WP_TYPE_ENDPOINT, NULL); ep = wp_object_manager_lookup (self->om, WP_TYPE_ENDPOINT, NULL);
if (!ep) { if (!ep) {
printf ("Endpoint '%d' not found\n", id); printf ("Endpoint '%d' not found\n", id);
goto out; goto out;
} }
sess_id_str = wp_proxy_get_property (WP_PROXY (ep), "session.id"); sess_id_str = wp_pipewire_object_get_property (WP_PIPEWIRE_OBJECT (ep),
"session.id");
sess_id = sess_id_str ? atoi (sess_id_str) : 0; sess_id = sess_id_str ? atoi (sess_id_str) : 0;
session = wp_object_manager_lookup (self->om, WP_TYPE_SESSION,
WP_CONSTRAINT_TYPE_G_PROPERTY, "bound-id", "=u", sess_id, NULL);
if (!session) {
printf ("Endpoint %u has invalid session id %u\n", id, sess_id);
goto out;
}
if (g_str_has_suffix (wp_endpoint_get_media_class (ep), "/Sink")) if (g_str_has_suffix (wp_endpoint_get_media_class (ep), "/Sink"))
dir = WP_DIRECTION_INPUT; dir = WP_DIRECTION_INPUT;
else if (g_str_has_suffix (wp_endpoint_get_media_class (ep), "/Source")) else if (g_str_has_suffix (wp_endpoint_get_media_class (ep), "/Source"))
...@@ -563,7 +582,9 @@ set_default_run (WpCtl * self) ...@@ -563,7 +582,9 @@ set_default_run (WpCtl * self)
goto out; goto out;
} }
wp_session_set_default_endpoint (session, dir, id); ep_id_str = g_strdup_printf ("%d", id);
wp_metadata_set (metadata, sess_id, default_endpoint_key (dir), "Spa:Int",
ep_id_str);
wp_core_sync (self->core, NULL, (GAsyncReadyCallback) async_quit, self); wp_core_sync (self->core, NULL, (GAsyncReadyCallback) async_quit, self);
return; return;
...@@ -571,7 +592,6 @@ out: ...@@ -571,7 +592,6 @@ out:
self->exit_code = 3; self->exit_code = 3;
g_main_loop_quit (self->loop); g_main_loop_quit (self->loop);
} }
#endif
/* set-volume */ /* set-volume */
...@@ -852,7 +872,6 @@ static const struct subcommand { ...@@ -852,7 +872,6 @@ static const struct subcommand {
.prepare = inspect_prepare, .prepare = inspect_prepare,
.run = inspect_run, .run = inspect_run,
}, },
#if 0
{ {
.name = "set-default", .name = "set-default",
.positional_args = "ID", .positional_args = "ID",
...@@ -864,7 +883,6 @@ static const struct subcommand { ...@@ -864,7 +883,6 @@ static const struct subcommand {
.prepare = set_default_prepare, .prepare = set_default_prepare,
.run = set_default_run, .run = set_default_run,
}, },
#endif
{ {
.name = "set-volume", .name = "set-volume",
.positional_args = "ID VOL", .positional_args = "ID VOL",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment