domain registration to AudioManager
authorJanos Kovacs <jankovac503@gmail.com>
Sun, 13 May 2012 16:31:01 +0000 (19:31 +0300)
committerJanos Kovacs <jankovac503@gmail.com>
Sun, 13 May 2012 16:31:01 +0000 (19:31 +0300)
Makefile.am
configure
configure.ac
src/Makefile.am
src/dbusif.c
src/dbusif.h
src/module-genivi-mir-symdef.h [new file with mode: 0644]
src/module-genivi-mir.c [moved from src/module-policy-enforcement.c with 86% similarity]
src/module-policy-enforcement-symdef.h [deleted file]

index 13e101d..10758c8 100644 (file)
@@ -1,4 +1,4 @@
-SUBDIRS = src doc
+SUBDIRS = src doc
 
 MAINTAINERCLEANFILES = \
         Makefile.in src/Makefile.in config.h.in configure \
index 0e07d3e..c445706 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for pulseaudio-policy-enforcement .
+# Generated by GNU Autoconf 2.68 for pulseaudio-genivi-mir .
 #
 # Report bugs to <janos.f.kovacs@nokia.com>.
 #
@@ -570,14 +570,14 @@ MFLAGS=
 MAKEFLAGS=
 
 # Identity of this package.
-PACKAGE_NAME='pulseaudio-policy-enforcement'
-PACKAGE_TARNAME='pulseaudio-policy-enforcement'
+PACKAGE_NAME='pulseaudio-genivi-mir'
+PACKAGE_TARNAME='pulseaudio-genivi-mir'
 PACKAGE_VERSION=''
-PACKAGE_STRING='pulseaudio-policy-enforcement '
+PACKAGE_STRING='pulseaudio-genivi-mir '
 PACKAGE_BUGREPORT='janos.f.kovacs@nokia.com'
 PACKAGE_URL=''
 
-ac_unique_file="src/module-policy-enforcement.c"
+ac_unique_file="src/module-genivi-mir.c"
 # Factoring default headers for most tests.
 ac_includes_default="\
 #include <stdio.h>
@@ -1327,7 +1327,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures pulseaudio-policy-enforcement  to adapt to many kinds of systems.
+\`configure' configures pulseaudio-genivi-mir  to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1376,7 +1376,7 @@ Fine tuning of the installation directories:
   --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
   --mandir=DIR            man documentation [DATAROOTDIR/man]
   --docdir=DIR            documentation root
-                          [DATAROOTDIR/doc/pulseaudio-policy-enforcement]
+                          [DATAROOTDIR/doc/pulseaudio-genivi-mir]
   --htmldir=DIR           html documentation [DOCDIR]
   --dvidir=DIR            dvi documentation [DOCDIR]
   --pdfdir=DIR            pdf documentation [DOCDIR]
@@ -1398,7 +1398,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of pulseaudio-policy-enforcement :";;
+     short | recursive ) echo "Configuration of pulseaudio-genivi-mir :";;
    esac
   cat <<\_ACEOF
 
@@ -1517,7 +1517,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-pulseaudio-policy-enforcement configure
+pulseaudio-genivi-mir configure
 generated by GNU Autoconf 2.68
 
 Copyright (C) 2010 Free Software Foundation, Inc.
@@ -1986,7 +1986,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by pulseaudio-policy-enforcement $as_me , which was
+It was created by pulseaudio-genivi-mir $as_me , which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   $ $0 $@
@@ -3290,7 +3290,7 @@ fi
 
 
 # Define the identity of the package.
- PACKAGE='pulseaudio-policy-enforcement'
+ PACKAGE='pulseaudio-genivi-mir'
  VERSION=''
 
 
@@ -14245,7 +14245,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by pulseaudio-policy-enforcement $as_me , which was
+This file was extended by pulseaudio-genivi-mir $as_me , which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -14302,7 +14302,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-pulseaudio-policy-enforcement config.status
+pulseaudio-genivi-mir config.status
 configured by $0, generated by GNU Autoconf 2.68,
   with options \\"\$ac_cs_config\\"
 
index 6a493cd..f419928 100644 (file)
@@ -3,11 +3,11 @@ m4_define(PAVER, regexp(FULL_PAVER, [\([0123456789.]+\).*], [\1]))
 
 AC_PREREQ(2.61)
 
-AC_INIT([pulseaudio-policy-enforcement],[PAVER],[janos.f.kovacs@nokia.com])
+AC_INIT([pulseaudio-genivi-mir],[PAVER],[janos.f.kovacs@nokia.com])
 
 DOC_SUPPORT_INIT()
 
-AC_CONFIG_SRCDIR([src/module-policy-enforcement.c])
+AC_CONFIG_SRCDIR([src/module-genivi-mir.c])
 AC_CONFIG_MACRO_DIR([m4])
 AM_INIT_AUTOMAKE([foreign 1.8.5 -Wall])
 
index bcafceb..45dfc0d 100644 (file)
@@ -1,7 +1,7 @@
-modlibexec_LTLIBRARIES = module-policy-enforcement.la
+modlibexec_LTLIBRARIES = module-genivi-mir.la
 
-module_policy_enforcement_la_SOURCES = \
-                       module-policy-enforcement.c \
+module_genivi_mir_la_SOURCES = \
+                       module-genivi-mir.c \
                        index-hash.c \
                        config-file.c \
                        client-ext.c \
@@ -15,6 +15,9 @@ module_policy_enforcement_la_SOURCES = \
                        policy-group.c \
                        context.c \
                        dbusif.c
-module_policy_enforcement_la_LDFLAGS = -module -avoid-version
-module_policy_enforcement_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) $(LIBPULSE_LIBS) $(PULSEDEVEL_LIBS)
-module_policy_enforcement_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) $(LIBPULSE_CFLAGS) $(PULSEDEVEL_CFLAGS) -DPULSEAUDIO_HAS_PORTS=$(PULSEAUDIO_HAS_PORTS)
+
+AM_CFLAGS = -g3 -O0
+
+module_genivi_mir_la_LDFLAGS = -module -avoid-version
+module_genivi_mir_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) $(LIBPULSE_LIBS) $(PULSEDEVEL_LIBS)
+module_genivi_mir_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) $(LIBPULSE_CFLAGS) $(PULSEDEVEL_CFLAGS) -DPULSEAUDIO_HAS_PORTS=$(PULSEAUDIO_HAS_PORTS)
index 627ba95..1530697 100644 (file)
 
 #define ADMIN_NAME_OWNER_CHANGED    "NameOwnerChanged"
 
-#define POLICY_DBUS_INTERFACE       "com.nokia.policy"
-#define POLICY_DBUS_MYPATH          "/com/nokia/policy/enforce/pulseaudio"
-#define POLICY_DBUS_MYNAME          "com.nokia.policy.pulseaudio"
-#define POLICY_DBUS_PDPATH          "/com/nokia/policy"
-#define POLICY_DBUS_PDNAME          "org.freedesktop.ohm"
+#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_REGISTER_DOMAIN    "registerDomain"
+#define AUDIOMGR_REGISTER_SOURCE    "registerSource"
+#define AUDIOMGR_REGISTER_SINK      "registerSink"
+#define AUDIOMGR_REGISTER_GATEWAY   "registerGateway"
+
+#define AUDIOMGR_CONNECT_ACK        "ackConnect"
+#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 POLICY_DECISION             "decision"
 #define POLICY_STREAM_INFO          "stream_info"
 #define PROP_ROUTE_SOURCE_MODE      "policy.source_route.mode"
 #define PROP_ROUTE_SOURCE_HWID      "policy.source_route.hwid"
 
+#define AUDIOMGR_DOMAIN             "PULSE"
+#define AUDIOMGR_NODE               "pulsePlugin"
 
 #define STRUCT_OFFSET(s,m) ((char *)&(((s *)0)->m) - (char *)0)
 
 struct pa_policy_dbusif {
     pa_dbus_connection *conn;
-    char               *ifnam;   /* signal interface */
-    char               *mypath;  /* my signal path */
-    char               *pdpath;  /* policy daemon's signal path */
-    char               *pdnam;   /* policy daemon's D-Bus name */
-    char               *admrule; /* match rule to catch name changes */
-    char               *actrule; /* match rule to catch action signals */
-    char               *strrule; /* match rule to catch stream info signals */
-    int                 regist;  /* wheter or not registered to policy daemon*/
+    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               *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 */
 };
 
 struct actdsc {                 /* action descriptor */
@@ -92,62 +115,55 @@ struct argctx {                 /* context arguments */
     char               *value;
 };
 
-static int action_parser(DBusMessageIter *, struct argdsc *, void *, int);
-static int audio_route_parser(struct userdata *, DBusMessageIter *);
-static int volume_limit_parser(struct userdata *, DBusMessageIter *);
-static int audio_cork_parser(struct userdata *, DBusMessageIter *);
-static int audio_mute_parser(struct userdata *, DBusMessageIter *);
-static int context_parser(struct userdata *, DBusMessageIter *);
+static void pa_policy_free_dbusif(struct pa_policy_dbusif *,struct userdata *);
 
 static DBusHandlerResult filter(DBusConnection *, DBusMessage *, void *);
+
 static void handle_admin_message(struct userdata *, DBusMessage *);
 static void handle_info_message(struct userdata *, DBusMessage *);
 static void handle_action_message(struct userdata *, DBusMessage *);
-static void registration_cb(DBusPendingCall *, void *);
-static int  register_to_pdp(struct pa_policy_dbusif *, struct userdata *);
+static void murphy_registration_cb(DBusPendingCall *, void *);
+static int  register_to_murphy(struct pa_policy_dbusif *, struct userdata *);
 static int  signal_status(struct userdata *, uint32_t, uint32_t);
-static void pa_policy_free_dbusif(struct pa_policy_dbusif *,struct userdata *);
+
+static void audiomgr_registration_cb(DBusPendingCall *, void *);
+static int register_to_audiomgr(struct pa_policy_dbusif *, struct userdata *);
 
 
 
 struct pa_policy_dbusif *pa_policy_dbusif_init(struct userdata *u,
                                                const char      *ifnam,
-                                               const char      *mypath,
-                                               const char      *pdpath,
-                                               const char      *pdnam)
+                                               const char      *mrppath,
+                                               const char      *mrpnam,
+                                               const char      *ampath,
+                                               const char      *amnam)
 {
     pa_module               *m = u->module;
     struct pa_policy_dbusif *dbusif = NULL;
     DBusConnection          *dbusconn;
     DBusError                error;
+    char                     nambuf[128];
+    char                     pathbuf[128];
+    char                    *amrnam;
+    char                    *amrpath;
     char                     actrule[512];
     char                     strrule[512];
-    char                     admrule[512];
+    char                     admmrule[512];
+    char                     admarule[512];
     
     dbusif = pa_xnew0(struct pa_policy_dbusif, 1);
 
     dbus_error_init(&error);
-    dbusif->conn = pa_dbus_bus_get(m->core, DBUS_BUS_SYSTEM, &error);
+    dbusif->conn = pa_dbus_bus_get(m->core, DBUS_BUS_SESSION, &error);
 
     if (dbusif->conn == NULL || dbus_error_is_set(&error)) {
-        pa_log("%s: failed to get SYSTEM Bus: %s: %s",
+        pa_log("%s: failed to get SESSION Bus: %s: %s",
                __FILE__, error.name, error.message);
         goto fail;
     }
 
     dbusconn = pa_dbus_connection_get(dbusif->conn);
 
-#if 0
-    flags  = DBUS_NAME_FLAG_REPLACE_EXISTING | DBUS_NAME_FLAG_DO_NOT_QUEUE;
-    result = dbus_bus_request_name(dbusconn, POLICY_DBUS_MYNAME, flags,&error);
-
-    if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER &&
-        result != DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER    ) {
-        pa_log("%s: D-Bus name request failed: %s: %s",
-               __FILE__, error.name, error.message);
-        goto fail;
-    }
-#endif
  
     if (!dbus_connection_add_filter(dbusconn, filter,u, NULL)) {
         pa_log("%s: failed to add filter function", __FILE__);
@@ -157,20 +173,47 @@ struct pa_policy_dbusif *pa_policy_dbusif_init(struct userdata *u,
     if (!ifnam)
         ifnam = POLICY_DBUS_INTERFACE;
 
-    if (!mypath)
-        mypath = POLICY_DBUS_MYPATH;
+    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;
+    }
+    else {
+        ampath  = AUDIOMGR_DBUS_PATH;
+        amrpath = AUDIOMGR_DBUS_PATH "/" AUDIOMGR_DBUS_ROUTE_PATH;
+    }
+
+    if (amnam && *amnam){
+        char *dot = amnam[strlen(amnam)-1] == '.' ? "" : ".";
+        snprintf(nambuf, sizeof(nambuf), "%s%s" AUDIOMGR_DBUS_ROUTE_NAME,
+                 amnam, dot);
+        amrnam = nambuf;
+    }
+    {
+        amnam  = AUDIOMGR_DBUS_INTERFACE;
+        amrnam = AUDIOMGR_DBUS_INTERFACE "." AUDIOMGR_DBUS_ROUTE_NAME;
+    }
+
 
-    if (!pdpath)
-        pdpath = POLICY_DBUS_PDPATH;
 
-    if (!pdnam)
-        pdnam = POLICY_DBUS_PDNAME;
+    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(admrule, sizeof(admrule), "type='signal',sender='%s',path='%s',"
+    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,
-             pdnam);
-    dbus_bus_add_match(dbusconn, admrule, &error);
+             amnam);
+    dbus_bus_add_match(dbusconn, admarule, &error);
 
     if (dbus_error_is_set(&error)) {
         pa_log("%s: unable to subscribe name change signals on %s: %s: %s",
@@ -180,7 +223,7 @@ struct pa_policy_dbusif *pa_policy_dbusif_init(struct userdata *u,
 
     snprintf(actrule, sizeof(actrule), "type='signal',interface='%s',"
              "member='%s',path='%s/%s'", ifnam, POLICY_ACTIONS,
-             pdpath, POLICY_DECISION);
+             mrppath, POLICY_DECISION);
     dbus_bus_add_match(dbusconn, actrule, &error);
 
     if (dbus_error_is_set(&error)) {
@@ -191,7 +234,7 @@ struct pa_policy_dbusif *pa_policy_dbusif_init(struct userdata *u,
 
     snprintf(strrule, sizeof(strrule), "type='signal',interface='%s',"
              "member='%s',path='%s/%s'", ifnam, POLICY_STREAM_INFO,
-             pdpath, POLICY_DECISION);
+             mrppath, POLICY_DECISION);
     dbus_bus_add_match(dbusconn, strrule, &error);
 
     if (dbus_error_is_set(&error)) {
@@ -202,15 +245,20 @@ struct pa_policy_dbusif *pa_policy_dbusif_init(struct userdata *u,
 
     pa_log_info("%s: subscribed policy signals on %s", __FILE__, ifnam);
 
-    dbusif->ifnam   = pa_xstrdup(ifnam);
-    dbusif->mypath  = pa_xstrdup(mypath);
-    dbusif->pdpath  = pa_xstrdup(pdpath);
-    dbusif->pdnam   = pa_xstrdup(pdnam);
-    dbusif->admrule = pa_xstrdup(admrule);
-    dbusif->actrule = pa_xstrdup(actrule);
-    dbusif->strrule = pa_xstrdup(strrule);
-
-    register_to_pdp(dbusif, u);
+    dbusif->ifnam    = pa_xstrdup(ifnam);
+    dbusif->mrppath  = pa_xstrdup(mrppath);
+    dbusif->mrpnam   = pa_xstrdup(mrpnam);
+    dbusif->ampath   = pa_xstrdup(ampath);
+    dbusif->amnam    = pa_xstrdup(amnam);
+    dbusif->amrpath  = pa_xstrdup(amrpath);
+    dbusif->amrnam   = pa_xstrdup(amrnam);
+    dbusif->admmrule = pa_xstrdup(admmrule);
+    dbusif->admarule = pa_xstrdup(admarule);
+    dbusif->actrule  = pa_xstrdup(actrule);
+    dbusif->strrule  = pa_xstrdup(strrule);
+
+    register_to_murphy(dbusif, u);
+    //register_to_audiomgr(dbusif, u);
 
     return dbusif;
 
@@ -234,7 +282,8 @@ static void pa_policy_free_dbusif(struct pa_policy_dbusif *dbusif,
                 dbus_connection_remove_filter(dbusconn, filter,u);
             }
 
-            dbus_bus_remove_match(dbusconn, dbusif->admrule, NULL);
+            dbus_bus_remove_match(dbusconn, dbusif->admmrule, NULL);
+            dbus_bus_remove_match(dbusconn, dbusif->admarule, NULL);
             dbus_bus_remove_match(dbusconn, dbusif->actrule, NULL);
             dbus_bus_remove_match(dbusconn, dbusif->strrule, NULL);
 
@@ -242,10 +291,14 @@ static void pa_policy_free_dbusif(struct pa_policy_dbusif *dbusif,
         }
 
         pa_xfree(dbusif->ifnam);
-        pa_xfree(dbusif->mypath);
-        pa_xfree(dbusif->pdpath);
-        pa_xfree(dbusif->pdnam);
-        pa_xfree(dbusif->admrule);
+        pa_xfree(dbusif->mrppath);
+        pa_xfree(dbusif->mrpnam);
+        pa_xfree(dbusif->ampath);
+        pa_xfree(dbusif->amnam);
+        pa_xfree(dbusif->amrpath);
+        pa_xfree(dbusif->amrnam);
+        pa_xfree(dbusif->admmrule);
+        pa_xfree(dbusif->admarule);
         pa_xfree(dbusif->actrule);
         pa_xfree(dbusif->strrule);
 
@@ -374,6 +427,11 @@ static DBusHandlerResult filter(DBusConnection *conn, DBusMessage *msg,
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
 
+/**************************************************************************
+ *
+ * Murphy interfaces
+ *
+ */
 static void handle_admin_message(struct userdata *u, DBusMessage *msg)
 {
     struct pa_policy_dbusif *dbusif;
@@ -396,23 +454,35 @@ static void handle_admin_message(struct userdata *u, DBusMessage *msg)
         return;
     }
 
-    if (strcmp(name, dbusif->pdnam)) {
-        return;
-    }
-
-    if (after && strcmp(after, "")) {
-        pa_log_debug("policy decision point is up");
+    if (!strcmp(name, dbusif->mrpnam)) {
+        if (after && strcmp(after, "")) {
+            pa_log_debug("murphy is up");
 
-        if (!dbusif->regist) {
-            register_to_pdp(dbusif, u);
+            if (!dbusif->mregist) {
+                register_to_murphy(dbusif, u);
+            }
         }
-    }
 
+        if (name && before && (!after || !strcmp(after, ""))) {
+            pa_log_info("murphy is gone");
+            dbusif->mregist = 0;
+        } 
+    } else
+
+    if (!strcmp(name, dbusif->amnam)) {
+        if (after && strcmp(after, "")) {
+            pa_log_debug("audio manager is up");
 
-    if (name && before && (!after || !strcmp(after, ""))) {
-        pa_log_info("policy decision point is gone");
-        dbusif->regist = 0;
-    } 
+            if (!dbusif->amisup) {
+                register_to_audiomgr(dbusif, u);
+            }
+        }
+
+        if (name && before && (!after || !strcmp(after, ""))) {
+            pa_log_info("audio manager is gone");
+            dbusif->amisup = 0;
+        } 
+    }
 }
 
 static void handle_info_message(struct userdata *u, DBusMessage *msg)
@@ -496,11 +566,13 @@ static void handle_info_message(struct userdata *u, DBusMessage *msg)
 static void handle_action_message(struct userdata *u, DBusMessage *msg)
 {
     static struct actdsc actions[] = {
+/*
         { "com.nokia.policy.audio_route" , audio_route_parser  },
         { "com.nokia.policy.volume_limit", volume_limit_parser },
         { "com.nokia.policy.audio_cork"  , audio_cork_parser   },
         { "com.nokia.policy.audio_mute"  , audio_mute_parser   },
         { "com.nokia.policy.context"     , context_parser      },
+*/
         {               NULL             , NULL                }
     };
 
@@ -577,263 +649,7 @@ static void handle_action_message(struct userdata *u, DBusMessage *msg)
     signal_status(u, txid, success);
 }
 
-static int action_parser(DBusMessageIter *actit, struct argdsc *descs,
-                         void *args, int len)
-{
-    DBusMessageIter  cmdit;
-    DBusMessageIter  argit;
-    DBusMessageIter  valit;
-    struct argdsc   *desc;
-    char            *argname;
-    void            *argval;
-    
-    dbus_message_iter_recurse(actit, &cmdit);
-
-    memset(args, 0, len);
-
-    do {
-        if (dbus_message_iter_get_arg_type(&cmdit) != DBUS_TYPE_STRUCT)
-            return FALSE;
-
-        dbus_message_iter_recurse(&cmdit, &argit);
-
-        if (dbus_message_iter_get_arg_type(&argit) != DBUS_TYPE_STRING)
-            return FALSE;
-
-        dbus_message_iter_get_basic(&argit, (void *)&argname);
-            
-        if (!dbus_message_iter_next(&argit))
-            return FALSE;
-
-        if (dbus_message_iter_get_arg_type(&argit) != DBUS_TYPE_VARIANT)
-            return FALSE;
-
-        dbus_message_iter_recurse(&argit, &valit);
-                    
-        for (desc = descs;  desc->name != NULL;  desc++) {
-            if (!strcmp(argname, desc->name)) {
-                if (desc->offs + (int)sizeof(char *) > len) {
-                    pa_log("%s: %s() desc offset %d  is out of range %d",
-                           __FILE__, __FUNCTION__, desc->offs, len);
-                    return FALSE;
-                }
-                else {
-                    if (dbus_message_iter_get_arg_type(&valit) != desc->type)
-                        return FALSE;
-
-                    argval = (char *)args + desc->offs;
-
-                    dbus_message_iter_get_basic(&valit, argval);
-                }
-                break;
-            }
-        }
-
-    } while (dbus_message_iter_next(&cmdit));
-
-    return TRUE;
-}
-
-static int audio_route_parser(struct userdata *u, DBusMessageIter *actit)
-{
-    static struct argdsc descs[] = {
-        {"type"  , STRUCT_OFFSET(struct argrt, type)  , DBUS_TYPE_STRING },
-        {"device", STRUCT_OFFSET(struct argrt, device), DBUS_TYPE_STRING },
-        {"mode"  , STRUCT_OFFSET(struct argrt, mode),   DBUS_TYPE_STRING },
-        {"hwid"  , STRUCT_OFFSET(struct argrt, hwid),   DBUS_TYPE_STRING },
-        {  NULL  ,            0                       , DBUS_TYPE_INVALID}
-    };
-
-    struct argrt args;
-    enum pa_policy_route_class class;
-    char *target;
-    char *mode;
-    char *hwid;
-    pa_proplist *p = NULL;
-
-    do {
-        if (!action_parser(actit, descs, &args, sizeof(args)))
-            return FALSE;
-
-        if (args.type == NULL || args.device == NULL)
-            return FALSE;
-
-        if (!strcmp(args.type, "sink"))
-            class = pa_policy_route_to_sink;
-        else if (!strcmp(args.type, "source"))
-            class = pa_policy_route_to_source;
-        else
-            return FALSE;
-
-        target = args.device;
-        mode   = (args.mode && strcmp(args.mode, "na")) ? args.mode : ""; 
-        hwid   = (args.hwid && strcmp(args.hwid, "na")) ? args.hwid : "";
-
-        pa_log_debug("route %s to %s (%s|%s)", args.type, target, mode, hwid);
-
-        p = pa_proplist_new();
-
-        if (class == pa_policy_route_to_sink) {
-            pa_proplist_sets(p, PROP_ROUTE_SINK_TARGET, target);
-            pa_proplist_sets(p, PROP_ROUTE_SINK_MODE, mode);
-            pa_proplist_sets(p, PROP_ROUTE_SINK_HWID, hwid);
-        } else {
-            pa_proplist_sets(p, PROP_ROUTE_SOURCE_TARGET, target);
-            pa_proplist_sets(p, PROP_ROUTE_SOURCE_MODE, mode);
-            pa_proplist_sets(p, PROP_ROUTE_SOURCE_HWID, hwid);
-        }
-
-        pa_module_update_proplist(u->module, PA_UPDATE_REPLACE, p);
-        pa_proplist_free(p);
-
-        if (pa_card_ext_set_profile(u, target) < 0 ||
-            (class == pa_policy_route_to_sink && 
-                pa_sink_ext_set_ports(u, target) < 0) ||
-            (class == pa_policy_route_to_source &&
-                pa_source_ext_set_ports(u, target) < 0) ||
-            pa_policy_group_move_to(u, NULL, class, target, mode, hwid) < 0)
-        {
-            pa_log("%s: can't route to %s %s", __FILE__, args.type, target);
-            return FALSE;
-        }
-
-    } while (dbus_message_iter_next(actit));
-
-    return TRUE;
-}
-
-static int volume_limit_parser(struct userdata *u, DBusMessageIter *actit)
-{
-    static struct argdsc descs[] = {
-        {"group", STRUCT_OFFSET(struct argvol, group), DBUS_TYPE_STRING },
-        {"limit", STRUCT_OFFSET(struct argvol, limit), DBUS_TYPE_INT32  },
-        {  NULL ,            0                       , DBUS_TYPE_INVALID}
-    };
-
-    struct argvol  args;
-    int            success = TRUE;
-
-    do {
-        if (!action_parser(actit, descs, &args, sizeof(args))) {
-            success = FALSE;
-            break;
-        }
-
-        if (args.group == NULL || args.limit < 0 || args.limit > 100) {
-            success = FALSE;
-            break;
-        }
-
-        pa_log_debug("volume limit (%s|%d)", args.group, args.limit); 
-
-        pa_policy_group_volume_limit(u, args.group, (uint32_t)args.limit);
-
-    } while (dbus_message_iter_next(actit));
-
-    pa_sink_ext_set_volumes(u);
-
-    return success;
-}
-
-static int audio_cork_parser(struct userdata *u, DBusMessageIter *actit)
-{
-    static struct argdsc descs[] = {
-        {"group", STRUCT_OFFSET(struct argcork, group), DBUS_TYPE_STRING },
-        {"cork" , STRUCT_OFFSET(struct argcork, cork) , DBUS_TYPE_STRING },
-        { NULL  ,            0                        , DBUS_TYPE_INVALID}
-    };
-    
-    struct argcork  args;
-    char           *grp;
-    int             val;
-    
-    do {
-        if (!action_parser(actit, descs, &args, sizeof(args)))
-            return FALSE;
-
-        if (args.group == NULL || args.cork == NULL)
-            return FALSE;
-
-        grp = args.group;
-
-        if (!strcmp(args.cork, "corked"))
-            val = 1;
-        else if (!strcmp(args.cork, "uncorked"))
-            val = 0;
-        else
-            return FALSE;
-        
-        pa_log_debug("cork stream (%s|%d)", grp, val);
-        pa_policy_group_cork(u, grp, val);
-
-    } while (dbus_message_iter_next(actit));
-    
-    return TRUE;
-}
-
-static int audio_mute_parser(struct userdata *u, DBusMessageIter *actit)
-{
-    static struct argdsc descs[] = {
-        {"device", STRUCT_OFFSET(struct argmute, device), DBUS_TYPE_STRING },
-        {"mute"  , STRUCT_OFFSET(struct argmute, mute)  , DBUS_TYPE_STRING },
-        { NULL   ,            0                         , DBUS_TYPE_INVALID}
-    };
-    
-    struct argmute  args;
-    char           *device;
-    int             val;
-    
-    do {
-        if (!action_parser(actit, descs, &args, sizeof(args)))
-            return FALSE;
-
-        if (args.device == NULL || args.mute == NULL)
-            return FALSE;
-
-        device = args.device;
-
-        if (!strcmp(args.mute, "muted"))
-            val = 1;
-        else if (!strcmp(args.mute, "unmuted"))
-            val = 0;
-        else
-            return FALSE;
-        
-        pa_log_debug("mute device (%s|%d)", device, val);
-        pa_source_ext_set_mute(u, device, val);
-
-    } while (dbus_message_iter_next(actit));
-    
-    return TRUE;
-}
-
-static int context_parser(struct userdata *u, DBusMessageIter *actit)
-{
-    static struct argdsc descs[] = {
-        {"variable", STRUCT_OFFSET(struct argctx,variable), DBUS_TYPE_STRING },
-        {"value"   , STRUCT_OFFSET(struct argctx,value)   , DBUS_TYPE_STRING },
-        {  NULL    ,            0                         , DBUS_TYPE_INVALID}
-    };
-    
-    struct argctx   args;
-    
-    do {
-        if (!action_parser(actit, descs, &args, sizeof(args)))
-            return FALSE;
-
-        if (args.variable == NULL || args.value == NULL)
-            return FALSE;
-
-        pa_log_debug("context (%s|%s)", args.variable, args.value);
-
-        pa_policy_context_variable_changed(u, args.variable, args.value);
-
-    } while (dbus_message_iter_next(actit));
-    
-    return TRUE;
-}
-
-static void registration_cb(DBusPendingCall *pend, void *data)
+static void murphy_registration_cb(DBusPendingCall *pend, void *data)
 {
     struct userdata *u = (struct userdata *)data;
     DBusMessage     *reply;
@@ -841,7 +657,8 @@ static void registration_cb(DBusPendingCall *pend, void *data)
     int              success;
 
     if ((reply = dbus_pending_call_steal_reply(pend)) == NULL || u == NULL) {
-        pa_log("%s: registartion setting failed: invalid argument", __FILE__);
+        pa_log("%s: Murphy registartion setting failed: "
+               "invalid argument", __FILE__);
         return;
     }
 
@@ -853,21 +670,22 @@ static void registration_cb(DBusPendingCall *pend, void *data)
         if (!success)
             error_descr = dbus_message_get_error_name(reply);
 
-        pa_log_info("%s: registration to policy decision point failed: %s",
+        pa_log_info("%s: registration to Murphy failed: %s",
                     __FILE__, error_descr);
     }
     else {
         pa_log_info("got reply to registration");
 
         if (u->dbusif) {
-            u->dbusif->regist = 1;
+            u->dbusif->amisup = 1;
         }
     }
 
     dbus_message_unref(reply);
 }
 
-static int register_to_pdp(struct pa_policy_dbusif *dbusif, struct userdata *u)
+static int register_to_murphy(struct pa_policy_dbusif *dbusif,
+                              struct userdata *u)
 {
     static const char *name = "pulseaudio";
 
@@ -879,10 +697,10 @@ static int register_to_pdp(struct pa_policy_dbusif *dbusif, struct userdata *u)
     int              i;
     int              success;
 
-    pa_log_info("%s: registering to policy daemon: name='%s' path='%s' if='%s'"
-                , __FILE__, dbusif->pdnam, dbusif->pdpath, dbusif->ifnam);
+    pa_log_info("%s: registering to murphy: name='%s' path='%s' if='%s'"
+                , __FILE__, dbusif->mrpnam, dbusif->mrppath, dbusif->ifnam);
 
-    msg = dbus_message_new_method_call(dbusif->pdnam, dbusif->pdpath,
+    msg = dbus_message_new_method_call(dbusif->mrpnam, dbusif->mrppath,
                                        dbusif->ifnam, "register");
 
     if (msg == NULL) {
@@ -911,7 +729,7 @@ static int register_to_pdp(struct pa_policy_dbusif *dbusif, struct userdata *u)
         goto failed;
     }
 
-    success = dbus_pending_call_set_notify(pend, registration_cb, u, NULL);
+    success = dbus_pending_call_set_notify(pend,murphy_registration_cb,u,NULL);
 
     if (!success) {
         pa_log("%s: Can't set notification for registartion", __FILE__);
@@ -940,7 +758,7 @@ static int signal_status(struct userdata *u, uint32_t txid, uint32_t status)
         return 0;
     }
 
-    snprintf(path, sizeof(path), "%s/%s", dbusif->pdpath, POLICY_DECISION);
+    snprintf(path, sizeof(path), "%s/%s", dbusif->mrppath, POLICY_DECISION);
 
     pa_log_debug("sending signal to: path='%s', if='%s' member='%s' "
                  "content: txid=%d status=%d", path, dbusif->ifnam,
@@ -980,6 +798,118 @@ static int signal_status(struct userdata *u, uint32_t txid, uint32_t status)
     return -1;
 }
 
+/**************************************************************************
+ *
+ * Audio Manager interfaces
+ *
+ */
+static void audiomgr_registration_cb(DBusPendingCall *pend, void *data)
+{
+    struct userdata *u = (struct userdata *)data;
+    DBusMessage     *reply;
+    const char      *error_descr;
+    int              success;
+
+    if ((reply = dbus_pending_call_steal_reply(pend)) == NULL || u == NULL) {
+        pa_log("%s: AudioManager registartion setting failed: "
+               "invalid argument", __FILE__);
+        return;
+    }
+
+    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 AudioManager failed: %s",
+                    __FILE__, error_descr);
+    }
+    else {
+        pa_log_info("got reply to registration");
+
+        if (u->dbusif) {
+            u->dbusif->amisup = 1;
+        }
+    }
+
+    dbus_message_unref(reply);
+}
+
+static int register_to_audiomgr(struct pa_policy_dbusif *dbusif,
+                                struct userdata *u)
+{
+    DBusConnection  *conn   = pa_dbus_connection_get(dbusif->conn);
+    DBusMessage     *msg;
+    DBusPendingCall *pend;
+    uint16_t         domain_id;
+    const char      *name;
+    const char      *bus_name;
+    const char      *node_name;
+    dbus_bool_t      early;
+    dbus_bool_t      complete;
+    uint16_t         state;
+    int              success;
+
+    pa_log_info("%s: registering to AudioManager: name='%s' path='%s' if='%s'"
+                , __FILE__, dbusif->amnam, dbusif->amrpath, dbusif->amrnam);
+
+    msg = dbus_message_new_method_call(dbusif->amnam,
+                                       dbusif->amrpath,
+                                       dbusif->amrnam,
+                                       AUDIOMGR_REGISTER_DOMAIN);
+    if (msg == NULL) {
+        pa_log("%s: Failed to create D-Bus message to register", __FILE__);
+        success = FALSE;
+        goto failed;
+    }
+
+    domain_id = 0;
+    name      = AUDIOMGR_DOMAIN;
+    bus_name  = AUDIOMGR_NODE;
+    node_name = AUDIOMGR_NODE;
+    early     = FALSE;
+    complete  = FALSE;
+    state     = 0;
+
+    success = dbus_message_append_args(msg,
+                                       DBUS_TYPE_UINT16,  &domain_id,
+                                       DBUS_TYPE_STRING,  &name,
+                                       DBUS_TYPE_STRING,  &node_name,
+                                       DBUS_TYPE_STRING,  &bus_name,
+                                       DBUS_TYPE_BOOLEAN, &early,
+                                       DBUS_TYPE_BOOLEAN, &complete,
+                                       DBUS_TYPE_UINT16 , &state,
+                                       DBUS_TYPE_STRING , &name,      /* ??? */
+                                       DBUS_TYPE_STRING , &node_name, /* ??? */
+                                       DBUS_TYPE_STRING , &node_name, /* ??? */
+                                       DBUS_TYPE_INVALID);
+    if (!success) {
+        pa_log("%s: Failed to build D-Bus message to register", __FILE__);
+        goto failed;
+    }
+
+
+    success = dbus_connection_send_with_reply(conn, msg, &pend, 10000);
+    if (!success) {
+        pa_log("%s: Failed to register", __FILE__);
+        goto failed;
+    }
+
+    success = dbus_pending_call_set_notify(pend, audiomgr_registration_cb,
+                                           u, NULL);
+
+    if (!success) {
+        pa_log("%s: Can't set notification for registartion", __FILE__);
+    }
+
+ failed:
+    dbus_message_unref(msg);
+    return success;
+}
+
 
 /*
  * Local Variables:
index 4538e9e..34cb3ce 100644 (file)
@@ -7,7 +7,7 @@ struct pa_policy_dbusif;
 
 struct pa_policy_dbusif *pa_policy_dbusif_init(struct userdata *, const char *,
                                                const char *, const char *,
-                                               const char *);
+                                               const char *, const char *);
 void pa_policy_dbusif_done(struct userdata *);
 void pa_policy_dbusif_send_device_state(struct userdata *,char *,char **,int);
 void pa_policy_dbusif_send_media_status(struct userdata *, const char *,
diff --git a/src/module-genivi-mir-symdef.h b/src/module-genivi-mir-symdef.h
new file mode 100644 (file)
index 0000000..ba8fbc9
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef foogenivimirsymdeffoo
+#define foogenivimirsymdeffoo
+
+#include <pulsecore/core.h>
+#include <pulsecore/module.h>
+#include <pulsecore/macro.h>
+
+#define pa__init module_genivi_mir_LTX_pa__init
+#define pa__done module_genivi_mir_LTX_pa__done
+#define pa__get_author module_genivi_mir_LTX_pa__get_author
+#define pa__get_description module_genivi_mir_LTX_pa__get_description
+#define pa__get_usage module_genivi_mir_LTX_pa__get_usage
+#define pa__get_version module_genivi_mir_LTX_pa__get_version
+#define pa__load_once module_genivi_mir_LTX_pa__load_once
+
+int pa__init(pa_module *m);
+void pa__done(pa_module *m);
+
+const char* pa__get_author(void);
+const char* pa__get_description(void);
+const char* pa__get_usage(void);
+const char* pa__get_version(void);
+pa_bool_t pa__load_once(void);
+
+#endif
similarity index 86%
rename from src/module-policy-enforcement.c
rename to src/module-genivi-mir.c
index 21e0f44..bda3696 100644 (file)
@@ -25,7 +25,7 @@
 #include <pulsecore/modargs.h>
 #include <pulsecore/log.h>
 
-#include "module-policy-enforcement-symdef.h"
+#include "module-genivi-mir-symdef.h"
 #include "userdata.h"
 #include "index-hash.h"
 #include "config-file.h"
@@ -52,9 +52,10 @@ PA_MODULE_LOAD_ONCE(TRUE);
 PA_MODULE_USAGE(
     "config_file=<policy configuration file> "
     "dbus_if_name=<policy dbus interface> "
-    "dbus_my_path=<our path> "
-    "dbus_policyd_path=<policy daemon's path> "
-    "dbus_policyd_name=<policy daemon's name> "
+    "dbus_murphy_path=<policy daemon's path> "
+    "dbus_murphy_name=<policy daemon's name> "
+    "dbus_audiomgr_path=<GenIVI audio manager's path> " 
+    "dbus_audiomgr_name=<GenIVI audio manager's name> " 
     "null_sink_name=<name of the null sink> "
     "othermedia_preemption=<on|off> "
     "configdir=<configuration directory>"
@@ -63,9 +64,10 @@ PA_MODULE_USAGE(
 static const char* const valid_modargs[] = {
     "config_file",
     "dbus_if_name",
-    "dbus_my_path",
-    "dbus_policyd_path",
-    "dbus_policyd_name",
+    "dbus_murphy_path",
+    "dbus_murphy_name",
+    "dbus_audiomgr_path",
+    "dbus_audiomgr_name",
     "null_sink_name",
     "othermedia_preemption",
     "configdir",
@@ -78,9 +80,10 @@ int pa__init(pa_module *m) {
     pa_modargs      *ma = NULL;
     const char      *cfgfile;
     const char      *ifnam;
-    const char      *mypath;
-    const char      *pdpath;
-    const char      *pdnam;
+    const char      *mrppath;
+    const char      *mrpnam;
+    const char      *ampath;
+    const char      *amnam;
     const char      *nsnam;
     const char      *preempt;
     const char      *cfgdir;
@@ -94,9 +97,10 @@ int pa__init(pa_module *m) {
 
     cfgfile = pa_modargs_get_value(ma, "config_file", NULL);
     ifnam   = pa_modargs_get_value(ma, "dbus_if_name", NULL);
-    mypath  = pa_modargs_get_value(ma, "dbus_my_path", NULL);
-    pdpath  = pa_modargs_get_value(ma, "dbus_policyd_path", NULL);
-    pdnam   = pa_modargs_get_value(ma, "dbus_policyd_name", NULL);
+    mrppath = pa_modargs_get_value(ma, "dbus_murphy_path", NULL);
+    mrpnam  = pa_modargs_get_value(ma, "dbus_murphy_name", NULL);
+    ampath  = pa_modargs_get_value(ma, "dbus_audiomgr_path", NULL);
+    amnam   = pa_modargs_get_value(ma, "dbus_audiomgr_name", NULL);
     nsnam   = pa_modargs_get_value(ma, "null_sink_name", NULL);
     preempt = pa_modargs_get_value(ma, "othermedia_preemption", NULL);
     cfgdir  = pa_modargs_get_value(ma, "configdir", NULL);
@@ -118,7 +122,7 @@ int pa__init(pa_module *m) {
     u->groups   = pa_policy_groupset_new(u);
     u->classify = pa_classify_new(u);
     u->context  = pa_policy_context_new(u);
-    u->dbusif   = pa_policy_dbusif_init(u, ifnam, mypath, pdpath, pdnam);
+    u->dbusif   = pa_policy_dbusif_init(u,ifnam, mrppath,mrpnam, ampath,amnam);
 
     if (u->scl == NULL      || u->ssnk == NULL     || u->ssrc == NULL ||
         u->ssi == NULL      || u->sso == NULL      || u->scrd == NULL ||
diff --git a/src/module-policy-enforcement-symdef.h b/src/module-policy-enforcement-symdef.h
deleted file mode 100644 (file)
index 1182f71..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef foopolicyenforcementsymdeffoo
-#define foopolicyenforcementsymdeffoo
-
-#include <pulsecore/core.h>
-#include <pulsecore/module.h>
-#include <pulsecore/macro.h>
-
-#define pa__init module_policy_enforcement_LTX_pa__init
-#define pa__done module_policy_enforcement_LTX_pa__done
-#define pa__get_author module_policy_enforcement_LTX_pa__get_author
-#define pa__get_description module_policy_enforcement_LTX_pa__get_description
-#define pa__get_usage module_policy_enforcement_LTX_pa__get_usage
-#define pa__get_version module_policy_enforcement_LTX_pa__get_version
-#define pa__load_once module_policy_enforcement_LTX_pa__load_once
-
-int pa__init(pa_module*m);
-void pa__done(pa_module*m);
-
-const char* pa__get_author(void);
-const char* pa__get_description(void);
-const char* pa__get_usage(void);
-const char* pa__get_version(void);
-pa_bool_t pa__load_once(void);
-
-#endif