summaryrefslogtreecommitdiffstats
path: root/binding-bluetooth
diff options
context:
space:
mode:
authorMatt Ranostay <matt.ranostay@konsulko.com>2017-05-17 13:55:56 -0700
committerMatt Ranostay <matt.ranostay@konsulko.com>2017-05-18 23:56:53 -0700
commit2c43f450ffff7ed1beca03bf9d024a883f857d58 (patch)
treef4c5e6a35e931cdc6e1eac2c3ce5f210508457a2 /binding-bluetooth
parent1010598ea02c995e6332cc6164c159809a11c80d (diff)
binding: bluetooth: add initial avrcp controls
These avrcp controls only work at the application level for the settings application. The bluetooth binding at some point needs to be converted to system level binding. Change-Id: I5959c3939874b53c2b21115fb2a3e6a652ec0ffd Bug-AGL: SPEC-596 Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
Diffstat (limited to 'binding-bluetooth')
-rw-r--r--binding-bluetooth/bluetooth-api.c49
-rw-r--r--binding-bluetooth/bluetooth-manager.c59
-rw-r--r--binding-bluetooth/bluetooth-manager.h1
3 files changed, 109 insertions, 0 deletions
diff --git a/binding-bluetooth/bluetooth-api.c b/binding-bluetooth/bluetooth-api.c
index 31d179a..34caac5 100644
--- a/binding-bluetooth/bluetooth-api.c
+++ b/binding-bluetooth/bluetooth-api.c
@@ -603,6 +603,54 @@ static void bt_set_property (struct afb_req request)
}
+/**/
+static void bt_set_avrcp_controls (struct afb_req request)
+{
+ LOGD("\n");
+
+ const char *address = afb_req_value (request, "Address");
+ const char *value = afb_req_value (request, "value");
+ int ret = 0;
+ GSList *list = NULL;
+
+ if (NULL==value)
+ {
+ afb_req_fail (request, "failed", "Please Check Input Parameter");
+ return;
+ }
+
+ if (NULL == address)
+ {
+ list = adapter_get_devices_list();
+ if (NULL == list)
+ {
+ afb_req_fail (request, "failed", "No find devices");
+ return;
+ }
+
+ for (;list;list=list->next)
+ {
+ struct btd_device *BDdevice = list->data;
+ //LOGD("\n%s\t%s\n",BDdevice->bdaddr,BDdevice->name);
+ if (BDdevice->avconnected)
+ {
+ address = BDdevice->bdaddr;
+ break;
+ }
+ }
+ }
+
+ ret = device_call_avrcp_method(address, value);
+ if (0 == ret)
+ {
+ afb_req_success (request, NULL, NULL);
+ }
+ else
+ {
+ afb_req_fail (request, "failed", "Bluetooth set avrcp control failed");
+ }
+}
+
static void eventadd (struct afb_req request)
{
const char *tag = afb_req_value(request, "tag");
@@ -792,6 +840,7 @@ static const struct afb_verb_desc_v1 binding_verbs[]= {
{ .name = "disconnect", .session = AFB_SESSION_NONE, .callback = bt_disconnect, .info = "Disconnect special device" },
{ .name = "set_device_property", .session = AFB_SESSION_NONE, .callback = bt_set_device_property, .info = "Set special device property" },
{ .name = "set_property", .session = AFB_SESSION_NONE, .callback = bt_set_property, .info = "Set Bluetooth property" },
+{ .name = "set_avrcp_controls", .session = AFB_SESSION_NONE, .callback = bt_set_avrcp_controls, .info = "Set Bluetooth AVRCP controls" },
{ .name = "send_confirmation", .session = AFB_SESSION_NONE, .callback = bt_send_confirmation, .info = "Send Confirmation" },
{ .name = "eventadd", .session = AFB_SESSION_NONE, .callback = eventadd, .info = "adds the event of 'name' for the 'tag'"},
{ .name = "eventdel", .session = AFB_SESSION_NONE, .callback = eventdel, .info = "deletes the event of 'tag'"},
diff --git a/binding-bluetooth/bluetooth-manager.c b/binding-bluetooth/bluetooth-manager.c
index a6c4472..35c770f 100644
--- a/binding-bluetooth/bluetooth-manager.c
+++ b/binding-bluetooth/bluetooth-manager.c
@@ -1519,6 +1519,65 @@ int device_set_property(const char * bdaddr, const char *property_name,
return 0;
}
+/*
+ * call remote device avrcp method
+ * Only support controls (Play, Pause, Stop, Previous, Next)
+ * If success return 0, else return -1;
+ */
+int device_call_avrcp_method(const gchar* bdaddr, const gchar* method)
+{
+ LOGD("device:%s,value:%d\n", bdaddr, method);
+
+ struct btd_device * device;
+ GError *error = NULL;
+ GVariant *value;
+ gchar *path;
+
+ if (FALSE == BluetoothManage_InitFlag_Get()) {
+ LOGW("BluetoothManage Not Init\n");
+ return -1;
+ }
+
+ if ((0!=g_strcmp0 (method, "Play"))&&
+ (0!=g_strcmp0 (method, "Pause"))&&
+ (0!=g_strcmp0 (method, "Stop"))&&
+ (0!=g_strcmp0 (method, "Previous"))&&
+ (0!=g_strcmp0 (method, "Next")))
+ {
+ LOGD("Invalid method\n");
+ return -1;
+ }
+
+ devices_list_lock();
+ device = devices_list_find_device_by_bdaddr(bdaddr);
+
+ if (NULL == device) {
+ devices_list_unlock();
+ LOGD("not find device\n");
+ return -1;
+ }
+ path = g_strdup(device->path);
+ devices_list_unlock();
+
+ value = g_dbus_connection_call_sync(cli.system_conn, BLUEZ_SERVICE,
+ path, MEDIA_CONTROL1_INTERFACE,
+ method, NULL, NULL,
+ G_DBUS_CALL_FLAGS_NONE, DBUS_REPLY_TIMEOUT,
+ NULL, &error);
+
+ g_free(path);
+
+ if (NULL == value) {
+ LOGW ("Error : %s", error->message);
+ g_error_free(error);
+ return -1;
+ }
+
+ g_variant_unref(value);
+
+ return 0;
+}
+
/*
* Stops the GMainLoop
diff --git a/binding-bluetooth/bluetooth-manager.h b/binding-bluetooth/bluetooth-manager.h
index 4a86533..9b7eee0 100644
--- a/binding-bluetooth/bluetooth-manager.h
+++ b/binding-bluetooth/bluetooth-manager.h
@@ -185,6 +185,7 @@ int device_connect(const gchar *addr);
int device_disconnect(const gchar *addr);
//int device_disconnectProfile();
int device_set_property(const gchar * bdaddr, const gchar *property, const gchar *value);
+int device_call_avrcp_method(const gchar* device, const gchar* method);
int adapter_set_property(const gchar* property, gboolean value) ;