summaryrefslogtreecommitdiff
path: root/radio_routing.c
diff options
context:
space:
mode:
Diffstat (limited to 'radio_routing.c')
-rw-r--r--radio_routing.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/radio_routing.c b/radio_routing.c
new file mode 100644
index 0000000..342f7cc
--- /dev/null
+++ b/radio_routing.c
@@ -0,0 +1,147 @@
+
+#include <dbus/dbus.h>
+
+#include "radio_routing.h"
+
+#define SIGNAL_PATH "/com/nokia/policy/decision"
+#define SIGNAL_IFACE "com.nokia.policy"
+#define SIGNAL_NAME "audio_actions"
+
+#define POLICY_AUDIO_ROUTE "com.nokia.policy.audio_route"
+
+typedef struct {
+ const char * type;
+ const char * device;
+ const char * mode;
+ const char * hwid;
+} audio_route;
+
+static void add_entry(DBusMessageIter *array, const char *key, const char *value)
+{
+ DBusMessageIter str, var;
+
+ dbus_message_iter_open_container(array, DBUS_TYPE_STRUCT, NULL, &str);
+ dbus_message_iter_append_basic(&str, DBUS_TYPE_STRING, &key);
+ dbus_message_iter_open_container(&str, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_STRING_AS_STRING, &var);
+ dbus_message_iter_append_basic(&var, DBUS_TYPE_STRING, &value);
+ dbus_message_iter_close_container(&str, &var);
+ dbus_message_iter_close_container(array, &str);
+}
+
+static void fill_array2(DBusMessageIter *array, const audio_route *route)
+{
+ add_entry(array, "type", route->type);
+ add_entry(array, "device", route->device);
+ add_entry(array, "mode", route->mode);
+ add_entry(array, "hwid", route->hwid);
+}
+
+static void fill_dict(DBusMessageIter *dict, const audio_route *route)
+{
+ DBusMessageIter entry, array1, array2;
+ const char * str = POLICY_AUDIO_ROUTE;
+
+ dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY, NULL, &entry);
+ dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
+ dbus_message_iter_open_container(&entry, DBUS_TYPE_ARRAY,
+ DBUS_TYPE_ARRAY_AS_STRING
+ DBUS_STRUCT_BEGIN_CHAR_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING
+ DBUS_TYPE_VARIANT_AS_STRING
+ DBUS_STRUCT_END_CHAR_AS_STRING, &array1);
+ dbus_message_iter_open_container(&array1, DBUS_TYPE_ARRAY,
+ DBUS_STRUCT_BEGIN_CHAR_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING
+ DBUS_TYPE_VARIANT_AS_STRING
+ DBUS_STRUCT_END_CHAR_AS_STRING, &array2);
+ fill_array2(&array2, route);
+ dbus_message_iter_close_container(&array1, &array2);
+ dbus_message_iter_close_container(&entry, &array1);
+ dbus_message_iter_close_container(dict, &entry);
+}
+
+static void route_audio(const audio_route *route)
+{
+ DBusError error;
+ DBusConnection *conn;
+ DBusMessage *msg;
+ DBusMessageIter it, dict;
+ const dbus_uint32_t zero = 0;
+
+ dbus_error_init(&error);
+
+ conn = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
+ msg = dbus_message_new_signal(SIGNAL_PATH, SIGNAL_IFACE, SIGNAL_NAME);
+ dbus_message_iter_init_append(msg, &it);
+ dbus_message_iter_append_basic(&it, DBUS_TYPE_UINT32, &zero);
+
+ dbus_message_iter_open_container(&it, DBUS_TYPE_ARRAY,
+ DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING
+ DBUS_TYPE_ARRAY_AS_STRING
+ DBUS_TYPE_ARRAY_AS_STRING
+ DBUS_STRUCT_BEGIN_CHAR_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING
+ DBUS_TYPE_VARIANT_AS_STRING
+ DBUS_STRUCT_END_CHAR_AS_STRING
+ DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
+ &dict);
+ fill_dict(&dict, route);
+ dbus_message_iter_close_container(&it, &dict);
+
+ dbus_connection_send(conn, msg, NULL);
+ dbus_message_unref(msg);
+}
+
+void cfm_radio_route_audio_to_headphones()
+{
+ audio_route route = {
+ .type = "sink",
+ .device = "headphone",
+ .mode = "lineout",
+ .hwid = "na"
+ };
+ route_audio(&route);
+}
+
+void cfm_radio_route_audio_to_speakers()
+{
+ audio_route route = {
+ .type = "sink",
+ .device = "ihf",
+ .mode = "ihf",
+ .hwid = "na"
+ };
+ route_audio(&route);
+}
+
+void cfm_radio_route_audio_bypass()
+{
+ audio_route route = {
+ .type = "source",
+ .device = "fmrx",
+ .mode = "na",
+ .hwid = "na"
+ };
+ route_audio(&route);
+}
+
+void cfm_radio_route_audio_reset()
+{
+ audio_route route = {
+ .type = "sink",
+ .device = "headphone",
+ .mode = "lineout",
+ .hwid = "na"
+ };
+ route_audio(&route);
+ audio_route route2 = {
+ .type = "source",
+ .device = "microphone",
+ .mode = "na",
+ .hwid = "na"
+ };
+ route_audio(&route2);
+}
+