From 1f32c956712256f95e2fed5643f1f2c2560a1d22 Mon Sep 17 00:00:00 2001 From: Julian Bouzas Date: Thu, 29 Aug 2019 15:00:51 -0400 Subject: [PATCH] bluez: set media class to Bluez// and create softdsp-endpoints --- modules/module-pw-bluez.c | 51 +++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/modules/module-pw-bluez.c b/modules/module-pw-bluez.c index b18f07e8..53ff28fe 100644 --- a/modules/module-pw-bluez.c +++ b/modules/module-pw-bluez.c @@ -37,13 +37,13 @@ on_endpoint_created(GObject *initable, GAsyncResult *res, gpointer d) /* Check for error */ if (error) { g_clear_object (&endpoint); - g_warning ("Failed to create alsa endpoint: %s", error->message); + g_warning ("Failed to create bluez endpoint: %s", error->message); return; } /* Get the endpoint global id */ g_object_get (endpoint, "global-id", &global_id, NULL); - g_debug ("Created alsa endpoint for global id %d", global_id); + g_debug ("Created bluez endpoint for global id %d", global_id); /* Register the endpoint and add it to the table */ wp_endpoint_register (endpoint); @@ -58,7 +58,7 @@ on_node_added(WpRemotePipewire *rp, guint id, guint parent_id, gconstpointer p, struct impl *impl = d; const struct spa_dict *props = p; g_autoptr (WpCore) core = wp_module_get_core (impl->module); - const gchar *media_class, *name; + const gchar *media_class, *bluez_media_class, *name; enum pw_direction direction; GVariantBuilder b; g_autoptr (GVariant) endpoint_props = NULL; @@ -68,27 +68,39 @@ on_node_added(WpRemotePipewire *rp, guint id, guint parent_id, gconstpointer p, /* Get the name and media_class */ media_class = spa_dict_lookup(props, "media.class"); - - /* Make sure the media class is non-dsp audio */ - if (!g_str_has_prefix (media_class, "Audio/")) - return; - if (g_str_has_prefix (media_class, "Audio/DSP")) - return; - - /* Get the name */ name = spa_dict_lookup (props, "media.name"); if (!name) name = spa_dict_lookup (props, "node.name"); /* Make sure we only handle bluetooth nodes */ - if (!g_str_has_prefix (name, "api.bluez5")) + if (!g_str_has_prefix (name, "bluez5")) return; - /* Get the direction */ - if (g_str_has_prefix (media_class, "Bluez/Sink")) { + /* Get the direction and bluez media class */ + if (g_str_has_prefix (media_class, "Audio/Sink")) { direction = PW_DIRECTION_INPUT; - } else if (g_str_has_prefix (media_class, "Bluez/Source")) { + if (g_str_has_prefix (name, "bluez5.a2dp")) { + bluez_media_class = "Bluez/Sink/A2dp"; + } else if (g_str_has_prefix (name, "bluez5.headunit")) { + bluez_media_class = "Bluez/Sink/Headunit"; + } else if (g_str_has_prefix (name, "bluez5.gateway")) { + bluez_media_class = "Bluez/Sink/Gateway"; + } else { + g_critical ("failed to parse bluez profile"); + return; + } + } else if (g_str_has_prefix (media_class, "Audio/Source")) { direction = PW_DIRECTION_OUTPUT; + if (g_str_has_prefix (name, "bluez5.a2dp")) { + bluez_media_class = "Bluez/Source/A2dp"; + } else if (g_str_has_prefix (name, "bluez5.headunit")) { + bluez_media_class = "Bluez/Source/Headunit"; + } else if (g_str_has_prefix (name, "bluez5.gateway")) { + bluez_media_class = "Bluez/Source/Gateway"; + } else { + g_critical ("failed to parse bluez profile"); + return; + } } else { g_critical ("failed to parse bluez direction"); return; @@ -97,16 +109,19 @@ on_node_added(WpRemotePipewire *rp, guint id, guint parent_id, gconstpointer p, /* Set the properties */ g_variant_builder_init (&b, G_VARIANT_TYPE_VARDICT); g_variant_builder_add (&b, "{sv}", - "name", g_variant_new_string (name)); + "name", name ? + g_variant_new_take_string (g_strdup_printf ("Bluez %u (%s)", id, name)) : + g_variant_new_take_string (g_strdup_printf ("Bluez %u", id))); g_variant_builder_add (&b, "{sv}", - "media-class", g_variant_new_string (media_class)); + "media-class", g_variant_new_string (bluez_media_class)); g_variant_builder_add (&b, "{sv}", "direction", g_variant_new_uint32 (direction)); g_variant_builder_add (&b, "{sv}", "global-id", g_variant_new_uint32 (id)); + endpoint_props = g_variant_builder_end (&b); /* Create the endpoint async */ - wp_factory_make (core, "pipewire-simple-endpoint", WP_TYPE_ENDPOINT, + wp_factory_make (core, "pw-audio-softdsp-endpoint", WP_TYPE_ENDPOINT, endpoint_props, on_endpoint_created, impl); }