routing: null sink support added to make sure there is always a routing target
authorJanos Kovacs <jankovac503@gmail.com>
Wed, 23 May 2012 00:23:12 +0000 (03:23 +0300)
committerJanos Kovacs <jankovac503@gmail.com>
Wed, 23 May 2012 00:23:12 +0000 (03:23 +0300)
src/config.h
src/discover.c
src/module-genivi-mir.c
src/router.c
src/router.h
src/utils.c
src/utils.h

index 7ab00d3..446ae86 100644 (file)
@@ -10,6 +10,7 @@ typedef struct pa_mir_config {
 pa_mir_config *pa_mir_config_init(struct userdata *);
 void pa_mir_config_done(struct userdata *);
 
+pa_bool_t pa_mir_config_parse_file(struct userdata *, const char *);
 
 
 #endif /* foomirconfigfoo */
index b58b7e7..c6b63e6 100644 (file)
@@ -232,6 +232,7 @@ void pa_discover_add_sink(struct userdata *u, pa_sink *sink, pa_bool_t route)
     pa_card        *card;
     char           *key;
     mir_node_type   type;
+    mir_node        data;
     char            buf[256];
 
     pa_assert(u);
@@ -262,7 +263,28 @@ void pa_discover_add_sink(struct userdata *u, pa_sink *sink, pa_bool_t route)
         }
     }
     else {
-        pa_log_info("currently we do not support statically loaded sinks");
+        memset(&data, 0, sizeof(data));
+        data.key = pa_xstrdup(sink->name);
+        data.direction = mir_output;
+        data.implement = mir_device;
+        data.channels  = sink->channel_map.channels;
+
+        if (sink == pa_utils_get_null_sink(u)) {
+            data.visible = FALSE;
+            data.available = TRUE;
+            data.type = mir_null;
+            data.amname = pa_xstrdup("Silent");
+            data.amid = AM_ID_INVALID;
+            data.paname = pa_xstrdup(sink->name);
+            data.paidx = sink->index;
+        }
+        else {
+            pa_xfree(data.key); /* for now */
+            pa_log_info("currently we do not support statically loaded sinks");
+            return;
+        }
+
+        create_node(u, &data, NULL);
     }
 }
 
index 1e98396..80f9b31 100644 (file)
@@ -33,6 +33,7 @@
 #include "audiomgr.h"
 #include "dbusif.h"
 #include "config.h"
+#include "utils.h"
 
 #ifndef DEFAULT_CONFIG_FILE
 #define DEFAULT_CONFIG_FILE "genivi-mir.conf"
@@ -100,7 +101,7 @@ int pa__init(pa_module *m) {
     u = pa_xnew0(struct userdata, 1);
     u->core     = m->core;
     u->module   = m;
-    //u->nullsink = pa_sink_ext_init_null_sink(nsnam);
+    u->nullsink = pa_utils_create_null_sink(u, nsnam);
     u->audiomgr = pa_audiomgr_init(u);
     u->dbusif   = pa_policy_dbusif_init(u,ifnam, mrppath,mrpnam, ampath,amnam);
     u->discover = pa_discover_init(u);
@@ -151,7 +152,7 @@ void pa__done(pa_module *m) {
         pa_policy_dbusif_done(u);
         pa_mir_config_done(u);
 
-        //pa_sink_ext_null_sink_free(u->nullsink);
+        pa_utils_destroy_null_sink(u);
 
         pa_xfree(u);
     }
index f2aed5b..3bda800 100644 (file)
@@ -280,7 +280,8 @@ mir_node *mir_router_make_prerouting(struct userdata *u, mir_node *data)
 }
 
 
-void mir_router_make_routing(struct userdata *u) {
+void mir_router_make_routing(struct userdata *u)
+{
     static pa_bool_t ongoing_routing;
 
     pa_router     *router;
index 087d500..56f0954 100644 (file)
@@ -54,6 +54,8 @@ void mir_router_register_node(struct userdata *, mir_node *);
 void mir_router_unregister_node(struct userdata *, mir_node *);
 
 mir_node *mir_router_make_prerouting(struct userdata *, mir_node *);
+void mir_router_make_routing(struct userdata *);
+
 int mir_router_print_rtgroups(struct userdata *, char *, int);
 
 pa_bool_t mir_router_default_accept(struct userdata *, mir_rtgroup *,
index ecaed8e..472528c 100644 (file)
 #define DEFAULT_CONFIG_DIR "/etc/pulse"
 #endif
 
+#define DEFAULT_NULL_SINK_NAME "null.mir"
+
+typedef struct pa_null_sink {
+    char      *name;
+    uint32_t   module_index;
+    uint32_t   sink_index;
+} pa_null_sink;
+
+
 static uint32_t stamp;
 
 static char *sink_input_name(pa_proplist *);
 
 
+pa_null_sink *pa_utils_create_null_sink(struct userdata *u, const char *name)
+{
+    pa_core      *core;
+    pa_module    *module;
+    pa_null_sink *ns;
+    pa_sink      *sink;
+    pa_sink      *s;
+    uint32_t      idx;
+    char          args[256];
+
+    pa_assert(u);
+    pa_assert_se((core = u->core));
+
+
+    if (!name)
+        name = DEFAULT_NULL_SINK_NAME;
+
+
+    snprintf(args, sizeof(args), "sink_name=\"%s\" channels=2", name);
+    module = pa_module_load(core, "module-null-sink", args);
+    sink = NULL;
+
+    if (!module)
+        pa_log("failed to load null sink '%s'", name);
+    else {
+        PA_IDXSET_FOREACH(s, core->sinks, idx) {
+            if (s->module && s->module == module) {
+                sink = s;
+                pa_log_info("mir null sink is '%s'", name);
+                break;
+            }
+        }
+    }
+
+    ns = pa_xnew0(pa_null_sink, 1);
+    ns->name = pa_xstrdup(name);
+    ns->module_index = module ? module->index : PA_IDXSET_INVALID;
+    ns->sink_index = sink ? sink->index : PA_IDXSET_INVALID;
+
+    return ns;
+}
+
+void pa_utils_destroy_null_sink(struct userdata *u)
+{
+    pa_core      *core;
+    pa_module    *module;
+    pa_null_sink *ns;
+
+    if (u && (ns = u->nullsink) && (core = u->core)) {
+        if ((module = pa_idxset_get_by_index(core->modules,ns->module_index))){
+            pa_log_info("unloading null sink '%s'", ns->name);
+            pa_module_unload(core, module, FALSE);
+        }
+
+        pa_xfree(ns->name);
+        pa_xfree(ns);
+    }
+}
+
+pa_sink *pa_utils_get_null_sink(struct userdata *u)
+{
+    pa_core *core;
+    pa_null_sink *ns;
+    
+    pa_assert(u);
+    pa_assert_se((core = u->core));
+    pa_assert_se((ns = u->nullsink));
+
+    return pa_idxset_get_by_index(core->sinks, ns->sink_index);
+}
+
+
+
 char *pa_utils_get_card_name(pa_card *card)
 {
     return (card && card->name) ? card->name : "<unknown>";
index 98a31e6..25ae4d8 100644 (file)
@@ -4,6 +4,13 @@
 #include <stdbool.h>
 #include <pulsecore/core.h>
 
+typedef struct pa_sink pa_sink;
+
+pa_null_sink *pa_utils_create_null_sink(struct userdata *, const char *);
+void pa_utils_destroy_null_sink(struct userdata *);
+pa_sink *pa_utils_get_null_sink(struct userdata *);
+
+
 char *pa_utils_get_card_name(pa_card *);
 char *pa_utils_get_sink_name(pa_sink *);
 char *pa_utils_get_source_name(pa_source *);