From 7535fc47a7e2ae2b0055de65efcbdc2af44c3fa0 Mon Sep 17 00:00:00 2001 From: "Javier S. Pedro" Date: Fri, 28 Jan 2011 20:09:45 +0100 Subject: adding bugtracker link --- radio_routing.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 radio_routing.c (limited to 'radio_routing.c') 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 + +#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); +} + -- cgit v1.2.3