[RFC 05/24] bluetooth: Register Handsfree Audio Agent object path on the bus

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Jo?o Paulo Rechi Vita <jprvita@xxxxxxxxxxxxx>

This commit creates the Handsfree Audio Agent object path on
/HFPAudioAgent and implements the D-Bus introspection for it.
---
 src/modules/bluetooth/bluetooth-util.c | 48 +++++++++++++++++++++++++++-------
 1 file changed, 39 insertions(+), 9 deletions(-)

diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
index fb202c1..84e0760 100644
--- a/src/modules/bluetooth/bluetooth-util.c
+++ b/src/modules/bluetooth/bluetooth-util.c
@@ -36,6 +36,7 @@
 #define HFP_HS_ENDPOINT "/MediaEndpoint/HFPHS"
 #define A2DP_SOURCE_ENDPOINT "/MediaEndpoint/A2DPSource"
 #define A2DP_SINK_ENDPOINT "/MediaEndpoint/A2DPSink"
+#define HFP_AUDIO_AGENT_PATH "/HFPAudioAgent"
 
 #define ENDPOINT_INTROSPECT_XML                                         \
     DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE                           \
@@ -85,6 +86,24 @@
     " </interface>"                                                     \
     "</node>"
 
+#define HFP_AUDIO_AGENT_XML                                             \
+    "<node name=\"/test/hf\">"                                          \
+    "  <interface name=\"org.freedesktop.DBus.Introspectable\">"        \
+    "    <method name=\"Introspect\">"                                  \
+    "      <arg direction=\"out\" type=\"s\" />"                        \
+    "    </method>"                                                     \
+    "  </interface>"                                                    \
+    "  <interface name=\"org.ofono.HandsfreeAudioAgent\">"              \
+    "    <method name=\"Release\">"                                     \
+    "    </method>"                                                     \
+    "    <method name=\"NewConnection\">"                               \
+    "      <arg direction=\"in\"  type=\"o\" name=\"card_path\" />"     \
+    "      <arg direction=\"in\"  type=\"h\" name=\"sco_fd\" />"        \
+    "      <arg direction=\"in\"  type=\"y\" name=\"codec\" />"         \
+    "    </method>"                                                     \
+    "  </interface>"                                                    \
+    "</node>"
+
 typedef enum pa_bluez_version {
     BLUEZ_VERSION_UNKNOWN,
     BLUEZ_VERSION_4,
@@ -2075,7 +2094,7 @@ fail:
     return r;
 }
 
-static DBusHandlerResult endpoint_handler(DBusConnection *c, DBusMessage *m, void *userdata) {
+static DBusHandlerResult dbus_msg_handler(DBusConnection *c, DBusMessage *m, void *userdata) {
     struct pa_bluetooth_discovery *y = userdata;
     DBusMessage *r = NULL;
     DBusError e;
@@ -2093,11 +2112,16 @@ static DBusHandlerResult endpoint_handler(DBusConnection *c, DBusMessage *m, voi
     interface = y->version == BLUEZ_VERSION_4 ? "org.bluez.MediaEndpoint" : "org.bluez.MediaEndpoint1";
 
     if (!pa_streq(path, A2DP_SOURCE_ENDPOINT) && !pa_streq(path, A2DP_SINK_ENDPOINT) && !pa_streq(path, HFP_AG_ENDPOINT) &&
-        !pa_streq(path, HFP_HS_ENDPOINT))
+        !pa_streq(path, HFP_HS_ENDPOINT) && !pa_streq(path, HFP_AUDIO_AGENT_PATH))
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
     if (dbus_message_is_method_call(m, "org.freedesktop.DBus.Introspectable", "Introspect")) {
-        const char *xml = y->version == BLUEZ_VERSION_4 ? ENDPOINT_INTROSPECT_XML : MEDIA_ENDPOINT_1_INTROSPECT_XML;
+        const char *xml;
+
+        if (pa_streq(path, HFP_AUDIO_AGENT_PATH))
+            xml = HFP_AUDIO_AGENT_XML;
+        else
+            xml = y->version == BLUEZ_VERSION_4 ? ENDPOINT_INTROSPECT_XML : MEDIA_ENDPOINT_1_INTROSPECT_XML;
 
         pa_assert_se(r = dbus_message_new_method_return(m));
         pa_assert_se(dbus_message_append_args(r, DBUS_TYPE_STRING, &xml, DBUS_TYPE_INVALID));
@@ -2108,6 +2132,10 @@ static DBusHandlerResult endpoint_handler(DBusConnection *c, DBusMessage *m, voi
         r = endpoint_select_configuration(c, m, userdata);
     else if (dbus_message_is_method_call(m, interface, "ClearConfiguration"))
         r = endpoint_clear_configuration(c, m, userdata);
+    else if (dbus_message_is_method_call(m, "org.ofono.HandsfreeAudioAgent", "Release"))
+        pa_assert_se(r = dbus_message_new_method_return(m));
+    else if (dbus_message_is_method_call(m, "org.ofono.HandsfreeAudioAgent", "NewConnection"))
+        pa_assert_se(r = dbus_message_new_method_return(m));
     else
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
@@ -2124,8 +2152,8 @@ pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c) {
     pa_bluetooth_discovery *y;
     DBusConnection *conn;
     unsigned i;
-    static const DBusObjectPathVTable vtable_endpoint = {
-        .message_function = endpoint_handler,
+    static const DBusObjectPathVTable vt = {
+        .message_function = dbus_msg_handler,
     };
 
     pa_assert(c);
@@ -2187,10 +2215,11 @@ pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c) {
         goto fail;
     }
 
-    pa_assert_se(dbus_connection_register_object_path(conn, HFP_AG_ENDPOINT, &vtable_endpoint, y));
-    pa_assert_se(dbus_connection_register_object_path(conn, HFP_HS_ENDPOINT, &vtable_endpoint, y));
-    pa_assert_se(dbus_connection_register_object_path(conn, A2DP_SOURCE_ENDPOINT, &vtable_endpoint, y));
-    pa_assert_se(dbus_connection_register_object_path(conn, A2DP_SINK_ENDPOINT, &vtable_endpoint, y));
+    pa_assert_se(dbus_connection_register_object_path(conn, HFP_AG_ENDPOINT, &vt, y));
+    pa_assert_se(dbus_connection_register_object_path(conn, HFP_HS_ENDPOINT, &vt, y));
+    pa_assert_se(dbus_connection_register_object_path(conn, A2DP_SOURCE_ENDPOINT, &vt, y));
+    pa_assert_se(dbus_connection_register_object_path(conn, A2DP_SINK_ENDPOINT, &vt, y));
+    pa_assert_se(dbus_connection_register_object_path(conn, HFP_AUDIO_AGENT_PATH, &vt, y));
 
     init_bluez(y);
 
@@ -2240,6 +2269,7 @@ void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *y) {
         dbus_connection_unregister_object_path(pa_dbus_connection_get(y->connection), HFP_HS_ENDPOINT);
         dbus_connection_unregister_object_path(pa_dbus_connection_get(y->connection), A2DP_SOURCE_ENDPOINT);
         dbus_connection_unregister_object_path(pa_dbus_connection_get(y->connection), A2DP_SINK_ENDPOINT);
+        dbus_connection_unregister_object_path(pa_dbus_connection_get(y->connection), HFP_AUDIO_AGENT_PATH);
         pa_dbus_remove_matches(
             pa_dbus_connection_get(y->connection),
             "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged'"
-- 
1.7.11.7



[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux