On Sun, 2016-01-31 at 22:16 -0600, Hajime Fujita wrote: > From: Martin Blanchard <tinram at gmx.fr> > > During the discovery phase, raop servers send theirs capabilities > (supported encryption, audio codec...). These should be passed to the > raop sink via module's arguments. > --- > Â src/modules/raop/module-raop-discover.c | 100 > ++++++++++++++++++++++++++++---- > Â 1 file changed, 90 insertions(+), 10 deletions(-) > > diff --git a/src/modules/raop/module-raop-discover.c > b/src/modules/raop/module-raop-discover.c > index 1ced777..f174da3 100644 > --- a/src/modules/raop/module-raop-discover.c > +++ b/src/modules/raop/module-raop-discover.c > @@ -138,7 +138,10 @@ static void resolver_cb( > Â Â Â Â Â Â Â Â Â void *userdata) { > Â Â Â Â Â struct userdata *u = userdata; > Â Â Â Â Â struct tunnel *tnl; > -Â Â Â Â char *device = NULL, *nicename, *dname, *vname, *args; > +Â Â Â Â char *nicename, *dname, *vname, *args; > +Â Â Â Â char *tp = NULL, *et = NULL, *cn = NULL; > +Â Â Â Â char *ch = NULL, *ss = NULL, *sr = NULL; > +Â Â Â Â char *t = NULL; > Â Â Â Â Â char at[AVAHI_ADDRESS_STR_MAX]; > Â Â Â Â Â AvahiStringList *l; > Â Â Â Â Â pa_module *m; > @@ -166,8 +169,54 @@ static void resolver_cb( > Â Â Â Â Â Â Â Â Â pa_assert_se(avahi_string_list_get_pair(l, &key, &value, > NULL) == 0); > Â > Â Â Â Â Â Â Â Â Â pa_log_debug("Found key: '%s' with value: '%s'", key, > value); > -Â Â Â Â Â Â Â Â if (pa_streq(key, "device")) { > -Â Â Â Â Â Â Â Â Â Â Â Â device = value; Is there a reason the device is dropped here. Ideally this should be a separate commit, but for now, if we have a reason we can put in the commit message, that'd be fine too. -- Arun > + > +Â Â Â Â Â Â Â Â if (pa_streq(key, "tp")) { > +Â Â Â Â Â Â Â Â Â Â Â Â /* Transport protocol: > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - TCP = only TCP, > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - UDP = only UDP, > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - TCP,UDP = both supported (UDP should be prefered) > */ > +Â Â Â Â Â Â Â Â Â Â Â Â Â if (pa_str_in_list(value, ",", "UDP")) > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â tp = strdup("UDP"); > +Â Â Â Â Â Â Â Â Â Â Â Â else if (pa_str_in_list(value, ",", "TCP")) > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â tp = strdup("TCP"); > +Â Â Â Â Â Â Â Â Â Â Â Â else > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â tp = strdup(value); > +Â Â Â Â Â Â Â Â } else if (pa_streq(key, "et")) { > +Â Â Â Â Â Â Â Â Â Â Â Â /* Supported encryption types: > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - 0 = none, > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - 1 = RSA, > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - 2 = FairPlay, > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - 3 = MFiSAP, > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - 4 = FairPlay SAPv2.5. */ > +Â Â Â Â Â Â Â Â Â Â Â Â Â if (pa_str_in_list(value, ",", "1")) > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â et = strdup("RSA"); > +Â Â Â Â Â Â Â Â Â Â Â Â Â else > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â et = strdup("none"); > +Â Â Â Â Â Â Â Â } else if (pa_streq(key, "cn")) { > +Â Â Â Â Â Â Â Â Â Â Â Â /* Suported audio codecs: > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - 0 = PCM, > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - 1 = ALAC, > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - 2 = AAC, > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - 3 = AAC ELD. */ > +Â Â Â Â Â Â Â Â Â Â Â Â cn = strdup("PCM"); > +Â Â Â Â Â Â Â Â } else if (pa_streq(key, "md")) { > +Â Â Â Â Â Â Â Â Â Â Â Â /* Supported metadata types: > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - 0 = text, > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - 1 = artwork, > +Â Â Â Â Â Â Â Â Â Â Â Â Â *Â Â - 2 = progress. */ > +Â Â Â Â Â Â Â Â } else if (pa_streq(key, "pw")) { > +Â Â Â Â Â Â Â Â Â Â Â Â /* Requires password ? (true/false) */ > +Â Â Â Â Â Â Â Â } else if (pa_streq(key, "ch")) { > +Â Â Â Â Â Â Â Â Â Â Â Â /* Number of channels */ > +Â Â Â Â Â Â Â Â Â Â Â Â ch = value; > +Â Â Â Â Â Â Â Â Â Â Â Â value = NULL; > +Â Â Â Â Â Â Â Â } else if (pa_streq(key, "ss")) { > +Â Â Â Â Â Â Â Â Â Â Â Â /* Sample size */ > +Â Â Â Â Â Â Â Â Â Â Â Â ss = value; > +Â Â Â Â Â Â Â Â Â Â Â Â value = NULL; > +Â Â Â Â Â Â Â Â } else if (pa_streq(key, "sr")) { > +Â Â Â Â Â Â Â Â Â Â Â Â /* Sample rate */ > +Â Â Â Â Â Â Â Â Â Â Â Â sr = value; > Â Â Â Â Â Â Â Â Â Â Â Â Â value = NULL; > Â Â Â Â Â Â Â Â Â } > Â > @@ -175,19 +224,13 @@ static void resolver_cb( > Â Â Â Â Â Â Â Â Â avahi_free(value); > Â Â Â Â Â } > Â > -Â Â Â Â if (device) > -Â Â Â Â Â Â Â Â dname = pa_sprintf_malloc("raop.%s.%s", host_name, device); > -Â Â Â Â else > -Â Â Â Â Â Â Â Â dname = pa_sprintf_malloc("raop.%s", host_name); > - > +Â Â Â Â dname = pa_sprintf_malloc("raop_output.%s", host_name); > Â Â Â Â Â if (!(vname = pa_namereg_make_valid_name(dname))) { > Â Â Â Â Â Â Â Â Â pa_log("Cannot construct valid device name from '%s'.", > dname); > -Â Â Â Â Â Â Â Â avahi_free(device); > Â Â Â Â Â Â Â Â Â pa_xfree(dname); > Â Â Â Â Â Â Â Â Â goto finish; > Â Â Â Â Â } > Â > -Â Â Â Â avahi_free(device); > Â Â Â Â Â pa_xfree(dname); > Â > Â Â Â Â Â if (nicename) { > @@ -205,6 +248,43 @@ static void resolver_cb( > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â vname); > Â Â Â Â Â } > Â > +Â Â Â Â if (tp != NULL) { > +Â Â Â Â Â Â Â Â t = args; > +Â Â Â Â Â Â Â Â args = pa_sprintf_malloc("%s protocol=%s", args, tp); > +Â Â Â Â Â Â Â Â avahi_free(tp); > +Â Â Â Â Â Â Â Â pa_xfree(t); > +Â Â Â Â } > +Â Â Â Â if (et != NULL) { > +Â Â Â Â Â Â Â Â t = args; > +Â Â Â Â Â Â Â Â args = pa_sprintf_malloc("%s encryption=%s", args, et); > +Â Â Â Â Â Â Â Â pa_xfree(et); > +Â Â Â Â Â Â Â Â pa_xfree(t); > +Â Â Â Â } > +Â Â Â Â if (cn != NULL) { > +Â Â Â Â Â Â Â Â t = args; > +Â Â Â Â Â Â Â Â args = pa_sprintf_malloc("%s codec=%s", args, cn); > +Â Â Â Â Â Â Â Â pa_xfree(cn); > +Â Â Â Â Â Â Â Â pa_xfree(t); > +Â Â Â Â } > +Â Â Â Â if (ch != NULL) { > +Â Â Â Â Â Â Â Â t = args; > +Â Â Â Â Â Â Â Â args = pa_sprintf_malloc("%s channels=%s", args, ch); > +Â Â Â Â Â Â Â Â avahi_free(ch); > +Â Â Â Â Â Â Â Â pa_xfree(t); > +Â Â Â Â } > +Â Â Â Â if (ss != NULL) { > +Â Â Â Â Â Â Â Â t = args; > +Â Â Â Â Â Â Â Â args = pa_sprintf_malloc("%s format=%s", args, ss); > +Â Â Â Â Â Â Â Â avahi_free(ss); > +Â Â Â Â Â Â Â Â pa_xfree(t); > +Â Â Â Â } > +Â Â Â Â if (sr != NULL) { > +Â Â Â Â Â Â Â Â t = args; > +Â Â Â Â Â Â Â Â args = pa_sprintf_malloc("%s rate=%s", args, sr); > +Â Â Â Â Â Â Â Â avahi_free(sr); > +Â Â Â Â Â Â Â Â pa_xfree(t); > +Â Â Â Â } > + > Â Â Â Â Â pa_log_debug("Loading module-raop-sink with arguments '%s'", > args); > Â > Â Â Â Â Â if ((m = pa_module_load(u->core, "module-raop-sink", args))) {