[pulseaudio-commits] 2 commits - src/modules

Tanu Kaskinen tanuk at kemper.freedesktop.org
Wed Oct 11 15:38:39 UTC 2017


 src/modules/raop/module-raop-discover.c |   39 ++++++------
 src/modules/raop/raop-sink.c            |  101 ++++++++++++++++++++++++++++++++
 2 files changed, 123 insertions(+), 17 deletions(-)

New commits:
commit 937b3769b31a60de4cb5c484fd63eaf6c57ee333
Author: Colin Leroy <colin at colino.net>
Date:   Mon Oct 9 09:42:27 2017 +0200

    raop: Init dummy port and card for latency change
    
    This adds a port, card and profile to RAOP sinks to make it
    possible to change the latency at runtime (and have it persist)
    using pavucontrol or pactl set-port-latency-offset.
    
    Also move the IP:port part of the sink name to the port name.

diff --git a/src/modules/raop/module-raop-discover.c b/src/modules/raop/module-raop-discover.c
index b0c3eaa4..52919e65 100644
--- a/src/modules/raop/module-raop-discover.c
+++ b/src/modules/raop/module-raop-discover.c
@@ -299,10 +299,10 @@ static void resolver_cb(
 
     args = pa_sprintf_malloc("server=[%s]:%u "
                              "sink_name=%s "
-                             "sink_properties='device.description=\"%s (%s:%u)\" device.model=\"%s\"'",
+                             "sink_properties='device.description=\"%s\" device.model=\"%s\"'",
                              at, port,
                              vname,
-                             nicename, at, port,
+                             nicename,
                              dm);
     pa_xfree(nicename);
     pa_xfree(dm);
diff --git a/src/modules/raop/raop-sink.c b/src/modules/raop/raop-sink.c
index cd90e3d9..936129cf 100644
--- a/src/modules/raop/raop-sink.c
+++ b/src/modules/raop/raop-sink.c
@@ -69,6 +69,7 @@ struct userdata {
     pa_core *core;
     pa_module *module;
     pa_sink *sink;
+    pa_card *card;
 
     pa_thread *thread;
     pa_thread_mq thread_mq;
@@ -465,6 +466,77 @@ finish:
     pa_log_debug("Thread shutting down");
 }
 
+static int sink_set_port_cb(pa_sink *s, pa_device_port *p) {
+    return 0;
+}
+
+static pa_device_port *raop_create_port(struct userdata *u, const char *server) {
+    pa_device_port_new_data data;
+    pa_device_port *port;
+
+    pa_device_port_new_data_init(&data);
+
+    pa_device_port_new_data_set_name(&data, "network-output");
+    pa_device_port_new_data_set_description(&data, server);
+    pa_device_port_new_data_set_direction(&data, PA_DIRECTION_OUTPUT);
+
+    port = pa_device_port_new(u->core, &data, 0);
+
+    pa_device_port_new_data_done(&data);
+
+    if (port == NULL)
+        return NULL;
+
+    pa_device_port_ref(port);
+
+    return port;
+}
+
+static pa_card_profile *raop_create_profile() {
+    pa_card_profile *profile;
+
+    profile = pa_card_profile_new("RAOP", _("RAOP standard profile"), 0);
+    profile->priority = 10;
+    profile->n_sinks = 1;
+    profile->n_sources = 0;
+    profile->max_sink_channels = 2;
+    profile->max_source_channels = 0;
+
+    return profile;
+}
+
+static pa_card *raop_create_card(pa_module *m, pa_device_port *port, pa_card_profile *profile, const char *server, const char *nicename) {
+    pa_card_new_data data;
+    pa_card *card;
+    char *card_name;
+
+    pa_card_new_data_init(&data);
+
+    pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, server);
+    pa_proplist_sets(data.proplist, PA_PROP_DEVICE_DESCRIPTION, nicename);
+    data.driver = __FILE__;
+
+    card_name = pa_sprintf_malloc("raop_client.%s", server);
+    pa_card_new_data_set_name(&data, card_name);
+    pa_xfree(card_name);
+
+    pa_hashmap_put(data.ports, port->name, port);
+    pa_hashmap_put(data.profiles, profile->name, profile);
+
+    card = pa_card_new(m->core, &data);
+
+    pa_card_new_data_done(&data);
+
+    if (card == NULL)
+        return NULL;
+
+    pa_card_choose_initial_profile(card);
+
+    pa_card_put(card);
+
+    return card;
+}
+
 pa_sink* pa_raop_sink_new(pa_module *m, pa_modargs *ma, const char *driver) {
     struct userdata *u = NULL;
     pa_sample_spec ss;
@@ -473,6 +545,9 @@ pa_sink* pa_raop_sink_new(pa_module *m, pa_modargs *ma, const char *driver) {
     const char /* *username, */ *password;
     pa_sink_new_data data;
     const char *name = NULL;
+    const char *description = NULL;
+    pa_device_port *port;
+    pa_card_profile *profile;
 
     pa_assert(m);
     pa_assert(ma);
@@ -590,6 +665,28 @@ pa_sink* pa_raop_sink_new(pa_module *m, pa_modargs *ma, const char *driver) {
         goto fail;
     }
 
+    port = raop_create_port(u, server);
+    if (port == NULL) {
+        pa_log("Failed to create port object");
+        goto fail;
+    }
+
+    profile = raop_create_profile();
+    pa_hashmap_put(port->profiles, profile->name, profile);
+
+    description = pa_proplist_gets(data.proplist, PA_PROP_DEVICE_DESCRIPTION);
+    if (description == NULL)
+        description = server;
+
+    u->card = raop_create_card(m, port, profile, server, description);
+    if (u->card == NULL) {
+        pa_log("Failed to create card object");
+        goto fail;
+    }
+
+    data.card = u->card;
+    pa_hashmap_put(data.ports, port->name, port);
+
     u->sink = pa_sink_new(m->core, &data, PA_SINK_LATENCY | PA_SINK_NETWORK);
     pa_sink_new_data_done(&data);
 
@@ -602,6 +699,7 @@ pa_sink* pa_raop_sink_new(pa_module *m, pa_modargs *ma, const char *driver) {
     pa_sink_set_set_volume_callback(u->sink, sink_set_volume_cb);
     pa_sink_set_set_mute_callback(u->sink, sink_set_mute_cb);
     u->sink->userdata = u;
+    u->sink->set_port = sink_set_port_cb;
 
     pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
     pa_sink_set_rtpoll(u->sink, u->rtpoll);
@@ -680,6 +778,9 @@ static void userdata_free(struct userdata *u) {
         pa_smoother_free(u->smoother);
     u->smoother = NULL;
 
+    if (u->card)
+        pa_card_free(u->card);
+
     pa_xfree(u);
 }
 

commit 77c12261812ec1ea2a3c8daf4e426eac82b75121
Author: Colin Leroy <colin at colino.net>
Date:   Mon Oct 9 09:26:42 2017 +0200

    raop: Show device codename in sink properties
    
    This will make it easier for testers to report latency offset for their
    specific hardware.

diff --git a/src/modules/raop/module-raop-discover.c b/src/modules/raop/module-raop-discover.c
index ac4a0258..b0c3eaa4 100644
--- a/src/modules/raop/module-raop-discover.c
+++ b/src/modules/raop/module-raop-discover.c
@@ -168,6 +168,7 @@ static void resolver_cb(
     char *device = NULL, *nicename, *dname, *vname, *args;
     char *tp = NULL, *et = NULL, *cn = NULL;
     char *ch = NULL, *ss = NULL, *sr = NULL;
+    char *dm = NULL;
     char *t = NULL;
     char at[AVAHI_ADDRESS_STR_MAX];
     AvahiStringList *l;
@@ -256,7 +257,8 @@ static void resolver_cb(
             sr = pa_xstrdup(value);
         } else if (pa_streq(key, "am")) {
             /* Device model */
-            latency = guess_latency_from_device(value);
+            pa_xfree(dm);
+            dm = pa_xstrdup(value);
         }
 
         avahi_free(key);
@@ -278,6 +280,7 @@ static void resolver_cb(
         pa_xfree(ch);
         pa_xfree(ss);
         pa_xfree(sr);
+        pa_xfree(dm);
         goto finish;
     }
 
@@ -285,22 +288,24 @@ static void resolver_cb(
     pa_xfree(dname);
 
     avahi_address_snprint(at, sizeof(at), a);
-    if (nicename) {
-        args = pa_sprintf_malloc("server=[%s]:%u "
-                                 "sink_name=%s "
-                                 "sink_properties='device.description=\"%s (%s:%u)\"'",
-                                 at, port,
-                                 vname,
-                                 nicename, at, port);
-        pa_xfree(nicename);
-    } else {
-        args = pa_sprintf_malloc("server=[%s]:%u "
-                                 "sink_name=%s"
-                                 "sink_properties='device.description=\"%s:%u\"'",
-                                 at, port,
-                                 vname,
-                                 at, port);
-    }
+
+    if (nicename == NULL)
+        nicename = pa_xstrdup("RAOP");
+
+    if (dm == NULL)
+        dm = pa_xstrdup(_("Unknown device model"));
+
+    latency = guess_latency_from_device(dm);
+
+    args = pa_sprintf_malloc("server=[%s]:%u "
+                             "sink_name=%s "
+                             "sink_properties='device.description=\"%s (%s:%u)\" device.model=\"%s\"'",
+                             at, port,
+                             vname,
+                             nicename, at, port,
+                             dm);
+    pa_xfree(nicename);
+    pa_xfree(dm);
 
     if (tp != NULL) {
         t = args;



More information about the pulseaudio-commits mailing list