]> code.delx.au - pulseaudio/blobdiff - src/module-protocol-stub.c
add documentation
[pulseaudio] / src / module-protocol-stub.c
index 0547f7e60e3fa4200acf7e4ebd4036afaeadcc4b..3ce18c3159486ec1aa239b826cb433fac9779377 100644 (file)
@@ -1,3 +1,28 @@
+/* $Id$ */
+
+/***
+  This file is part of polypaudio.
+  polypaudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+  polypaudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+  You should have received a copy of the GNU General Public License
+  along with polypaudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <string.h>
 #include <errno.h>
 #include <stdio.h>
 #include "socket-server.h"
 #include "socket-util.h"
 #include "util.h"
+#include "modargs.h"
 
 #ifdef USE_PROTOCOL_SIMPLE
   #include "protocol-simple.h"
+  #define protocol_new pa_protocol_simple_new
   #define protocol_free pa_protocol_simple_free
   #define IPV4_PORT 4711
-  #define UNIX_SOCKET_DIR "/tmp/polypaudio"
   #define UNIX_SOCKET "/tmp/polypaudio/simple"
+  #define MODULE_ARGUMENTS "rate", "format", "channels", "sink", "source", "playback", "record",
 #else
   #ifdef USE_PROTOCOL_CLI
     #include "protocol-cli.h" 
     #define protocol_new pa_protocol_cli_new
     #define protocol_free pa_protocol_cli_free
     #define IPV4_PORT 4712
-    #define UNIX_SOCKET_DIR "/tmp/polypaudio"
     #define UNIX_SOCKET "/tmp/polypaudio/cli"
+    #define MODULE_ARGUMENTS 
   #else
     #ifdef USE_PROTOCOL_NATIVE
       #include "protocol-native.h"
       #define protocol_new pa_protocol_native_new
       #define protocol_free pa_protocol_native_free
       #define IPV4_PORT 4713
-      #define UNIX_SOCKET_DIR "/tmp/polypaudio"
       #define UNIX_SOCKET "/tmp/polypaudio/native"
+      #define MODULE_ARGUMENTS "public", "cookie",
     #else
       #ifdef USE_PROTOCOL_ESOUND
         #include "protocol-esound.h"
-        #include "esound-spec.h"
+        #include "esound.h"
         #define protocol_new pa_protocol_esound_new
         #define protocol_free pa_protocol_esound_free
         #define IPV4_PORT ESD_DEFAULT_PORT
-        #define UNIX_SOCKET_DIR ESD_UNIX_SOCKET_DIR
         #define UNIX_SOCKET ESD_UNIX_SOCKET_NAME
+        #define MODULE_ARGUMENTS "sink", "source", "public", "cookie",
       #else
         #error "Broken build system" 
       #endif
   #endif
 #endif
 
-int pa_module_init(struct pa_core *c, struct pa_module*m) {
-    struct pa_socket_server *s;
-    assert(c && m);
+static const char* const valid_modargs[] = {
+    MODULE_ARGUMENTS
+#ifdef USE_TCP_SOCKETS
+    "port",
+    "loopback",
+#else
+    "socket",
+#endif
+    NULL
+};
 
+static struct pa_socket_server *create_socket_server(struct pa_core *c, struct pa_modargs *ma) {
+    struct pa_socket_server *s;
 #ifdef USE_TCP_SOCKETS
-    if (!(s = pa_socket_server_new_ipv4(c->mainloop, INADDR_ANY, IPV4_PORT)))
-        return -1;
+    uint32_t loopback = 1, port = IPV4_PORT;
+
+    if (pa_modargs_get_value_u32(ma, "loopback", &loopback) < 0) {
+        fprintf(stderr, "loopback= expects a numerical argument.\n");
+        return NULL;
+    }
+
+    if (pa_modargs_get_value_u32(ma, "port", &port) < 0) {
+        fprintf(stderr, "port= expects a numerical argument.\n");
+        return NULL;
+    }
+    
+    if (!(s = pa_socket_server_new_ipv4(c->mainloop, loopback ? INADDR_LOOPBACK : INADDR_ANY, port)))
+        return NULL;
 #else
-    if (pa_make_secure_dir(UNIX_SOCKET_DIR) < 0) {
+    int r;
+    const char *p;
+
+    p = pa_modargs_get_value(ma, "socket", UNIX_SOCKET);
+    assert(p);
+
+    if (pa_unix_socket_make_secure_dir(p) < 0) {
         fprintf(stderr, "Failed to create secure socket directory.\n");
-        return -1;
+        return NULL;
     }
 
-    {
-        int r;
-        if ((r = pa_unix_socket_remove_stale(UNIX_SOCKET)) < 0) {
-            fprintf(stderr, "Failed to remove stale UNIX socket '%s': %s\n", UNIX_SOCKET, strerror(errno));
-            return -1;
-        }
-
-        if (r)
-            fprintf(stderr, "Removed stale UNIX socket '%s'.", UNIX_SOCKET);
+    if ((r = pa_unix_socket_remove_stale(p)) < 0) {
+        fprintf(stderr, "Failed to remove stale UNIX socket '%s': %s\n", p, strerror(errno));
+        return NULL;
     }
     
-    if (!(s = pa_socket_server_new_unix(c->mainloop, UNIX_SOCKET))) {
-        rmdir(UNIX_SOCKET_DIR);
-        return -1;
-    }
+    if (r)
+        fprintf(stderr, "Removed stale UNIX socket '%s'.", p);
+    
+    if (!(s = pa_socket_server_new_unix(c->mainloop, p)))
+        return NULL;
+    
 #endif
+    return s;
+}
 
-#ifdef USE_PROTOCOL_SIMPLE
-    m->userdata = pa_protocol_simple_new(c, s, m, PA_PROTOCOL_SIMPLE_PLAYBACK);
-#else
-    m->userdata = protocol_new(c, s, m);
-#endif
+int pa_module_init(struct pa_core *c, struct pa_module*m) {
+    struct pa_socket_server *s;
+    struct pa_modargs *ma = NULL;
+    int ret = -1;
+    assert(c && m);
+
+    if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
+        fprintf(stderr, "Failed to parse module arguments\n");
+        goto finish;
+    }
+
+    if (!(s = create_socket_server(c, ma)))
+        goto finish;
 
-    if (!m->userdata) {
+    if (!(m->userdata = protocol_new(c, s, m, ma))) {
         pa_socket_server_free(s);
-        return -1;
+        goto finish;
     }
 
-    return 0;
+    ret = 0;
+
+finish:
+    if (ma)
+        pa_modargs_free(ma);
+
+    return ret;
 }
 
 void pa_module_done(struct pa_core *c, struct pa_module*m) {
     assert(c && m);
 
     protocol_free(m->userdata);
-
-#ifndef USE_TCP_SOCKETS
-    rmdir(UNIX_SOCKET_DIR);
-#endif
 }