routing: registration of default routes to audiomanager 92/12792/1
authorJanos Kovacs <jankovac503@gmail.com>
Mon, 18 Jun 2012 19:04:10 +0000 (22:04 +0300)
committerJaska Uimonen <jaska.uimonen@helsinki.fi>
Fri, 22 Nov 2013 15:58:07 +0000 (17:58 +0200)
Change-Id: If7ee6a1f6a2edee85990cf955625f722af0e9ed7

murphy/audiomgr.c
murphy/audiomgr.h
murphy/dbusif.c
murphy/dbusif.h
murphy/discover.c
murphy/module-murphy-ivi.c
murphy/router.c
murphy/routerif.h
murphy/socketif.c

index 0b61634..f6321a8 100644 (file)
 #define MS_MUTED          1
 #define MS_UNMUTED        2
 
+/* connection format */
+#define CF_MONO           1
+#define CF_STEREO         2
+#define CF_AUTO           4
 
 typedef struct {
     const char *name;
@@ -76,13 +80,29 @@ typedef struct {
 } domain_t;
 
 
+typedef struct {
+    uint16_t    fromidx;
+    uint16_t    toidx;
+    uint32_t    channels;
+} link_t;
+
+typedef struct {
+    int          maxlink;
+    int          nlink;
+    link_t      *links;
+} routes_t;
+
 struct pa_audiomgr {
     domain_t      domain;
     pa_hashmap   *nodes;        /**< nodes ie. sinks and sources */
     pa_hashmap   *conns;        /**< connections */
+    routes_t      defrts;       /**< default routes */
 };
 
 
+static bool find_default_route(struct userdata *, mir_node *,
+                               am_connect_data *);
+
 static void *node_hash(mir_direction, uint16_t);
 static void *conn_hash(uint16_t);
 
@@ -247,9 +267,10 @@ void pa_audiomgr_node_registered(struct userdata *u,
                                  uint16_t         state,
                                  am_nodereg_data *rd)
 {
-    pa_audiomgr *am;
-    mir_node    *node;
-    void        *key;
+    pa_audiomgr     *am;
+    mir_node        *node;
+    void            *key;
+    am_connect_data  cd;
 
     pa_assert(u);
     pa_assert(rd);
@@ -267,6 +288,9 @@ void pa_audiomgr_node_registered(struct userdata *u,
                      node->amname, key, node);
 
         pa_hashmap_put(am->nodes, key, node);
+
+        if (find_default_route(u, node, &cd))
+            pa_routerif_register_implicit_connection(u, &cd);
     }
 
     pa_xfree((void *)rd->key);
@@ -343,6 +367,108 @@ void pa_audiomgr_node_unregistered(struct userdata   *u,
 }
 
 
+void pa_audiomgr_delete_default_routes(struct userdata *u)
+{
+    pa_audiomgr *am;
+    routes_t    *defrts;
+
+    pa_assert(u);
+    pa_assert_se((am = u->audiomgr));
+
+    defrts = &am->defrts;
+
+    defrts->nlink = 0;
+}
+
+void pa_audiomgr_add_default_route(struct userdata *u,
+                                   mir_node        *from,
+                                   mir_node        *to)
+{
+    pa_audiomgr *am;
+    routes_t    *defrts;
+    link_t      *link;
+    size_t       size;
+
+    pa_assert(u);
+    pa_assert(from);
+    pa_assert(to);
+    pa_assert_se((am = u->audiomgr));
+
+    defrts = &am->defrts;
+
+    if (from->paidx == PA_IDXSET_INVALID || to->paidx == PA_IDXSET_INVALID) {
+        pa_log_debug("ignoring default route %s => %s: incomplete "
+                     "input or output", from->amname, to->amname);
+    }
+    else {
+        pa_log_debug("adding default route %s => %s", from->amname,to->amname);
+
+        if (defrts->nlink >= defrts->maxlink) {
+            defrts->maxlink += 16;
+            
+            size = sizeof(link_t) * defrts->maxlink;
+            defrts->links = realloc(defrts->links, size);
+            pa_assert(defrts->links);
+        }
+
+        link = defrts->links + defrts->nlink++;
+
+        link->fromidx  = from->index;
+        link->toidx    = to->index;
+        link->channels = from->channels < to->channels ?
+                         from->channels : to->channels;
+    }
+}
+
+void pa_audiomgr_send_default_routes(struct userdata *u)
+{
+#define MAX_DEFAULT_ROUTES 128
+
+    pa_audiomgr     *am;
+    routes_t        *defrts;
+    link_t          *link;
+    mir_node        *from;
+    mir_node        *to;
+    am_connect_data  cds[MAX_DEFAULT_ROUTES];
+    am_connect_data *cd;
+    int              ncd;
+
+    pa_assert(u);
+    pa_assert_se((am = u->audiomgr));
+
+    defrts = &am->defrts;
+
+    pa_assert(defrts->nlink < MAX_DEFAULT_ROUTES);
+
+    for (ncd = 0;   ncd < defrts->nlink;   ncd++) {
+        link = defrts->links + ncd;
+        cd = cds + ncd;
+
+        if (!(from = mir_node_find_by_index(u, link->fromidx)) ||
+            !(to   = mir_node_find_by_index(u, link->toidx))     )
+        {
+            pa_log_debug("will not send default route: node not found");
+            continue;
+        }
+
+        if (from->amid == AM_ID_INVALID || to->amid == AM_ID_INVALID) {
+            pa_log_debug("wil not send default route: invalid audiomgr ID");
+            continue;
+        }
+
+        cd->handle = 0;
+        cd->connection = 0;
+        cd->source = from->amid;
+        cd->sink = to->amid;
+        cd->format = link->channels >= 2 ? CF_STEREO : CF_MONO;
+    }
+
+    if (ncd > 0)
+        pa_routerif_register_implicit_connections(u, ncd, cds);
+
+#undef MAX_DEFAULT_ROUTES
+}
+
 void pa_audiomgr_connect(struct userdata *u, am_connect_data *cd)
 {
     pa_audiomgr    *am;
@@ -415,6 +541,46 @@ void pa_audiomgr_disconnect(struct userdata *u, am_connect_data *cd)
     pa_routerif_acknowledge(u, audiomgr_disconnect, &ad);
 }
 
+static bool find_default_route(struct userdata *u,
+                               mir_node        *node,
+                               am_connect_data *cd)
+{
+    pa_audiomgr *am;
+    routes_t    *defrts = &am->defrts;
+    link_t      *link;
+    mir_node    *pair;
+    int          i;
+
+    pa_assert(u);
+    pa_assert(node);
+    pa_assert(cd);
+    pa_assert_se((am = u->audiomgr));
+
+    defrts = &am->defrts;
+
+    memset(cd, 0, sizeof(am_connect_data));
+
+    for (i = 0;  i < defrts->nlink;  i++) {
+        link = defrts->links + i;
+
+        cd->format = link->channels >= 2 ? CF_STEREO : CF_MONO;
+
+        if (node->direction == mir_input && link->fromidx == node->index) {
+            return (pair = mir_node_find_by_index(u, link->toidx)) &&
+                   (cd->source = node->amid) != AM_ID_INVALID &&
+                   (cd->sink   = pair->amid) != AM_ID_INVALID;
+        }
+
+        if (node->direction == mir_output && link->toidx == node->index) {
+            return (pair = mir_node_find_by_index(u, link->fromidx)) &&
+                   (cd->source = pair->amid) != AM_ID_INVALID &&
+                   (cd->sink = node->amid) != AM_ID_INVALID;
+        }
+    }
+
+    return false;
+}
+
 static void *node_hash(mir_direction direction, uint16_t amid)
 {
     return NULL + ((uint32_t)direction << 16 | (uint32_t)amid);
index f398c38..da6c45e 100644 (file)
@@ -105,6 +105,7 @@ struct am_ack_data {
 };
 
 
+
 pa_audiomgr *pa_audiomgr_init(struct userdata *);
 void pa_audiomgr_done(struct userdata *);
 
@@ -122,6 +123,10 @@ void pa_audiomgr_node_registered(struct userdata *, uint16_t, uint16_t,
 void pa_audiomgr_unregister_node(struct userdata *, mir_node *);
 void pa_audiomgr_node_unregistered(struct userdata *, am_nodeunreg_data *);
 
+void pa_audiomgr_delete_default_routes(struct userdata *);
+void pa_audiomgr_add_default_route(struct userdata *, mir_node *, mir_node *);
+void pa_audiomgr_send_default_routes(struct userdata *);
+
 void pa_audiomgr_connect(struct userdata *, am_connect_data *);
 void pa_audiomgr_disconnect(struct userdata *, am_connect_data *);
 
index 3b0e0ac..3670f4f 100644 (file)
 
 #define ADMIN_NAME_OWNER_CHANGED    "NameOwnerChanged"
 
-#define POLICY_DBUS_INTERFACE       "org.tizen.policy"
-#define POLICY_DBUS_MRPPATH         "/org/tizen/policy"
-#define POLICY_DBUS_MRPNAME         "org.tizen.murphy"
-
 #define AUDIOMGR_DBUS_INTERFACE     "org.genivi.audiomanager"
 #define AUDIOMGR_DBUS_PATH          "/org/genivi/audiomanager"
+
 #define AUDIOMGR_DBUS_ROUTE_NAME    "RoutingInterface"
 #define AUDIOMGR_DBUS_ROUTE_PATH    "RoutingInterface"
 
+#define AUDIOMGR_DBUS_CONTROL_NAME    "ControlInterface"
+#define AUDIOMGR_DBUS_CONTROL_PATH    "ControlInterface"
+
 #define PULSE_DBUS_INTERFACE        "org.genivi.pulse"
 #define PULSE_DBUS_PATH             "/org/genivi/pulse"
 #define PULSE_DBUS_NAME             "org.genivi.pulse"
 
-
-#define POLICY_DECISION             "decision"
-#define POLICY_STREAM_INFO          "stream_info"
-#define POLICY_ACTIONS              "audio_actions"
-#define POLICY_STATUS               "status"
-
-#define PROP_ROUTE_SINK_TARGET      "policy.sink_route.target"
-#define PROP_ROUTE_SINK_MODE        "policy.sink_route.mode"
-#define PROP_ROUTE_SINK_HWID        "policy.sink_route.hwid"
-#define PROP_ROUTE_SOURCE_TARGET    "policy.source_route.target"
-#define PROP_ROUTE_SOURCE_MODE      "policy.source_route.mode"
-#define PROP_ROUTE_SOURCE_HWID      "policy.source_route.hwid"
-
-
 #define STRUCT_OFFSET(s,m) ((char *)&(((s *)0)->m) - (char *)0)
 
 typedef void (*pending_cb_t)(struct userdata *, const char *,
                              DBusMessage *, void *);
 typedef bool (*method_t)(struct userdata *, DBusMessage *);
 
-
 struct pending {
     PA_LLIST_FIELDS(struct pending);
     struct userdata  *u;
@@ -80,25 +65,17 @@ struct pending {
 
 struct pa_routerif {
     pa_dbus_connection *conn;
-    char               *ifnam;    /* signal interface */
-    char               *mrppath;  /* murphy signal path */
-    char               *mrpnam;   /* murphy D-Bus name */
     char               *ampath;   /* audio manager path */
     char               *amnam;    /* audio manager name */
     char               *amrpath;  /* audio manager routing path */
     char               *amrnam;   /* audio manager routing name */
-    char               *admmrule; /* match rule to catch murphy name changes */
+    char               *amcpath;  /* audio manager control path */
+    char               *amcnam;   /* audio manager control name */
     char               *admarule; /* match rule to catch audiomgr name change*/
-    char               *actrule;  /* match rule to catch action signals */
-    char               *strrule;  /* match rule to catch stream info signals */
-    int                 mregist;  /* are we registered to murphy */
     int                 amisup;   /* is the audio manager up */
     PA_LLIST_HEAD(struct pending, pendlist);
 };
 
-
-
-
 struct actdsc {                 /* action descriptor */
     const char         *name;
     int               (*parser)(struct userdata *u, DBusMessageIter *iter);
@@ -143,29 +120,15 @@ static bool send_message_with_reply(struct userdata *,
                                          DBusConnection *, DBusMessage *,
                                          pending_cb_t, void *);
 
-
 static DBusHandlerResult filter(DBusConnection *, DBusMessage *, void *);
-
 static void handle_admin_message(struct userdata *, DBusMessage *);
-#if 0
-static void handle_info_message(struct userdata *, DBusMessage *);
-static void handle_action_message(struct userdata *, DBusMessage *);
-#endif
-
-static void murphy_registration_cb(struct userdata *, const char *,
-                                   DBusMessage *, void *);
-static bool register_to_murphy(struct userdata *);
-#if 0
-static int  signal_status(struct userdata *, uint32_t, uint32_t);
-#endif
-
+static bool register_to_controlif(struct userdata *);
 static DBusHandlerResult audiomgr_method_handler(DBusConnection *,
                                                  DBusMessage *, void *);
 static void audiomgr_register_domain_cb(struct userdata *, const char *,
                                         DBusMessage *, void *);
 static bool register_to_audiomgr(struct userdata *);
 static bool unregister_from_audiomgr(struct userdata *);
-
 static void audiomgr_register_node_cb(struct userdata *, const char *,
                                       DBusMessage *, void *);
 static void audiomgr_unregister_node_cb(struct userdata *, const char *,
@@ -179,12 +142,8 @@ static bool routerif_disconnect(struct userdata *, DBusMessage *);
 
 static const char *method_str(am_method);
 
-
 pa_routerif *pa_routerif_init(struct userdata *u,
                               const char      *dbustype,
-                              const char      *ifnam,
-                              const char      *mrppath,
-                              const char      *mrpnam,
                               const char      *ampath,
                               const char      *amnam)
 {
@@ -202,9 +161,8 @@ pa_routerif *pa_routerif_init(struct userdata *u,
     char            pathbuf[128];
     char           *amrnam;
     char           *amrpath;
-    char            actrule[512];
-    char            strrule[512];
-    char            admmrule[512];
+    char           *amcnam;
+    char           *amcpath;
     char            admarule[512];
     int             result;
     
@@ -253,24 +211,19 @@ pa_routerif *pa_routerif_init(struct userdata *u,
         goto fail;
     }
 
-    if (!ifnam)
-        ifnam = POLICY_DBUS_INTERFACE;
-
-    if (!mrppath)
-        mrppath = POLICY_DBUS_MRPPATH;
-
-    if (!mrpnam)
-        mrpnam = POLICY_DBUS_MRPNAME;
-
     if (ampath && *ampath) {
         char *slash = ampath[strlen(ampath)-1] == '/' ? "" : "/";
         snprintf(pathbuf, sizeof(pathbuf), "%s%s" AUDIOMGR_DBUS_ROUTE_PATH,
                  ampath, slash);
         amrpath = pathbuf;
+        snprintf(pathbuf, sizeof(pathbuf), "%s%s" AUDIOMGR_DBUS_CONTROL_PATH,
+                 ampath, slash);
+        amcpath = pathbuf;
     }
     else {
         ampath  = AUDIOMGR_DBUS_PATH;
         amrpath = AUDIOMGR_DBUS_PATH "/" AUDIOMGR_DBUS_ROUTE_PATH;
+        amcpath = AUDIOMGR_DBUS_PATH "/" AUDIOMGR_DBUS_CONTROL_PATH;
     }
 
     if (amnam && *amnam){
@@ -278,19 +231,16 @@ pa_routerif *pa_routerif_init(struct userdata *u,
         snprintf(nambuf, sizeof(nambuf), "%s%s" AUDIOMGR_DBUS_ROUTE_NAME,
                  amnam, dot);
         amrnam = nambuf;
+        snprintf(nambuf, sizeof(nambuf), "%s%s" AUDIOMGR_DBUS_CONTROL_NAME,
+                 amnam, dot);
+        amcnam = nambuf;
     }
     else {
         amnam  = AUDIOMGR_DBUS_INTERFACE;
         amrnam = AUDIOMGR_DBUS_INTERFACE "." AUDIOMGR_DBUS_ROUTE_NAME;
+        amcnam = AUDIOMGR_DBUS_INTERFACE "." AUDIOMGR_DBUS_ROUTE_NAME;
     }
 
-
-    snprintf(admmrule, sizeof(admmrule), "type='signal',sender='%s',path='%s',"
-             "interface='%s',member='%s',arg0='%s'", ADMIN_DBUS_MANAGER,
-             ADMIN_DBUS_PATH, ADMIN_DBUS_INTERFACE, ADMIN_NAME_OWNER_CHANGED,
-             mrpnam);
-    dbus_bus_add_match(dbusconn, admmrule, &error);
-
     snprintf(admarule, sizeof(admarule), "type='signal',sender='%s',path='%s',"
              "interface='%s',member='%s',arg0='%s'", ADMIN_DBUS_MANAGER,
              ADMIN_DBUS_PATH, ADMIN_DBUS_INTERFACE, ADMIN_NAME_OWNER_CHANGED,
@@ -303,48 +253,19 @@ pa_routerif *pa_routerif_init(struct userdata *u,
         goto fail;
     }
 
-    snprintf(actrule, sizeof(actrule), "type='signal',interface='%s',"
-             "member='%s',path='%s/%s'", ifnam, POLICY_ACTIONS,
-             mrppath, POLICY_DECISION);
-    dbus_bus_add_match(dbusconn, actrule, &error);
-
-    if (dbus_error_is_set(&error)) {
-        pa_log("%s: unable to subscribe policy %s signal on %s: %s: %s",
-               __FILE__, POLICY_ACTIONS, ifnam, error.name, error.message);
-        goto fail;
-    }
-
-    snprintf(strrule, sizeof(strrule), "type='signal',interface='%s',"
-             "member='%s',path='%s/%s'", ifnam, POLICY_STREAM_INFO,
-             mrppath, POLICY_DECISION);
-    dbus_bus_add_match(dbusconn, strrule, &error);
-
-    if (dbus_error_is_set(&error)) {
-        pa_log("%s: unable to subscribe policy %s signal on %s: %s: %s",
-               __FILE__, POLICY_STREAM_INFO, ifnam, error.name, error.message);
-        goto fail;
-    }
-
-    pa_log_info("%s: subscribed policy signals on %s", __FILE__, ifnam);
-
     dbus_connection_register_object_path(dbusconn, PULSE_DBUS_PATH, &vtable,u);
 
-
-    routerif->ifnam    = pa_xstrdup(ifnam);
-    routerif->mrppath  = pa_xstrdup(mrppath);
-    routerif->mrpnam   = pa_xstrdup(mrpnam);
     routerif->ampath   = pa_xstrdup(ampath);
     routerif->amnam    = pa_xstrdup(amnam);
     routerif->amrpath  = pa_xstrdup(amrpath);
     routerif->amrnam   = pa_xstrdup(amrnam);
-    routerif->admmrule = pa_xstrdup(admmrule);
+    routerif->amcpath  = pa_xstrdup(amrpath);
+    routerif->amcnam   = pa_xstrdup(amrnam);
     routerif->admarule = pa_xstrdup(admarule);
-    routerif->actrule  = pa_xstrdup(actrule);
-    routerif->strrule  = pa_xstrdup(strrule);
 
     u->routerif = routerif; /* Argh.. */
 
-    register_to_murphy(u);
+    register_to_controlif(u);
     register_to_audiomgr(u);
 
     return routerif;
@@ -375,25 +296,18 @@ static void free_routerif(pa_routerif *routerif, struct userdata *u)
                 dbus_connection_remove_filter(dbusconn, filter,u);
             }
 
-            dbus_bus_remove_match(dbusconn, routerif->admmrule, NULL);
             dbus_bus_remove_match(dbusconn, routerif->admarule, NULL);
-            dbus_bus_remove_match(dbusconn, routerif->actrule, NULL);
-            dbus_bus_remove_match(dbusconn, routerif->strrule, NULL);
 
             pa_dbus_connection_unref(routerif->conn);
         }
 
-        pa_xfree(routerif->ifnam);
-        pa_xfree(routerif->mrppath);
-        pa_xfree(routerif->mrpnam);
         pa_xfree(routerif->ampath);
         pa_xfree(routerif->amnam);
         pa_xfree(routerif->amrpath);
         pa_xfree(routerif->amrnam);
-        pa_xfree(routerif->admmrule);
+        pa_xfree(routerif->amcpath);
+        pa_xfree(routerif->amcnam);
         pa_xfree(routerif->admarule);
-        pa_xfree(routerif->actrule);
-        pa_xfree(routerif->strrule);
 
         pa_xfree(routerif);
     }
@@ -407,7 +321,6 @@ void pa_routerif_done(struct userdata *u)
     }
 }
 
-
 static DBusHandlerResult filter(DBusConnection *conn, DBusMessage *msg,
                                 void *arg)
 {
@@ -420,19 +333,6 @@ static DBusHandlerResult filter(DBusConnection *conn, DBusMessage *msg,
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
     }
 
-
-#if 0
-    if (dbus_message_is_signal(msg, POLICY_DBUS_INTERFACE,POLICY_STREAM_INFO)){
-        handle_info_message(u, msg);
-        return DBUS_HANDLER_RESULT_HANDLED;
-    }
-
-    if (dbus_message_is_signal(msg, POLICY_DBUS_INTERFACE, POLICY_ACTIONS)) {
-        handle_action_message(u, msg);
-        return DBUS_HANDLER_RESULT_HANDLED;
-    }
-#endif
-
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
 
@@ -459,21 +359,6 @@ static void handle_admin_message(struct userdata *u, DBusMessage *msg)
         return;
     }
 
-    if (!strcmp(name, routerif->mrpnam)) {
-        if (after && strcmp(after, "")) {
-            pa_log_debug("murphy is up");
-
-            if (!routerif->mregist) {
-                register_to_murphy(u);
-            }
-        }
-
-        if (name && before && (!after || !strcmp(after, ""))) {
-            pa_log_info("murphy is gone");
-            routerif->mregist = 0;
-        } 
-    } else
-
     if (!strcmp(name, routerif->amnam)) {
         if (after && strcmp(after, "")) {
             pa_log_debug("audio manager is up");
@@ -494,7 +379,6 @@ static void handle_admin_message(struct userdata *u, DBusMessage *msg)
     }
 }
 
-
 static void reply_cb(DBusPendingCall *pend, void *data)
 {
     struct pending  *pdata = (struct pending *)data;
@@ -574,404 +458,10 @@ static bool send_message_with_reply(struct userdata *u,
     return false;
 }
 
-
-/**************************************************************************
- *
- * Murphy interfaces
- *
- */
-#if 0
-void pa_routerif_send_device_state(struct userdata *u, char *state,
-                                   char **types, int ntype)
-{
-    static char     *path = (char *)"/org/tizen/policy/info";
-
-    pa_routerif     *routerif = u->routerif;
-    DBusConnection  *conn = pa_dbus_connection_get(routerif->conn);
-    DBusMessage     *msg;
-    DBusMessageIter  mit;
-    DBusMessageIter  dit;
-    int              i;
-    int              sts;
-
-    if (!types || ntype < 1)
-        return;
-
-    msg = dbus_message_new_signal(path, routerif->ifnam, "info");
-
-    if (msg == NULL) {
-        pa_log("%s: failed to make new info message", __FILE__);
-        goto fail;
-    }
-
-    dbus_message_iter_init_append(msg, &mit);
-
-    if (!dbus_message_iter_append_basic(&mit, DBUS_TYPE_STRING, &state) ||
-        !dbus_message_iter_open_container(&mit, DBUS_TYPE_ARRAY,"s", &dit)){
-        pa_log("%s: failed to build info message", __FILE__);
-        goto fail;
-    }
-
-    for (i = 0; i < ntype; i++) {
-        if (!dbus_message_iter_append_basic(&dit, DBUS_TYPE_STRING,&types[i])){
-            pa_log("%s: failed to build info message", __FILE__);
-            goto fail;
-        }
-    }
-
-    dbus_message_iter_close_container(&mit, &dit);
-
-    sts = dbus_connection_send(conn, msg, NULL);
-
-    if (!sts) {
-        pa_log("%s: Can't send info message: out of memory", __FILE__);
-    }
-
- fail:
-    dbus_message_unref(msg);    /* should cope with NULL msg */
-}
-
-void pa_routerif_send_media_status(struct userdata *u, const char *media,
-                                        const char *group, int active)
-{
-    static char        *path = (char *)"/org/tizen/policy/info";
-    static const char  *type = "media";
-
-    pa_routerif    *routerif = u->routerif;
-    DBusConnection *conn   = pa_dbus_connection_get(routerif->conn);
-    DBusMessage    *msg;
-    const char     *state;
-    int             success;
-
-    msg = dbus_message_new_signal(path, routerif->ifnam, "info");
-
-    if (msg == NULL)
-        pa_log("%s: failed to make new info message", __FILE__);
-    else {
-        state = active ? "active" : "inactive";
-
-        success = dbus_message_append_args(msg,
-                                           DBUS_TYPE_STRING, &type,
-                                           DBUS_TYPE_STRING, &media,
-                                           DBUS_TYPE_STRING, &group,
-                                           DBUS_TYPE_STRING, &state,
-                                           DBUS_TYPE_INVALID);
-        
-        if (!success)
-            pa_log("%s: Can't build D-Bus info message", __FILE__);
-        else {
-            if (!dbus_connection_send(conn, msg, NULL)) {
-                pa_log("%s: Can't send info message: out of memory", __FILE__);
-            }
-        }
-
-        dbus_message_unref(msg);
-    }
-}
-#endif
-
-#if 0
-static void handle_info_message(struct userdata *u, DBusMessage *msg)
-{
-    dbus_uint32_t  txid;
-    dbus_uint32_t  pid;
-    char          *oper;
-    char          *group;
-    char          *arg;
-    char          *method_str;
-    enum pa_classify_method method = pa_method_unknown;
-    char          *prop;
-    int            success;
-
-    success = dbus_message_get_args(msg, NULL,
-                                    DBUS_TYPE_UINT32, &txid,
-                                    DBUS_TYPE_STRING, &oper,
-                                    DBUS_TYPE_STRING, &group,
-                                    DBUS_TYPE_UINT32, &pid,
-                                    DBUS_TYPE_STRING, &arg,
-                                    DBUS_TYPE_STRING, &method_str,
-                                    DBUS_TYPE_STRING, &prop,
-                                    DBUS_TYPE_INVALID);
-    if (!success) {
-        pa_log("%s: failed to parse info message", __FILE__);
-        return;
-    }
-
-    if (!method_str)
-        method = pa_method_unknown;
-    else {
-        switch (method_str[0]) {
-        case 'e':
-            if (!strcmp(method_str, "equals"))
-                method = pa_method_equals;
-            break;
-        case 's':
-            if (!strcmp(method_str, "startswith"))
-                method = pa_method_startswith;
-            break;
-        case 'm':
-            if (!strcmp(method_str, "matches"))
-                method = pa_method_matches;
-            break;
-        case 't':
-            if (!strcmp(method_str, "true"))
-                method = pa_method_true;
-            break;
-        default:
-            method = pa_method_unknown;
-            break;
-        }
-    }
-
-    if (!arg)
-        method = pa_method_unknown;
-    else if (!strcmp(arg, "*"))
-        method = pa_method_true;
-
-    if (!strcmp(oper, "register")) {
-
-        if (pa_policy_group_find(u, group) == NULL) {
-            pa_log_debug("register client (%s|%u) failed: unknown group",
-                         group, pid);
-        }
-        else {
-            pa_log_debug("register client (%s|%u)", group, pid);
-            pa_classify_register_pid(u, (pid_t)pid, prop, method, arg, group);
-        }
-        
-    }
-    else if (!strcmp(oper, "unregister")) {
-        pa_log_debug("unregister client (%s|%u)", group, pid);
-        pa_classify_unregister_pid(u, (pid_t)pid, prop, method, arg);
-    }
-    else {
-        pa_log("%s: invalid operation: '%s'", __FILE__, oper);
-    }
-}
-
-static void handle_action_message(struct userdata *u, DBusMessage *msg)
-{
-    static struct actdsc actions[] = {
-/*
-        { "org.tizen.policy.audio_route" , audio_route_parser  },
-        { "org.tizen.policy.volume_limit", volume_limit_parser },
-        { "org.tizen.policy.audio_cork"  , audio_cork_parser   },
-        { "org.tizen.policy.audio_mute"  , audio_mute_parser   },
-        { "org.tizen.policy.context"     , context_parser      },
-*/
-        {               NULL             , NULL                }
-    };
-
-    struct actdsc   *act;
-    dbus_uint32_t    txid;
-    char            *actname;
-    DBusMessageIter  msgit;
-    DBusMessageIter  arrit;
-    DBusMessageIter  entit;
-    DBusMessageIter  actit;
-    int              success = true;
-
-    pa_log_debug("got policy actions");
-
-    dbus_message_iter_init(msg, &msgit);
-
-    if (dbus_message_iter_get_arg_type(&msgit) != DBUS_TYPE_UINT32)
-        return;
-
-    dbus_message_iter_get_basic(&msgit, (void *)&txid);
-
-    pa_log_debug("got actions (txid:%d)", txid);
-
-    if (!dbus_message_iter_next(&msgit) ||
-        dbus_message_iter_get_arg_type(&msgit) != DBUS_TYPE_ARRAY) {
-        success = false;
-        goto send_signal;
-    }
-
-    dbus_message_iter_recurse(&msgit, &arrit);
-
-    do {
-        if (dbus_message_iter_get_arg_type(&arrit) != DBUS_TYPE_DICT_ENTRY) {
-            success = false;
-            continue;
-        }
-
-        dbus_message_iter_recurse(&arrit, &entit);
-
-        do {
-            if (dbus_message_iter_get_arg_type(&entit) != DBUS_TYPE_STRING) {
-                success = false;
-                continue;
-            }
-            
-            dbus_message_iter_get_basic(&entit, (void *)&actname);
-            
-            if (!dbus_message_iter_next(&entit) ||
-                dbus_message_iter_get_arg_type(&entit) != DBUS_TYPE_ARRAY) {
-                success = false;
-                continue;
-            }
-            
-            dbus_message_iter_recurse(&entit, &actit);
-            
-            if (dbus_message_iter_get_arg_type(&actit) != DBUS_TYPE_ARRAY) {
-                success = false;
-                continue;
-            }
-            
-            for (act = actions;   act->name != NULL;   act++) {
-                if (!strcmp(actname, act->name))
-                    break;
-            }
-                                    
-            if (act->parser != NULL)
-                success &= act->parser(u, &actit);
-
-        } while (dbus_message_iter_next(&entit));
-
-    } while (dbus_message_iter_next(&arrit));
-
- send_signal:
-    signal_status(u, txid, success);
-}
-#endif
-
-static void murphy_registration_cb(struct userdata *u,
-                                   const char      *method,
-                                   DBusMessage     *reply,
-                                   void            *data)
-{
-    const char      *error_descr;
-    int              success;
-
-    (void)data;
-
-    if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
-        success = dbus_message_get_args(reply, NULL,
-                                        DBUS_TYPE_STRING, &error_descr,
-                                        DBUS_TYPE_INVALID);
-
-        if (!success)
-            error_descr = dbus_message_get_error_name(reply);
-
-        pa_log_info("%s: registration to Murphy failed: %s",
-                    __FILE__, error_descr);
-    }
-    else {
-        pa_log_info("Murphy replied to registration");
-
-        if (u->routerif) {
-            u->routerif->amisup = 1;
-        }
-    }
-}
-
-static bool register_to_murphy(struct userdata *u)
+static bool register_to_controlif(struct userdata *u)
 {
-    static const char *name = "pulseaudio";
-
-    pa_routerif    *routerif = u->routerif;
-    DBusConnection *conn   = pa_dbus_connection_get(routerif->conn);
-    DBusMessage    *msg;
-    const char     *signals[4];
-    const char    **v_ARRAY;
-    int             i;
-    int             success;
-
-    pa_log_info("%s: registering to murphy: name='%s' path='%s' if='%s'",
-                __FILE__, routerif->mrpnam, routerif->mrppath,routerif->ifnam);
-
-    msg = dbus_message_new_method_call(routerif->mrpnam, routerif->mrppath,
-                                       routerif->ifnam, "register");
-
-    if (msg == NULL) {
-        pa_log("%s: Failed to create D-Bus message to register", __FILE__);
-        success = false;
-        goto getout;
-    }
-
-    signals[i=0] = POLICY_ACTIONS;
-    v_ARRAY = signals;
-
-    success = dbus_message_append_args(msg,
-                                       DBUS_TYPE_STRING, &name,
-                                       DBUS_TYPE_ARRAY,
-                                       DBUS_TYPE_STRING, &v_ARRAY, i+1,
-                                       DBUS_TYPE_INVALID);
-    if (!success) {
-        pa_log("%s: Failed to build D-Bus message to register", __FILE__);
-        goto getout;
-    }
-
-    if (!send_message_with_reply(u, conn, msg, murphy_registration_cb, NULL)) {
-        pa_log("%s: Failed to register", __FILE__);
-        goto getout;
-    }
-
- getout:
-    dbus_message_unref(msg);
-    return success;
-}
-
-
-#if 0
-static int signal_status(struct userdata *u, uint32_t txid, uint32_t status)
-{
-    pa_routerif    *routerif = u->routerif;
-    DBusConnection *conn = pa_dbus_connection_get(routerif->conn);
-    DBusMessage    *msg;
-    char            path[256];
-    int             ret;
-
-    if (txid == 0) {
-    
-        /* When transaction ID is 0, the policy manager does not expect
-         * a response. */
-        
-        pa_log_debug("Not sending status message since transaction ID is 0");
-        return 0;
-    }
-
-    snprintf(path, sizeof(path), "%s/%s", routerif->mrppath, POLICY_DECISION);
-
-    pa_log_debug("sending signal to: path='%s', if='%s' member='%s' "
-                 "content: txid=%d status=%d", path, routerif->ifnam,
-                 POLICY_STATUS, txid, status);
-
-    msg = dbus_message_new_signal(path, routerif->ifnam, POLICY_STATUS);
-
-    if (msg == NULL) {
-        pa_log("%s: failed to make new status message", __FILE__);
-        goto fail;
-    }
-
-    ret = dbus_message_append_args(msg,
-            DBUS_TYPE_UINT32, &txid,
-            DBUS_TYPE_UINT32, &status,
-            DBUS_TYPE_INVALID);
-
-    if (!ret) {
-        pa_log("%s: Can't build D-Bus status message", __FILE__);
-        goto fail;
-    }
-
-    ret = dbus_connection_send(conn, msg, NULL);
-
-    if (!ret) {
-        pa_log("%s: Can't send status message: out of memory", __FILE__);
-        goto fail;
-    }
-
-    dbus_message_unref(msg);
-
-    return 0;
-
- fail:
-    dbus_message_unref(msg);    /* should cope with NULL msg */
-    return -1;
+    return true;
 }
-#endif
-
 
 /**************************************************************************
  *
@@ -1104,8 +594,6 @@ static void audiomgr_register_domain_cb(struct userdata *u,
     }
 }
 
-
-
 bool pa_routerif_register_domain(struct userdata   *u,
                                  am_domainreg_data *dr)
 {
@@ -1558,12 +1046,12 @@ bool pa_routerif_unregister_node(struct userdata *u,
                                        routerif->amrnam, method);
     
     if (msg == NULL) {
-        pa_log("%s: Failed to create D-BUS message to '%s'", __FILE__, method);
+        pa_log("%s: Failed to create D-Bus message for '%s'", __FILE__,method);
         goto getout;
     }
 
     success = dbus_message_append_args(msg,
-                                       DBUS_TYPE_UINT16, &ud->id,
+                                       DBUS_TYPE_INT16, &ud->id,
                                        DBUS_TYPE_INVALID);
 
     success = send_message_with_reply(u, conn, msg,
@@ -1578,6 +1066,140 @@ bool pa_routerif_unregister_node(struct userdata *u,
     return success;
 }
 
+bool pa_routerif_register_implicit_connection(struct userdata *u,
+                                              am_connect_data *cd)
+{
+    static const char    *method = AUDIOMGR_IMPLICIT_CONNECTION;
+
+    pa_routerif     *routerif;
+    DBusConnection  *conn;
+    DBusMessage     *msg;
+    bool             success = false;
+
+    pa_assert(u);
+    pa_assert(cd);
+    pa_assert_se((routerif = u->routerif));
+    pa_assert_se((conn = pa_dbus_connection_get(routerif->conn)));
+
+    pa_log_debug("%s: register implicit connection", __FUNCTION__);
+
+    msg = dbus_message_new_method_call(routerif->amnam, routerif->amcpath,
+                                       routerif->amcnam, method);
+    if (msg == NULL) {
+        pa_log("%s: Failed to create D-Bus message for '%s'", __FILE__,method);
+        goto getout;
+    }
+
+    dbus_message_set_no_reply(msg, true);
+
+    success = dbus_message_append_args(msg,
+                                       DBUS_TYPE_UINT16, &cd->connection,
+                                       DBUS_TYPE_INT16 , &cd->format,
+                                       DBUS_TYPE_UINT16, &cd->source,
+                                       DBUS_TYPE_UINT16, &cd->sink,
+                                       DBUS_TYPE_INVALID);
+    if (!success) {
+        pa_log("%s: failed to build message for %s", __FILE__, method);
+        goto getout;
+    }
+
+    success = dbus_connection_send(conn, msg, NULL);
+
+    if (!success) {
+        pa_log("%s: Failed to %s", __FILE__, method);
+        goto getout;
+    }
+
+ getout:
+    dbus_message_unref(msg);
+    return success;
+}
+
+bool pa_routerif_register_implicit_connections(struct userdata *u,
+                                               int              nconn,
+                                               am_connect_data *conns)
+{
+#if 0
+    static const char    *method = AUDIOMGR_IMPLICIT_CONNECTIONS;
+    static dbus_uint16_t  zero;
+
+    pa_routerif     *routerif;
+    DBusConnection  *conn;
+    DBusMessage     *msg;
+    DBusMessageIter  mit;
+    DBusMessageIter  ait;
+    DBusMessageIter  sit;
+    am_connect_data *cd;
+    int              i;
+    bool             success = false;
+
+    pa_assert(u);
+    pa_assert(nconn > 0);
+    pa_assert(conns);
+    pa_assert_se((routerif = u->routerif));
+    pa_assert_se((conn = pa_dbus_connection_get(routerif->conn)));
+
+    pa_log_debug("%s: register %d implicit connections", __FUNCTION__, nconn);
+
+    msg = dbus_message_new_method_call(routerif->amnam, routerif->amrpath,
+                                       routerif->amrnam, method);
+    if (msg == NULL) {
+        pa_log("%s: Failed to create D-Bus message for '%s'", __FILE__,method);
+        goto getout;
+    }
+
+    dbus_message_set_no_reply(msg, true);
+    dbus_message_iter_init_append(msg, &mit);
+
+#define CONT_OPEN(p,t,s,c) dbus_message_iter_open_container(p, t, s, c)
+#define CONT_APPEND(i,t,v) dbus_message_iter_append_basic(i, t, v)
+#define CONT_CLOSE(p,c)    dbus_message_iter_close_container(p, c)
+
+    if (!CONT_OPEN(&mit, DBUS_TYPE_ARRAY, "(qqqqn)", &ait)) {
+        pa_log("%s: failed to open array iterator for %s", __FILE__, method);
+        goto getout;
+    }
+
+    for (i = 0;   i < nconn;   i++) {
+        cd = conns + i;
+        
+        if (! CONT_OPEN   (&ait, DBUS_TYPE_STRUCT, NULL, &sit     ) ||
+            ! CONT_APPEND (&sit, DBUS_TYPE_UINT16, &cd->connection) ||
+            ! CONT_APPEND (&sit, DBUS_TYPE_UINT16, &cd->source    ) ||
+            ! CONT_APPEND (&sit, DBUS_TYPE_UINT16, &cd->sink      ) ||
+            ! CONT_APPEND (&sit, DBUS_TYPE_UINT16, &zero          ) ||
+            ! CONT_APPEND (&sit, DBUS_TYPE_INT16 , &cd->format    ) ||
+            ! CONT_CLOSE  (&ait,                          &sit    )   )
+        {
+            pa_log("%s: failed to build conn struct for %s", __FILE__, method);
+            goto getout;
+        }
+    }
+
+    if (!CONT_CLOSE(&mit, &ait)) {
+        pa_log("%s: failed to close array iterator for %s", __FILE__, method);
+        goto getout;
+    } 
+
+#undef CONT_CLOSE
+#undef CONT_APPEND
+#undef CONT_OPEN
+
+
+    success = dbus_connection_send(conn, msg, NULL);
+
+    if (!success) {
+        pa_log("%s: Failed to %s", __FILE__, method);
+        goto getout;
+    }
+
+ getout:
+    dbus_message_unref(msg);
+    return success;
+#endif
+    return true;
+}
+
 static bool routerif_connect(struct userdata *u, DBusMessage *msg)
 {
     struct am_connect_data ac;
@@ -1688,23 +1310,25 @@ bool pa_routerif_acknowledge(struct userdata *u, am_method m,
 static const char *method_str(am_method m)
 {
     switch (m) {
-    case audiomgr_register_domain:   return AUDIOMGR_REGISTER_DOMAIN;
-    case audiomgr_domain_complete:   return AUDIOMGR_DOMAIN_COMPLETE;
-    case audiomgr_deregister_domain: return AUDIOMGR_DEREGISTER_DOMAIN;
-    case audiomgr_register_source:   return AUDIOMGR_REGISTER_SOURCE;
-    case audiomgr_deregister_source: return AUDIOMGR_DEREGISTER_SOURCE;
-    case audiomgr_register_sink:     return AUDIOMGR_REGISTER_SINK;
-    case audiomgr_deregister_sink:   return AUDIOMGR_DEREGISTER_SINK;
-    case audiomgr_connect:           return AUDIOMGR_CONNECT;
-    case audiomgr_connect_ack:       return AUDIOMGR_CONNECT_ACK;   
-    case audiomgr_disconnect:        return AUDIOMGR_DISCONNECT;
-    case audiomgr_disconnect_ack:    return AUDIOMGR_DISCONNECT_ACK;    
-    case audiomgr_setsinkvol_ack:    return AUDIOMGR_SETSINKVOL_ACK;
-    case audiomgr_setsrcvol_ack:     return AUDIOMGR_SETSRCVOL_ACK;
-    case audiomgr_sinkvoltick_ack:   return AUDIOMGR_SINKVOLTICK_ACK;
-    case audiomgr_srcvoltick_ack:    return AUDIOMGR_SRCVOLTICK_ACK;
-    case audiomgr_setsinkprop_ack:   return AUDIOMGR_SETSINKPROP_ACK;
-    default:                         return "invalid_method";
+    case audiomgr_register_domain:      return AUDIOMGR_REGISTER_DOMAIN;
+    case audiomgr_domain_complete:      return AUDIOMGR_DOMAIN_COMPLETE;
+    case audiomgr_deregister_domain:    return AUDIOMGR_DEREGISTER_DOMAIN;
+    case audiomgr_register_source:      return AUDIOMGR_REGISTER_SOURCE;
+    case audiomgr_deregister_source:    return AUDIOMGR_DEREGISTER_SOURCE;
+    case audiomgr_register_sink:        return AUDIOMGR_REGISTER_SINK;
+    case audiomgr_deregister_sink:      return AUDIOMGR_DEREGISTER_SINK;
+    case audiomgr_implicit_connection:  return AUDIOMGR_IMPLICIT_CONNECTION;
+    case audiomgr_implicit_connections: return AUDIOMGR_IMPLICIT_CONNECTIONS;
+    case audiomgr_connect:              return AUDIOMGR_CONNECT;
+    case audiomgr_connect_ack:          return AUDIOMGR_CONNECT_ACK;   
+    case audiomgr_disconnect:           return AUDIOMGR_DISCONNECT;
+    case audiomgr_disconnect_ack:       return AUDIOMGR_DISCONNECT_ACK;    
+    case audiomgr_setsinkvol_ack:       return AUDIOMGR_SETSINKVOL_ACK;
+    case audiomgr_setsrcvol_ack:        return AUDIOMGR_SETSRCVOL_ACK;
+    case audiomgr_sinkvoltick_ack:      return AUDIOMGR_SINKVOLTICK_ACK;
+    case audiomgr_srcvoltick_ack:       return AUDIOMGR_SRCVOLTICK_ACK;
+    case audiomgr_setsinkprop_ack:      return AUDIOMGR_SETSINKPROP_ACK;
+    default:                            return "invalid_method";
     }
 }
 
index 582d5ea..97dbaac 100644 (file)
 #include "routerif.h"
 
 /*
- * audiomanager methods
+ * audiomanager router methods
  */
-#define AUDIOMGR_REGISTER_DOMAIN    "registerDomain"
-#define AUDIOMGR_DOMAIN_COMPLETE    "hookDomainRegistrationComplete"
-#define AUDIOMGR_DEREGISTER_DOMAIN  "deregisterDomain"
+#define AUDIOMGR_REGISTER_DOMAIN      "registerDomain"
+#define AUDIOMGR_DOMAIN_COMPLETE      "hookDomainRegistrationComplete"
+#define AUDIOMGR_DEREGISTER_DOMAIN    "deregisterDomain"
 
-#define AUDIOMGR_REGISTER_SOURCE    "registerSource"
-#define AUDIOMGR_DEREGISTER_SOURCE  "deregisterSource"
+#define AUDIOMGR_REGISTER_SOURCE      "registerSource"
+#define AUDIOMGR_DEREGISTER_SOURCE    "deregisterSource"
 
-#define AUDIOMGR_REGISTER_SINK      "registerSink"
-#define AUDIOMGR_DEREGISTER_SINK    "deregisterSink"
+#define AUDIOMGR_REGISTER_SINK        "registerSink"
+#define AUDIOMGR_DEREGISTER_SINK      "deregisterSink"
 
-#define AUDIOMGR_CONNECT            "asyncConnect"
-#define AUDIOMGR_CONNECT_ACK        "ackConnect"
+#define AUDIOMGR_CONNECT              "asyncConnect"
+#define AUDIOMGR_CONNECT_ACK          "ackConnect"
 
-#define AUDIOMGR_DISCONNECT         "asyncDisconnect"
-#define AUDIOMGR_DISCONNECT_ACK     "ackDisconnect"
+#define AUDIOMGR_DISCONNECT           "asyncDisconnect"
+#define AUDIOMGR_DISCONNECT_ACK       "ackDisconnect"
 
-#define AUDIOMGR_SETSINKVOL_ACK     "ackSetSinkVolume"
-#define AUDIOMGR_SETSRCVOL_ACK      "ackSetSourceVolume"
-#define AUDIOMGR_SINKVOLTICK_ACK    "ackSinkVolumeTick"
-#define AUDIOMGR_SRCVOLTICK_ACK     "ackSourceVolumeTick"
-#define AUDIOMGR_SETSINKPROP_ACK    "ackSetSinkSoundProperty"
+#define AUDIOMGR_SETSINKVOL_ACK       "ackSetSinkVolume"
+#define AUDIOMGR_SETSRCVOL_ACK        "ackSetSourceVolume"
+#define AUDIOMGR_SINKVOLTICK_ACK      "ackSinkVolumeTick"
+#define AUDIOMGR_SRCVOLTICK_ACK       "ackSourceVolumeTick"
+#define AUDIOMGR_SETSINKPROP_ACK      "ackSetSinkSoundProperty"
 
-
-#if 0
-void pa_routerif_send_device_state(struct userdata *,char *,char **,int);
-void pa_routerif_send_media_status(struct userdata *, const char *,
-                                   const char *, int);
-#endif
+/*
+ * audiomanager control methods
+ */
+#define AUDIOMGR_IMPLICIT_CONNECTION  "connect"
+#define AUDIOMGR_IMPLICIT_CONNECTIONS "disconnect"
 
 #endif
 
index 153ee0a..20cf107 100644 (file)
@@ -815,11 +815,8 @@ void pa_discover_register_sink_input(struct userdata *u, pa_sink_input *sinp)
 
         if (pa_sink_input_move_to(sinp, sink, false) < 0)
             pa_log("failed to route '%s' => '%s'",node->amname,target->amname);
-        else {
-            pa_log_debug("register route '%s' => '%s'",
-                         node->amname, target->amname);
-            /* FIXME: and actually do it ... */
-        }
+        else
+            pa_audiomgr_add_default_route(u, node, target);
     }
 }
 
@@ -872,14 +869,14 @@ bool pa_discover_preroute_sink_input(struct userdata *u,
         if (loopback) {
             if (!(node = pa_utils_get_node_from_data(u, mir_input, data))) {
                 pa_log_debug("can't find loopback node for sink-input");
-                return TRUE;
+                return true;
             }
 
             if (node->direction == mir_output) {
                 pa_log_debug("refuse to preroute loopback sink-input "
                              "(current route: sink %u @ %p)", data->sink ?
                              data->sink->index : PA_IDXSET_INVALID,data->sink);
-                return TRUE;
+                return true;
             }
 
             data->sink = NULL;
@@ -909,6 +906,8 @@ bool pa_discover_preroute_sink_input(struct userdata *u,
         fake.visible   = true;
         fake.available = true;
         fake.amname    = "<preroute sink-input>";
+        fake.amid      = AM_ID_INVALID;
+        fake.paidx     = PA_IDXSET_INVALID;
 
         role = pa_proplist_gets(data->proplist, PA_PROP_MEDIA_ROLE);
         sink = make_output_prerouting(u, &fake, &data->channel_map, role,NULL);
@@ -927,7 +926,7 @@ bool pa_discover_preroute_sink_input(struct userdata *u,
                 pa_log("can't set sink %u for new sink-input", sink->index);
                                                       /* copes wit NULL mux */
                 pa_multiplex_destroy(u->multiplex, core, fake.mux);
-                return FALSE;
+                return false;
             }
         }
     }
@@ -935,13 +934,13 @@ bool pa_discover_preroute_sink_input(struct userdata *u,
     if (loopback && data->sink && data->sink->module) {
         /* no ramp needed */
         if (pa_streq(data->sink->module->name, "module-combine-sink"))
-            return TRUE;
+            return true;
     }
 
     pa_log_debug("set sink-input ramp-muted");
     data->flags |= PA_SINK_INPUT_START_RAMP_MUTED;
 
-    return TRUE;
+    return true;
 }
 
 
@@ -960,7 +959,7 @@ void pa_discover_add_sink_input(struct userdata *u, pa_sink_input *sinp)
     const char        *media;
     mir_node_type      type;
     char               key[256];
-    bool          created;
+    bool               created;
     pa_muxnode        *mux;
     pa_nodeset_resdef *resdef;
     pa_nodeset_resdef  rdbuf;
@@ -1087,7 +1086,13 @@ void pa_discover_add_sink_input(struct userdata *u, pa_sink_input *sinp)
     else {
         pa_log_debug("register route '%s' => '%s'",
                      node->amname, snod->amname);
-        /* FIXME: and actually do it ... */
+
+        if (pa_utils_stream_has_default_route(sinp->proplist))
+            pa_audiomgr_add_default_route(u, node, snod);
+
+        /* FIXME: register explicit routes */
+        /* else pa_audiomgr_add/register_explicit_route() */
+        
 
         pa_fader_apply_volume_limits(u, pa_utils_get_stamp());
     }
@@ -1252,14 +1257,14 @@ bool pa_discover_preroute_source_output(struct userdata *u,
     if (pa_streq(mnam, "module-loopback")) {
         if (!(node = pa_utils_get_node_from_data(u, mir_output, data))) {
             pa_log_debug("can't find loopback node for source-output");
-            return TRUE;
+            return true;
         }
 
         if (node->direction == mir_input) {
             pa_log_debug("refuse to preroute loopback source-output "
                          "(current route: source %u @ %p)", data->source ?
                          data->source->index : PA_IDXSET_INVALID,data->source);
-            return TRUE;
+            return true;
         }
 
         data->source = NULL;
@@ -1300,7 +1305,7 @@ bool pa_discover_preroute_source_output(struct userdata *u,
         }
     }
 
-    return TRUE;
+    return true;
 }
 
 
@@ -1413,8 +1418,7 @@ void pa_discover_add_source_output(struct userdata *u, pa_source_output *sout)
     else {
         pa_log_debug("register route '%s' => '%s'",
                      snod->amname, node->amname);
-        /* FIXME: and actually do it ... */
-
+        pa_audiomgr_add_default_route(u, node, snod);
     }
 }
 
index 7842604..2b6667f 100644 (file)
@@ -206,8 +206,7 @@ int pa__init(pa_module *m) {
     u->nodeset   = pa_nodeset_init(u);
     u->audiomgr  = pa_audiomgr_init(u);
 #ifdef WITH_DBUS
-    u->routerif  = pa_routerif_init(u, dbustype, ifnam, mrppath, mrpnam,
-                                    ampath, amnam);
+    u->routerif  = pa_routerif_init(u, dbustype, ampath, amnam);
 #else
     u->routerif  = pa_routerif_init(u, socktype, amaddr, amport);
 #endif
index 896778f..ace8695 100644 (file)
@@ -36,7 +36,7 @@
 #include "fader.h"
 #include "utils.h"
 #include "classify.h"
-
+#include "audiomgr.h"
 
 static void rtgroup_destroy(struct userdata *, mir_rtgroup *);
 static int rtgroup_print(mir_rtgroup *, char *, int);
@@ -470,6 +470,8 @@ mir_node *mir_router_make_prerouting(struct userdata *u, mir_node *data)
 
     make_explicit_routes(u, stamp);
 
+    pa_audiomgr_delete_default_routes(u);
+
     MIR_DLIST_FOR_EACH_BACKWARD(mir_node, rtprilist, start, &router->nodlist) {
         if (start->implement == mir_device) {
 #if 0
@@ -522,6 +524,8 @@ void mir_router_make_routing(struct userdata *u)
 
     make_explicit_routes(u, stamp);
 
+    pa_audiomgr_delete_default_routes(u);
+
     MIR_DLIST_FOR_EACH_BACKWARD(mir_node,rtprilist, start, &router->nodlist) {
         if (start->implement == mir_device) {
 #if 0
@@ -541,6 +545,8 @@ void mir_router_make_routing(struct userdata *u)
             implement_default_route(u, start, end, stamp);
     }    
 
+    pa_audiomgr_send_default_routes(u);
+
     pa_fader_apply_volume_limits(u, stamp);
 
     ongoing_routing = false;
@@ -616,7 +622,7 @@ bool mir_router_phone_accept(struct userdata *u, mir_rtgroup *rtg,
             class != mir_bluetooth_sink   &&
             class != mir_bluetooth_carkit   )
         {
-            return TRUE;
+            return true;
         }
     }
 
@@ -904,6 +910,8 @@ static mir_node *find_default_route(struct userdata *u,
         
         pa_log_debug("routing '%s' => '%s'", start->amname, end->amname);
 
+        pa_audiomgr_add_default_route(u, start, end);
+        
         return end;
     }
     
index ead7650..514e6c1 100644 (file)
@@ -35,6 +35,9 @@ enum am_method {
 
     audiomgr_register_sink,
     audiomgr_deregister_sink,
+
+    audiomgr_implicit_connection,
+    audiomgr_implicit_connections,
     
     audiomgr_connect,
     audiomgr_connect_ack,
@@ -54,9 +57,7 @@ enum am_method {
 
 #ifdef WITH_DBUS
 pa_routerif *pa_routerif_init(struct userdata *, const char *,
-                              const char *, const char *,
-                              const char *, const char *,
-                              const char *);
+                              const char *, const char *);
 #else
 pa_routerif *pa_routerif_init(struct userdata *, const char *,
                               const char *, const char *);
@@ -75,8 +76,14 @@ bool pa_routerif_register_node(struct userdata *, am_method,
                                     am_nodereg_data *);
 bool pa_routerif_unregister_node(struct userdata *, am_method,
                                       am_nodeunreg_data *);
+
 bool pa_routerif_acknowledge(struct userdata *, am_method, am_ack_data *);
 
+bool pa_routerif_register_implicit_connection(struct userdata *,
+                                                   am_connect_data *);
+bool pa_routerif_register_implicit_connections(struct userdata *, int,
+                                                    am_connect_data *);
+
 #endif  /* foorouteriffoo */
 
 /*
index c782872..bac5e0d 100644 (file)
@@ -152,6 +152,11 @@ bool pa_routerif_unregister_node(struct userdata *u,
     return success;
 }
 
+pa_bool_t pa_routerif_register_implicit_connections(struct userdata *u,
+                                                    int              nconn,
+                                                    am_connect_data *conns)
+{
+}
 
 bool pa_routerif_acknowledge(struct userdata *u, am_method m,
                                   struct am_ack_data *ad)
@@ -174,23 +179,25 @@ bool pa_routerif_acknowledge(struct userdata *u, am_method m,
 static const char *method_str(am_method m)
 {
     switch (m) {
-    case audiomgr_register_domain:   return "register_domain";
-    case audiomgr_domain_complete:   return "domain_complete";
-    case audiomgr_deregister_domain: return "deregister_domain";
-    case audiomgr_register_source:   return "register_source";
-    case audiomgr_deregister_source: return "deregister_source";
-    case audiomgr_register_sink:     return "register_sink";
-    case audiomgr_deregister_sink:   return "deregister_sink";
-    case audiomgr_connect:           return "connect";
-    case audiomgr_connect_ack:       return "connect_ack";   
-    case audiomgr_disconnect:        return "disconnect";
-    case audiomgr_disconnect_ack:    return "disconnect_ack";    
-    case audiomgr_setsinkvol_ack:    return "setsinkvol_ack";
-    case audiomgr_setsrcvol_ack:     return "setsrcvol_ack";
-    case audiomgr_sinkvoltick_ack:   return "sinkvoltick_ack";
-    case audiomgr_srcvoltick_ack:    return "srcvoltick_ack";
-    case audiomgr_setsinkprop_ack:   return "setsinkprop_ack";
-    default:                         return "invalid_method";
+    case audiomgr_register_domain:      return "register_domain";
+    case audiomgr_domain_complete:      return "domain_complete";
+    case audiomgr_deregister_domain:    return "deregister_domain";
+    case audiomgr_register_source:      return "register_source";
+    case audiomgr_deregister_source:    return "deregister_source";
+    case audiomgr_register_sink:        return "register_sink";
+    case audiomgr_deregister_sink:      return "deregister_sink";
+    case audiomgr_implicit_connection:  return "register_implicit_connection";
+    case audiomgr_implicit_connections: return "replace_implicit_connections";
+    case audiomgr_connect:              return "connect";
+    case audiomgr_connect_ack:          return "connect_ack";   
+    case audiomgr_disconnect:           return "disconnect";
+    case audiomgr_disconnect_ack:       return "disconnect_ack";    
+    case audiomgr_setsinkvol_ack:       return "setsinkvol_ack";
+    case audiomgr_setsrcvol_ack:        return "setsrcvol_ack";
+    case audiomgr_sinkvoltick_ack:      return "sinkvoltick_ack";
+    case audiomgr_srcvoltick_ack:       return "srcvoltick_ack";
+    case audiomgr_setsinkprop_ack:      return "setsinkprop_ack";
+    default:                            return "invalid_method";
     }
 }