Bluetooth : Support AVC target feature
[platform/upstream/pulseaudio.git] / src / modules / bluetooth / bluez5-util.c
index e3cc3dc..70eb7b8 100644 (file)
@@ -1402,6 +1402,29 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us
 
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 #endif
+#ifdef TIZEN_BT_AVC_TARGET
+    } else if (dbus_message_is_signal(m, "org.projectx.bt_event", "AvcModeChanged")) {
+        pa_bluetooth_transport *t;
+        dbus_uint32_t mode = PA_BLUETOOTH_AVC_OFF;
+
+        if (!dbus_message_get_args(m, &err,
+            DBUS_TYPE_UINT32, &mode,
+            DBUS_TYPE_INVALID)) {
+            pa_log_error("Failed to parse org.projectx.bt_event.AvcModeChanged: %s", err.message);
+            goto fail;
+        }
+
+        if (!(t = pa_hashmap_first(y->transports)))
+            return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+        pa_log_debug("Previous mode [%d], New mode [%d]", t->avc_mode, mode);
+
+        t->avc_mode = mode;
+
+        pa_hook_fire(&t->device->discovery->hooks[PA_BLUETOOTH_HOOK_AVC_MODE_CHANGED], t);
+
+        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+#endif
     }
 
 fail:
@@ -1948,6 +1971,46 @@ fail:
     pa_assert_se(r = dbus_message_new_error(m, "org.bluez.Error.InvalidArguments", "Unable to clear configuration"));
     return r;
 }
+
+#ifdef TIZEN_BT_AVC_TARGET
+int pa_bluetooth_transport_get_avc_mode(pa_bluetooth_transport *t, unsigned int *avc_mode)
+{
+    DBusMessage *m, *r;
+    DBusError err;
+    int ret = 0;
+    uint32_t mode = 0;
+
+    pa_assert(t);
+    pa_assert(t->device);
+    pa_assert(t->device->discovery);
+
+    pa_assert_se(m = dbus_message_new_method_call("org.projectx.bt", "/org/projectx/bt_service", "org.projectx.bt", "get_avc_mode"));
+
+    dbus_error_init(&err);
+
+    r = dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(t->device->discovery->connection), m, -1, &err);
+    dbus_message_unref(m);
+
+    m = NULL;
+    if (!r) {
+        dbus_error_free(&err);
+        return -1;
+    }
+
+    if (!dbus_message_get_args(r, &err, DBUS_TYPE_UINT32, &mode, DBUS_TYPE_INVALID)) {
+        pa_log_error("Failed to parse reply: %s", err.message);
+        dbus_error_free(&err);
+        ret = -1;
+        goto finish;
+    }
+
+    *avc_mode = mode;
+
+finish:
+    dbus_message_unref(r);
+    return ret;
+}
+#endif
 #endif
 
 static DBusHandlerResult endpoint_handler(DBusConnection *c, DBusMessage *m, void *userdata) {
@@ -2119,6 +2182,9 @@ pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c, int headset_backe
             ",arg0='" BLUEZ_MEDIA_TRANSPORT_INTERFACE "'",
 #ifdef __TIZEN_BT__
             "type='signal',interface='org.bluez.ag_agent',member='SuspendMedia'",
+#ifdef TIZEN_BT_AVC_TARGET
+            "type='signal',interface='org.projectx.bt_event',member='AvcModeChanged',path='/org/projectx/bt/avc_mode'",
+#endif
 #endif
             NULL) < 0) {
         pa_log_error("Failed to add D-Bus matches: %s", err.message);
@@ -2201,6 +2267,9 @@ void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *y) {
                 "member='PropertiesChanged',arg0='" BLUEZ_MEDIA_TRANSPORT_INTERFACE "'",
 #ifdef __TIZEN_BT__
                  "type='signal',interface='org.bluez.ag_agent',member='SuspendMedia'",
+#ifdef TIZEN_BT_AVC_TARGET
+                 "type='signal',interface='org.projectx.bt_event',member='AvcModeChanged',path='/org/projectx/bt/avc_mode'",
+#endif
 #endif
                 NULL);