[pulseaudio-discuss] [PATCH 07/25] raop: Recognize transport protocol type

Hajime Fujita crisp.fujita at nifty.com
Sat Sep 7 09:34:56 PDT 2013


There are two versions in the RAOP protocol; one uses TCP and the
other uses UDP. Current raop implementation only supports TCP
version.

This patch recognizes the transport protocol type announced from
the server side. It also introduces a flag representing the protocol
type.

Protocol parameters are based on Matrin Blanchard's implementation.
---
 src/modules/raop/module-raop-sink.c | 26 ++++++++++++++++++++++++--
 src/modules/raop/raop_client.c      |  6 +++++-
 src/modules/raop/raop_client.h      |  7 ++++++-
 3 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/src/modules/raop/module-raop-sink.c b/src/modules/raop/module-raop-sink.c
index 96c6a82..d94b0e1 100644
--- a/src/modules/raop/module-raop-sink.c
+++ b/src/modules/raop/module-raop-sink.c
@@ -68,6 +68,9 @@ PA_MODULE_USAGE(
         "sink_name=<name for the sink> "
         "sink_properties=<properties for the sink> "
         "server=<address>  "
+        "protocol=<transport protocol> "
+        "encryption=<encryption type> "
+        "codec=<audio codec> "
         "format=<sample format> "
         "rate=<sample rate> "
         "channels=<number of channels>");
@@ -84,6 +87,8 @@ struct userdata {
     pa_rtpoll_item *rtpoll_item;
     pa_thread *thread;
 
+    pa_raop_protocol_t protocol;
+
     pa_memchunk raw_memchunk;
     pa_memchunk encoded_memchunk;
 
@@ -115,6 +120,9 @@ static const char* const valid_modargs[] = {
     "sink_name",
     "sink_properties",
     "server",
+    "protocol",
+    "encryption",
+    "codec",
     "format",
     "rate",
     "channels",
@@ -506,7 +514,7 @@ int pa__init(pa_module *m) {
     struct userdata *u = NULL;
     pa_sample_spec ss;
     pa_modargs *ma = NULL;
-    const char *server;
+    const char *server, *protocol;
     pa_sink_new_data data;
 
     pa_assert(m);
@@ -569,6 +577,20 @@ int pa__init(pa_module *m) {
         goto fail;
     }
 
+    protocol = pa_modargs_get_value(ma, "protocol", NULL);
+    if (protocol == NULL || pa_streq(protocol, "TCP")) {
+        /* Assume TCP by default */
+        u->protocol = RAOP_TCP;
+    }
+    else if (pa_streq(protocol, "UDP")) {
+        u->protocol = RAOP_UDP;
+        pa_log("UDP is not supported in this module version.");
+        goto fail;
+    } else {
+        pa_log("Unsupported protocol argument given: %s", protocol);
+        goto fail;
+    }
+
     pa_sink_new_data_init(&data);
     data.driver = __FILE__;
     data.module = m;
@@ -601,7 +623,7 @@ int pa__init(pa_module *m) {
     pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
     pa_sink_set_rtpoll(u->sink, u->rtpoll);
 
-    if (!(u->raop = pa_raop_client_new(u->core, server))) {
+    if (!(u->raop = pa_raop_client_new(u->core, server, u->protocol))) {
         pa_log("Failed to connect to server.");
         goto fail;
     }
diff --git a/src/modules/raop/raop_client.c b/src/modules/raop/raop_client.c
index f6dcd25..fdc2787 100644
--- a/src/modules/raop/raop_client.c
+++ b/src/modules/raop/raop_client.c
@@ -76,6 +76,7 @@ struct pa_raop_client {
     uint16_t port;
     char *sid;
     pa_rtsp_client *rtsp;
+    pa_raop_protocol_t protocol;
 
     uint8_t jack_type;
     uint8_t jack_status;
@@ -365,18 +366,21 @@ static void rtsp_cb(pa_rtsp_client *rtsp, pa_rtsp_state state, pa_headerlist *he
     }
 }
 
-pa_raop_client* pa_raop_client_new(pa_core *core, const char *host) {
+pa_raop_client* pa_raop_client_new(pa_core *core, const char *host,
+                                   pa_raop_protocol_t protocol) {
     pa_parsed_address a;
     pa_raop_client *c = pa_xnew0(pa_raop_client, 1);
 
     pa_assert(core);
     pa_assert(host);
+    pa_assert(protocol == RAOP_TCP);
 
     if (pa_parse_address(host, &a) < 0 || a.type == PA_PARSED_ADDRESS_UNIX)
         return NULL;
 
     c->core = core;
     c->fd = -1;
+    c->protocol = protocol;
 
     c->host = pa_xstrdup(a.path_or_host);
     if (a.port)
diff --git a/src/modules/raop/raop_client.h b/src/modules/raop/raop_client.h
index e44b1d7..fe669d1 100644
--- a/src/modules/raop/raop_client.h
+++ b/src/modules/raop/raop_client.h
@@ -24,9 +24,14 @@
 
 #include <pulsecore/core.h>
 
+typedef enum pa_raop_protocol {
+    RAOP_TCP,
+    RAOP_UDP,
+} pa_raop_protocol_t;
+
 typedef struct pa_raop_client pa_raop_client;
 
-pa_raop_client* pa_raop_client_new(pa_core *core, const char *host);
+pa_raop_client* pa_raop_client_new(pa_core *core, const char *host, pa_raop_protocol_t protocol);
 void pa_raop_client_free(pa_raop_client *c);
 
 int pa_raop_connect(pa_raop_client *c);
-- 
1.8.1.2



More information about the pulseaudio-discuss mailing list