From: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
To: linux-bluetooth@vger.kernel.org
Cc: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Subject: [PATCH_v3] android/avrcp: Add initial support for new AVRCP CTRL interface
Date: Tue, 11 Nov 2014 14:07:06 +0200 [thread overview]
Message-ID: <1415707626-13531-1-git-send-email-ravikumar.veeramally@linux.intel.com> (raw)
---
android/avrcp.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++---------
android/avrcp.h | 4 +++
android/main.c | 11 +++++++
3 files changed, 96 insertions(+), 14 deletions(-)
diff --git a/android/avrcp.c b/android/avrcp.c
index a0d412d..87335c3 100644
--- a/android/avrcp.c
+++ b/android/avrcp.c
@@ -60,6 +60,7 @@ static uint32_t record_ct_id = 0;
static GSList *devices = NULL;
static GIOChannel *server = NULL;
static struct ipc *hal_ipc = NULL;
+static struct ipc *hal_ipc_ctrl = NULL;
struct avrcp_request {
struct avrcp_device *dev;
@@ -1082,20 +1083,22 @@ bool bt_avrcp_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode)
}
record_tg_id = rec->handle;
- rec = avrcp_ct_record();
- if (!rec) {
- error("Failed to allocate AVRCP CT record");
- bt_adapter_remove_record(record_tg_id);
- goto fail;
- }
+ if (!record_ct_id) {
+ rec = avrcp_ct_record();
+ if (!rec) {
+ error("Failed to allocate AVRCP CT record");
+ bt_adapter_remove_record(record_tg_id);
+ goto fail;
+ }
- if (bt_adapter_add_record(rec, 0) < 0) {
- error("Failed to register AVRCP CT record");
- bt_adapter_remove_record(record_tg_id);
- sdp_record_free(rec);
- goto fail;
+ if (bt_adapter_add_record(rec, 0) < 0) {
+ error("Failed to register AVRCP CT record");
+ bt_adapter_remove_record(record_tg_id);
+ sdp_record_free(rec);
+ goto fail;
+ }
+ record_ct_id = rec->handle;
}
- record_ct_id = rec->handle;
hal_ipc = ipc;
@@ -1124,8 +1127,11 @@ void bt_avrcp_unregister(void)
bt_adapter_remove_record(record_tg_id);
record_tg_id = 0;
- bt_adapter_remove_record(record_ct_id);
- record_ct_id = 0;
+ /* Remove only when AVRCP Controller already unregistered */
+ if (!hal_ipc_ctrl) {
+ bt_adapter_remove_record(record_ct_id);
+ record_ct_id = 0;
+ }
if (server) {
g_io_channel_shutdown(server, TRUE, NULL);
@@ -1171,3 +1177,64 @@ void bt_avrcp_disconnect(const bdaddr_t *dst)
avrcp_device_remove(dev);
}
+
+static void handle_send_passthrough(const void *buf, uint16_t len)
+{
+ DBG("Not Implemented");
+
+ ipc_send_rsp(hal_ipc_ctrl, HAL_SERVICE_ID_AVRCP_CTRL,
+ HAL_OP_AVRCP_CTRL_SEND_PASSTHROUGH,
+ HAL_STATUS_UNSUPPORTED);
+}
+
+static const struct ipc_handler ctrl_cmd_handlers[] = {
+ /* HAL_OP_AVRCP_CTRL_SEND_PASSTHROUGH */
+ { handle_send_passthrough, false,
+ sizeof(struct hal_cmd_avrcp_ctrl_send_passthrough) },
+};
+
+bool bt_avrcp_ctrl_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode)
+{
+ sdp_record_t *rec;
+
+ DBG("");
+
+ if (!record_ct_id) {
+ rec = avrcp_ct_record();
+ if (!rec) {
+ error("Failed to allocate AVRCP CT record");
+ goto fail;
+ }
+
+ if (bt_adapter_add_record(rec, 0) < 0) {
+ error("Failed to register AVRCP CT record");
+ sdp_record_free(rec);
+ goto fail;
+ }
+ record_ct_id = rec->handle;
+ }
+
+ hal_ipc_ctrl = ipc;
+
+ ipc_register(hal_ipc_ctrl, HAL_SERVICE_ID_AVRCP_CTRL, ctrl_cmd_handlers,
+ G_N_ELEMENTS(ctrl_cmd_handlers));
+
+ return true;
+
+fail:
+ return false;
+}
+
+void bt_avrcp_ctrl_unregister(void)
+{
+ DBG("");
+
+ ipc_unregister(hal_ipc_ctrl, HAL_SERVICE_ID_AVRCP_CTRL);
+ hal_ipc_ctrl = NULL;
+
+ /* Remove only when AVRCP Target already unregistered */
+ if (!hal_ipc) {
+ bt_adapter_remove_record(record_ct_id);
+ record_ct_id = 0;
+ }
+}
diff --git a/android/avrcp.h b/android/avrcp.h
index 11e79b7..0af9f14 100644
--- a/android/avrcp.h
+++ b/android/avrcp.h
@@ -24,5 +24,9 @@
bool bt_avrcp_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode);
void bt_avrcp_unregister(void);
+bool bt_avrcp_ctrl_register(struct ipc *ipc, const bdaddr_t *addr,
+ uint8_t mode);
+void bt_avrcp_ctrl_unregister(void);
+
void bt_avrcp_connect(const bdaddr_t *dst);
void bt_avrcp_disconnect(const bdaddr_t *dst);
diff --git a/android/main.c b/android/main.c
index 58dd9ab..21becf6 100644
--- a/android/main.c
+++ b/android/main.c
@@ -208,6 +208,14 @@ static void service_register(const void *buf, uint16_t len)
}
break;
+ case HAL_SERVICE_ID_AVRCP_CTRL:
+ if (!bt_avrcp_ctrl_register(hal_ipc, &adapter_bdaddr,
+ m->mode)) {
+ status = HAL_STATUS_FAILED;
+ goto failed;
+ }
+
+ break;
case HAL_SERVICE_ID_HANDSFREE:
if (!bt_handsfree_register(hal_ipc, &adapter_bdaddr, m->mode,
m->max_clients)) {
@@ -286,6 +294,9 @@ static bool unregister_service(uint8_t id)
case HAL_SERVICE_ID_AVRCP:
bt_avrcp_unregister();
break;
+ case HAL_SERVICE_ID_AVRCP_CTRL:
+ bt_avrcp_ctrl_unregister();
+ break;
case HAL_SERVICE_ID_HANDSFREE:
bt_handsfree_unregister();
break;
--
2.1.0
next reply other threads:[~2014-11-11 12:07 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-11 12:07 Ravi kumar Veeramally [this message]
2014-11-11 13:13 ` [PATCH_v3] android/avrcp: Add initial support for new AVRCP CTRL interface Luiz Augusto von Dentz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1415707626-13531-1-git-send-email-ravikumar.veeramally@linux.intel.com \
--to=ravikumar.veeramally@linux.intel.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox