avrcp.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161
  1. // SPDX-License-Identifier: LGPL-2.1-or-later
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2013-2014 Intel Corporation. All rights reserved.
  7. *
  8. *
  9. */
  10. #ifdef HAVE_CONFIG_H
  11. #include <config.h>
  12. #endif
  13. #include <stdlib.h>
  14. #include <stdbool.h>
  15. #include <errno.h>
  16. #include <glib.h>
  17. #include "btio/btio.h"
  18. #include "lib/bluetooth.h"
  19. #include "lib/sdp.h"
  20. #include "lib/sdp_lib.h"
  21. #include "src/sdp-client.h"
  22. #include "src/shared/util.h"
  23. #include "src/log.h"
  24. #include "avctp.h"
  25. #include "avrcp-lib.h"
  26. #include "hal-msg.h"
  27. #include "ipc-common.h"
  28. #include "ipc.h"
  29. #include "bluetooth.h"
  30. #include "avrcp.h"
  31. #include "utils.h"
  32. #define L2CAP_PSM_AVCTP 0x17
  33. static bdaddr_t adapter_addr;
  34. static uint32_t record_tg_id = 0;
  35. static uint32_t record_ct_id = 0;
  36. static GSList *devices = NULL;
  37. static GIOChannel *server = NULL;
  38. static struct ipc *hal_ipc = NULL;
  39. struct avrcp_request {
  40. struct avrcp_device *dev;
  41. uint8_t pdu_id;
  42. uint8_t event_id;
  43. uint8_t transaction;
  44. };
  45. struct avrcp_device {
  46. bdaddr_t dst;
  47. uint16_t version;
  48. uint16_t features;
  49. struct avrcp *session;
  50. GIOChannel *io;
  51. GQueue *queue;
  52. };
  53. static struct avrcp_request *pop_request(uint8_t pdu_id, uint8_t event_id,
  54. bool peek)
  55. {
  56. GSList *l;
  57. for (l = devices; l; l = g_slist_next(l)) {
  58. struct avrcp_device *dev = l->data;
  59. GList *reqs = g_queue_peek_head_link(dev->queue);
  60. int i;
  61. for (i = 0; reqs; reqs = g_list_next(reqs), i++) {
  62. struct avrcp_request *req = reqs->data;
  63. if (req->pdu_id != pdu_id || req->event_id != event_id)
  64. continue;
  65. if (!peek)
  66. g_queue_pop_nth(dev->queue, i);
  67. return req;
  68. }
  69. }
  70. return NULL;
  71. }
  72. static void handle_get_play_status(const void *buf, uint16_t len)
  73. {
  74. const struct hal_cmd_avrcp_get_play_status *cmd = buf;
  75. uint8_t status;
  76. struct avrcp_request *req;
  77. int ret;
  78. DBG("");
  79. req = pop_request(AVRCP_GET_PLAY_STATUS, 0, false);
  80. if (!req) {
  81. status = HAL_STATUS_FAILED;
  82. goto done;
  83. }
  84. ret = avrcp_get_play_status_rsp(req->dev->session, req->transaction,
  85. cmd->position, cmd->duration,
  86. cmd->status);
  87. if (ret < 0) {
  88. status = HAL_STATUS_FAILED;
  89. g_free(req);
  90. goto done;
  91. }
  92. status = HAL_STATUS_SUCCESS;
  93. g_free(req);
  94. done:
  95. ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_AVRCP,
  96. HAL_OP_AVRCP_GET_PLAY_STATUS, status);
  97. }
  98. static void handle_list_player_attrs(const void *buf, uint16_t len)
  99. {
  100. DBG("");
  101. ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_AVRCP,
  102. HAL_OP_AVRCP_LIST_PLAYER_ATTRS, HAL_STATUS_FAILED);
  103. }
  104. static void handle_list_player_values(const void *buf, uint16_t len)
  105. {
  106. DBG("");
  107. ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_AVRCP,
  108. HAL_OP_AVRCP_LIST_PLAYER_VALUES, HAL_STATUS_FAILED);
  109. }
  110. static void handle_get_player_attrs(const void *buf, uint16_t len)
  111. {
  112. DBG("");
  113. ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_AVRCP,
  114. HAL_OP_AVRCP_GET_PLAYER_ATTRS, HAL_STATUS_FAILED);
  115. }
  116. static void handle_get_player_attrs_text(const void *buf, uint16_t len)
  117. {
  118. DBG("");
  119. ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_AVRCP,
  120. HAL_OP_AVRCP_GET_PLAYER_ATTRS_TEXT, HAL_STATUS_FAILED);
  121. }
  122. static void handle_get_player_values_text(const void *buf, uint16_t len)
  123. {
  124. DBG("");
  125. ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_AVRCP,
  126. HAL_OP_AVRCP_GET_PLAYER_VALUES_TEXT, HAL_STATUS_FAILED);
  127. }
  128. static size_t write_element_text(uint8_t id, uint8_t text_len, uint8_t *text,
  129. uint8_t *pdu)
  130. {
  131. uint16_t charset = 106;
  132. size_t len = 0;
  133. put_be32(id, pdu);
  134. pdu += 4;
  135. len += 4;
  136. put_be16(charset, pdu);
  137. pdu += 2;
  138. len += 2;
  139. put_be16(text_len, pdu);
  140. pdu += 2;
  141. len += 2;
  142. memcpy(pdu, text, text_len);
  143. len += text_len;
  144. return len;
  145. }
  146. static void write_element_attrs(uint8_t *ptr, uint8_t number, uint8_t *pdu,
  147. size_t *len)
  148. {
  149. int i;
  150. *pdu = number;
  151. pdu++;
  152. *len += 1;
  153. for (i = 0; i < number; i++) {
  154. struct hal_avrcp_player_setting_text *text = (void *) ptr;
  155. size_t ret;
  156. ret = write_element_text(text->id, text->len, text->text, pdu);
  157. ptr += sizeof(*text) + text->len;
  158. pdu += ret;
  159. *len += ret;
  160. }
  161. }
  162. static void handle_get_element_attrs_text(const void *buf, uint16_t len)
  163. {
  164. struct hal_cmd_avrcp_get_element_attrs_text *cmd = (void *) buf;
  165. uint8_t status;
  166. struct avrcp_request *req;
  167. uint8_t pdu[IPC_MTU];
  168. uint8_t *ptr;
  169. size_t pdu_len;
  170. int ret;
  171. DBG("");
  172. req = pop_request(AVRCP_GET_ELEMENT_ATTRIBUTES, 0, false);
  173. if (!req) {
  174. status = HAL_STATUS_FAILED;
  175. goto done;
  176. }
  177. ptr = (uint8_t *) &cmd->values[0];
  178. pdu_len = 0;
  179. write_element_attrs(ptr, cmd->number, pdu, &pdu_len);
  180. ret = avrcp_get_element_attrs_rsp(req->dev->session, req->transaction,
  181. pdu, pdu_len);
  182. if (ret < 0) {
  183. status = HAL_STATUS_FAILED;
  184. g_free(req);
  185. goto done;
  186. }
  187. status = HAL_STATUS_SUCCESS;
  188. g_free(req);
  189. done:
  190. ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_AVRCP,
  191. HAL_OP_AVRCP_GET_ELEMENT_ATTRS_TEXT, status);
  192. }
  193. static void handle_set_player_attrs_value(const void *buf, uint16_t len)
  194. {
  195. DBG("");
  196. ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_AVRCP,
  197. HAL_OP_AVRCP_SET_PLAYER_ATTRS_VALUE, HAL_STATUS_FAILED);
  198. }
  199. static void handle_register_notification(const void *buf, uint16_t len)
  200. {
  201. struct hal_cmd_avrcp_register_notification *cmd = (void *) buf;
  202. uint8_t status;
  203. struct avrcp_request *req;
  204. uint8_t code;
  205. bool peek = false;
  206. int ret;
  207. DBG("");
  208. switch (cmd->type) {
  209. case HAL_AVRCP_EVENT_TYPE_INTERIM:
  210. code = AVC_CTYPE_INTERIM;
  211. peek = true;
  212. break;
  213. case HAL_AVRCP_EVENT_TYPE_CHANGED:
  214. code = AVC_CTYPE_CHANGED;
  215. break;
  216. default:
  217. status = HAL_STATUS_FAILED;
  218. goto done;
  219. }
  220. req = pop_request(AVRCP_REGISTER_NOTIFICATION, cmd->event, peek);
  221. if (!req) {
  222. status = HAL_STATUS_FAILED;
  223. goto done;
  224. }
  225. ret = avrcp_register_notification_rsp(req->dev->session,
  226. req->transaction, code,
  227. cmd->event, cmd->data,
  228. cmd->len);
  229. if (ret < 0) {
  230. status = HAL_STATUS_FAILED;
  231. if (!peek)
  232. g_free(req);
  233. goto done;
  234. }
  235. status = HAL_STATUS_SUCCESS;
  236. if (!peek)
  237. g_free(req);
  238. done:
  239. ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_AVRCP,
  240. HAL_OP_AVRCP_REGISTER_NOTIFICATION, status);
  241. }
  242. static void handle_set_volume(const void *buf, uint16_t len)
  243. {
  244. struct hal_cmd_avrcp_set_volume *cmd = (void *) buf;
  245. struct avrcp_device *dev;
  246. uint8_t status;
  247. int ret;
  248. DBG("");
  249. if (!devices) {
  250. error("AVRCP: No device found to set volume");
  251. status = HAL_STATUS_FAILED;
  252. goto done;
  253. }
  254. /*
  255. * Peek the first device since the HAL cannot really address a specific
  256. * device it might mean there could only be one connected.
  257. */
  258. dev = devices->data;
  259. ret = avrcp_set_volume(dev->session, cmd->value & 0x7f);
  260. if (ret < 0) {
  261. status = HAL_STATUS_FAILED;
  262. goto done;
  263. }
  264. status = HAL_STATUS_SUCCESS;
  265. done:
  266. ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_AVRCP, HAL_OP_AVRCP_SET_VOLUME,
  267. status);
  268. }
  269. static const struct ipc_handler cmd_handlers[] = {
  270. /* HAL_OP_AVRCP_GET_PLAY_STATUS */
  271. { handle_get_play_status, false,
  272. sizeof(struct hal_cmd_avrcp_get_play_status) },
  273. /* HAL_OP_AVRCP_LIST_PLAYER_ATTRS */
  274. { handle_list_player_attrs, true,
  275. sizeof(struct hal_cmd_avrcp_list_player_attrs) },
  276. /* HAL_OP_AVRCP_LIST_PLAYER_VALUES */
  277. { handle_list_player_values, true,
  278. sizeof(struct hal_cmd_avrcp_list_player_values) },
  279. /* HAL_OP_AVRCP_GET_PLAYER_ATTRS */
  280. { handle_get_player_attrs, true,
  281. sizeof(struct hal_cmd_avrcp_get_player_attrs) },
  282. /* HAL_OP_AVRCP_GET_PLAYER_ATTRS_TEXT */
  283. { handle_get_player_attrs_text, true,
  284. sizeof(struct hal_cmd_avrcp_get_player_attrs_text) },
  285. /* HAL_OP_AVRCP_GET_PLAYER_VALUES_TEXT */
  286. { handle_get_player_values_text, true,
  287. sizeof(struct hal_cmd_avrcp_get_player_values_text) },
  288. /* HAL_OP_AVRCP_GET_ELEMENT_ATTRS_TEXT */
  289. { handle_get_element_attrs_text, true,
  290. sizeof(struct hal_cmd_avrcp_get_element_attrs_text) },
  291. /* HAL_OP_AVRCP_SET_PLAYER_ATTRS_VALUE */
  292. { handle_set_player_attrs_value, true,
  293. sizeof(struct hal_cmd_avrcp_set_player_attrs_value) },
  294. /* HAL_OP_AVRCP_REGISTER_NOTIFICATION */
  295. { handle_register_notification, true,
  296. sizeof(struct hal_cmd_avrcp_register_notification) },
  297. /* HAL_OP_AVRCP_SET_VOLUME */
  298. { handle_set_volume, false, sizeof(struct hal_cmd_avrcp_set_volume) },
  299. };
  300. static sdp_record_t *avrcp_tg_record(void)
  301. {
  302. sdp_list_t *svclass_id, *pfseq, *apseq, *root;
  303. uuid_t root_uuid, l2cap, avctp, avrtg;
  304. sdp_profile_desc_t profile[1];
  305. sdp_list_t *aproto_control, *proto_control[2];
  306. sdp_record_t *record;
  307. sdp_data_t *psm, *version, *features;
  308. uint16_t lp = L2CAP_PSM_AVCTP;
  309. uint16_t avrcp_ver = 0x0105, avctp_ver = 0x0104;
  310. uint16_t feat = (AVRCP_FEATURE_CATEGORY_1 |
  311. AVRCP_FEATURE_CATEGORY_2 |
  312. AVRCP_FEATURE_CATEGORY_3 |
  313. AVRCP_FEATURE_CATEGORY_4);
  314. record = sdp_record_alloc();
  315. if (!record)
  316. return NULL;
  317. sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
  318. root = sdp_list_append(NULL, &root_uuid);
  319. sdp_set_browse_groups(record, root);
  320. /* Service Class ID List */
  321. sdp_uuid16_create(&avrtg, AV_REMOTE_TARGET_SVCLASS_ID);
  322. svclass_id = sdp_list_append(NULL, &avrtg);
  323. sdp_set_service_classes(record, svclass_id);
  324. /* Protocol Descriptor List */
  325. sdp_uuid16_create(&l2cap, L2CAP_UUID);
  326. proto_control[0] = sdp_list_append(NULL, &l2cap);
  327. psm = sdp_data_alloc(SDP_UINT16, &lp);
  328. proto_control[0] = sdp_list_append(proto_control[0], psm);
  329. apseq = sdp_list_append(NULL, proto_control[0]);
  330. sdp_uuid16_create(&avctp, AVCTP_UUID);
  331. proto_control[1] = sdp_list_append(NULL, &avctp);
  332. version = sdp_data_alloc(SDP_UINT16, &avctp_ver);
  333. proto_control[1] = sdp_list_append(proto_control[1], version);
  334. apseq = sdp_list_append(apseq, proto_control[1]);
  335. aproto_control = sdp_list_append(NULL, apseq);
  336. sdp_set_access_protos(record, aproto_control);
  337. /* Bluetooth Profile Descriptor List */
  338. sdp_uuid16_create(&profile[0].uuid, AV_REMOTE_PROFILE_ID);
  339. profile[0].version = avrcp_ver;
  340. pfseq = sdp_list_append(NULL, &profile[0]);
  341. sdp_set_profile_descs(record, pfseq);
  342. features = sdp_data_alloc(SDP_UINT16, &feat);
  343. sdp_attr_add(record, SDP_ATTR_SUPPORTED_FEATURES, features);
  344. sdp_set_info_attr(record, "AVRCP TG", NULL, NULL);
  345. sdp_data_free(psm);
  346. sdp_data_free(version);
  347. sdp_list_free(proto_control[0], NULL);
  348. sdp_list_free(proto_control[1], NULL);
  349. sdp_list_free(apseq, NULL);
  350. sdp_list_free(aproto_control, NULL);
  351. sdp_list_free(pfseq, NULL);
  352. sdp_list_free(root, NULL);
  353. sdp_list_free(svclass_id, NULL);
  354. return record;
  355. }
  356. static sdp_record_t *avrcp_ct_record(void)
  357. {
  358. sdp_list_t *svclass_id, *pfseq, *apseq, *root;
  359. uuid_t root_uuid, l2cap, avctp, avrct, avrctr;
  360. sdp_profile_desc_t profile[1];
  361. sdp_list_t *aproto, *proto[2];
  362. sdp_record_t *record;
  363. sdp_data_t *psm, *version, *features;
  364. uint16_t lp = AVCTP_CONTROL_PSM;
  365. uint16_t avrcp_ver = 0x0105, avctp_ver = 0x0104;
  366. uint16_t feat = ( AVRCP_FEATURE_CATEGORY_1 |
  367. AVRCP_FEATURE_CATEGORY_2 |
  368. AVRCP_FEATURE_CATEGORY_3 |
  369. AVRCP_FEATURE_CATEGORY_4);
  370. record = sdp_record_alloc();
  371. if (!record)
  372. return NULL;
  373. sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
  374. root = sdp_list_append(NULL, &root_uuid);
  375. sdp_set_browse_groups(record, root);
  376. /* Service Class ID List */
  377. sdp_uuid16_create(&avrct, AV_REMOTE_SVCLASS_ID);
  378. svclass_id = sdp_list_append(NULL, &avrct);
  379. sdp_uuid16_create(&avrctr, AV_REMOTE_CONTROLLER_SVCLASS_ID);
  380. svclass_id = sdp_list_append(svclass_id, &avrctr);
  381. sdp_set_service_classes(record, svclass_id);
  382. /* Protocol Descriptor List */
  383. sdp_uuid16_create(&l2cap, L2CAP_UUID);
  384. proto[0] = sdp_list_append(NULL, &l2cap);
  385. psm = sdp_data_alloc(SDP_UINT16, &lp);
  386. proto[0] = sdp_list_append(proto[0], psm);
  387. apseq = sdp_list_append(NULL, proto[0]);
  388. sdp_uuid16_create(&avctp, AVCTP_UUID);
  389. proto[1] = sdp_list_append(NULL, &avctp);
  390. version = sdp_data_alloc(SDP_UINT16, &avctp_ver);
  391. proto[1] = sdp_list_append(proto[1], version);
  392. apseq = sdp_list_append(apseq, proto[1]);
  393. aproto = sdp_list_append(NULL, apseq);
  394. sdp_set_access_protos(record, aproto);
  395. /* Bluetooth Profile Descriptor List */
  396. sdp_uuid16_create(&profile[0].uuid, AV_REMOTE_PROFILE_ID);
  397. profile[0].version = avrcp_ver;
  398. pfseq = sdp_list_append(NULL, &profile[0]);
  399. sdp_set_profile_descs(record, pfseq);
  400. features = sdp_data_alloc(SDP_UINT16, &feat);
  401. sdp_attr_add(record, SDP_ATTR_SUPPORTED_FEATURES, features);
  402. sdp_set_info_attr(record, "AVRCP CT", NULL, NULL);
  403. free(psm);
  404. free(version);
  405. sdp_list_free(proto[0], NULL);
  406. sdp_list_free(proto[1], NULL);
  407. sdp_list_free(apseq, NULL);
  408. sdp_list_free(pfseq, NULL);
  409. sdp_list_free(aproto, NULL);
  410. sdp_list_free(root, NULL);
  411. sdp_list_free(svclass_id, NULL);
  412. return record;
  413. }
  414. static void queue_free(void *data, void *user_data)
  415. {
  416. g_free(data);
  417. }
  418. static void avrcp_device_free(void *data)
  419. {
  420. struct avrcp_device *dev = data;
  421. if (dev->queue) {
  422. g_queue_foreach(dev->queue, queue_free, NULL);
  423. g_queue_free(dev->queue);
  424. }
  425. if (dev->session)
  426. avrcp_shutdown(dev->session);
  427. if (dev->io) {
  428. g_io_channel_shutdown(dev->io, FALSE, NULL);
  429. g_io_channel_unref(dev->io);
  430. }
  431. g_free(dev);
  432. }
  433. static void avrcp_device_remove(struct avrcp_device *dev)
  434. {
  435. devices = g_slist_remove(devices, dev);
  436. avrcp_device_free(dev);
  437. }
  438. static struct avrcp_device *avrcp_device_new(const bdaddr_t *dst)
  439. {
  440. struct avrcp_device *dev;
  441. dev = g_new0(struct avrcp_device, 1);
  442. bacpy(&dev->dst, dst);
  443. devices = g_slist_prepend(devices, dev);
  444. return dev;
  445. }
  446. static int device_cmp(gconstpointer s, gconstpointer user_data)
  447. {
  448. const struct avrcp_device *dev = s;
  449. const bdaddr_t *dst = user_data;
  450. return bacmp(&dev->dst, dst);
  451. }
  452. static struct avrcp_device *avrcp_device_find(const bdaddr_t *dst)
  453. {
  454. GSList *l;
  455. l = g_slist_find_custom(devices, dst, device_cmp);
  456. if (!l)
  457. return NULL;
  458. return l->data;
  459. }
  460. static void disconnect_cb(void *data)
  461. {
  462. struct avrcp_device *dev = data;
  463. DBG("");
  464. dev->session = NULL;
  465. avrcp_device_remove(dev);
  466. }
  467. static bool handle_fast_forward(struct avrcp *session, bool pressed,
  468. void *user_data)
  469. {
  470. struct hal_ev_avrcp_passthrough_cmd ev;
  471. DBG("pressed %s", pressed ? "true" : "false");
  472. ev.id = AVC_FAST_FORWARD;
  473. ev.state = pressed;
  474. ipc_send_notif(hal_ipc, HAL_SERVICE_ID_AVRCP,
  475. HAL_EV_AVRCP_PASSTHROUGH_CMD, sizeof(ev), &ev);
  476. return true;
  477. }
  478. static bool handle_rewind(struct avrcp *session, bool pressed,
  479. void *user_data)
  480. {
  481. struct hal_ev_avrcp_passthrough_cmd ev;
  482. DBG("pressed %s", pressed ? "true" : "false");
  483. ev.id = AVC_REWIND;
  484. ev.state = pressed;
  485. ipc_send_notif(hal_ipc, HAL_SERVICE_ID_AVRCP,
  486. HAL_EV_AVRCP_PASSTHROUGH_CMD, sizeof(ev), &ev);
  487. return true;
  488. }
  489. static const struct avrcp_passthrough_handler passthrough_handlers[] = {
  490. { AVC_FAST_FORWARD, handle_fast_forward },
  491. { AVC_REWIND, handle_rewind },
  492. { },
  493. };
  494. static int handle_get_capabilities_cmd(struct avrcp *session,
  495. uint8_t transaction, void *user_data)
  496. {
  497. uint8_t events[] = { AVRCP_EVENT_STATUS_CHANGED,
  498. AVRCP_EVENT_TRACK_CHANGED,
  499. AVRCP_EVENT_PLAYBACK_POS_CHANGED };
  500. DBG("");
  501. /*
  502. * Android do not provide this info via HAL so the list most
  503. * be hardcoded according to what RegisterNotification can
  504. * actually handle
  505. */
  506. avrcp_get_capabilities_rsp(session, transaction, sizeof(events),
  507. events);
  508. return 0;
  509. }
  510. static void push_request(struct avrcp_device *dev, uint8_t pdu_id,
  511. uint8_t event_id, uint8_t transaction)
  512. {
  513. struct avrcp_request *req;
  514. req = g_new0(struct avrcp_request, 1);
  515. req->dev = dev;
  516. req->pdu_id = pdu_id;
  517. req->event_id = event_id;
  518. req->transaction = transaction;
  519. g_queue_push_tail(dev->queue, req);
  520. }
  521. static int handle_get_play_status_cmd(struct avrcp *session,
  522. uint8_t transaction, void *user_data)
  523. {
  524. struct avrcp_device *dev = user_data;
  525. DBG("");
  526. ipc_send_notif(hal_ipc, HAL_SERVICE_ID_AVRCP,
  527. HAL_EV_AVRCP_GET_PLAY_STATUS, 0, NULL);
  528. push_request(dev, AVRCP_GET_PLAY_STATUS, 0, transaction);
  529. return 0;
  530. }
  531. static int handle_get_element_attrs_cmd(struct avrcp *session,
  532. uint8_t transaction, uint64_t uid,
  533. uint8_t number, uint32_t *attrs,
  534. void *user_data)
  535. {
  536. struct avrcp_device *dev = user_data;
  537. uint8_t buf[IPC_MTU];
  538. struct hal_ev_avrcp_get_element_attrs *ev = (void *) buf;
  539. int i;
  540. DBG("");
  541. ev->number = number;
  542. /* Set everything in case of empty list */
  543. if (ev->number == 0) {
  544. for (i = 0; i < HAL_AVRCP_MEDIA_ATTR_DURATION; i++) {
  545. /* Skip 0x00 as the attributes start with 0x01 */
  546. ev->attrs[i] = i + 1;
  547. }
  548. ev->number = i;
  549. goto done;
  550. }
  551. for (i = 0; i < number; i++)
  552. ev->attrs[i] = attrs[i];
  553. done:
  554. ipc_send_notif(hal_ipc, HAL_SERVICE_ID_AVRCP,
  555. HAL_EV_AVRCP_GET_ELEMENT_ATTRS,
  556. sizeof(*ev) + ev->number, ev);
  557. push_request(dev, AVRCP_GET_ELEMENT_ATTRIBUTES, 0, transaction);
  558. return 0;
  559. }
  560. static int handle_register_notification_cmd(struct avrcp *session,
  561. uint8_t transaction,
  562. uint8_t event,
  563. uint32_t interval,
  564. void *user_data)
  565. {
  566. struct avrcp_device *dev = user_data;
  567. struct hal_ev_avrcp_register_notification ev;
  568. DBG("");
  569. /* TODO: Add any missing events supported by Android */
  570. switch (event) {
  571. case AVRCP_EVENT_STATUS_CHANGED:
  572. case AVRCP_EVENT_TRACK_CHANGED:
  573. case AVRCP_EVENT_PLAYBACK_POS_CHANGED:
  574. break;
  575. default:
  576. return -EINVAL;
  577. }
  578. ev.event = event;
  579. ev.param = interval;
  580. ipc_send_notif(hal_ipc, HAL_SERVICE_ID_AVRCP,
  581. HAL_EV_AVRCP_REGISTER_NOTIFICATION,
  582. sizeof(ev), &ev);
  583. push_request(dev, AVRCP_REGISTER_NOTIFICATION, event, transaction);
  584. return 0;
  585. }
  586. static const struct avrcp_control_ind control_ind = {
  587. .get_capabilities = handle_get_capabilities_cmd,
  588. .get_play_status = handle_get_play_status_cmd,
  589. .get_element_attributes = handle_get_element_attrs_cmd,
  590. .register_notification = handle_register_notification_cmd,
  591. };
  592. static bool handle_register_notification_rsp(struct avrcp *session, int err,
  593. uint8_t code, uint8_t event,
  594. void *params,
  595. void *user_data)
  596. {
  597. struct avrcp_device *dev = user_data;
  598. struct hal_ev_avrcp_volume_changed ev;
  599. uint8_t *volume = params;
  600. if (err < 0) {
  601. error("AVRCP: %s", strerror(-err));
  602. return false;
  603. }
  604. if (code != AVC_CTYPE_INTERIM && code != AVC_CTYPE_CHANGED)
  605. return false;
  606. if (event != AVRCP_EVENT_VOLUME_CHANGED)
  607. return false;
  608. ev.type = code;
  609. ev.volume = volume[0];
  610. ipc_send_notif(hal_ipc, HAL_SERVICE_ID_AVRCP,
  611. HAL_EV_AVRCP_VOLUME_CHANGED,
  612. sizeof(ev), &ev);
  613. if (code == AVC_CTYPE_INTERIM)
  614. return true;
  615. avrcp_register_notification(dev->session, event, 0);
  616. return false;
  617. }
  618. static void handle_get_capabilities_rsp(struct avrcp *session, int err,
  619. uint8_t number, uint8_t *events,
  620. void *user_data)
  621. {
  622. struct avrcp_device *dev = user_data;
  623. int i;
  624. if (err < 0) {
  625. error("AVRCP: %s", strerror(-err));
  626. return;
  627. }
  628. for (i = 0; i < number; i++) {
  629. if (events[i] != AVRCP_EVENT_VOLUME_CHANGED)
  630. continue;
  631. avrcp_register_notification(dev->session, events[i], 0);
  632. break;
  633. }
  634. return;
  635. }
  636. static void handle_set_volume_rsp(struct avrcp *session, int err,
  637. uint8_t value, void *user_data)
  638. {
  639. struct hal_ev_avrcp_volume_changed ev;
  640. if (err < 0) {
  641. ev.volume = 0;
  642. ev.type = AVC_CTYPE_REJECTED;
  643. goto done;
  644. }
  645. ev.volume = value;
  646. ev.type = AVC_CTYPE_ACCEPTED;
  647. done:
  648. ipc_send_notif(hal_ipc, HAL_SERVICE_ID_AVRCP,
  649. HAL_EV_AVRCP_VOLUME_CHANGED,
  650. sizeof(ev), &ev);
  651. }
  652. static const struct avrcp_control_cfm control_cfm = {
  653. .get_capabilities = handle_get_capabilities_rsp,
  654. .register_notification = handle_register_notification_rsp,
  655. .set_volume = handle_set_volume_rsp,
  656. };
  657. static int avrcp_device_add_session(struct avrcp_device *dev, int fd,
  658. uint16_t imtu, uint16_t omtu)
  659. {
  660. struct hal_ev_avrcp_remote_features ev;
  661. char address[18];
  662. dev->session = avrcp_new(fd, imtu, omtu, dev->version);
  663. if (!dev->session)
  664. return -EINVAL;
  665. avrcp_set_destroy_cb(dev->session, disconnect_cb, dev);
  666. avrcp_set_passthrough_handlers(dev->session, passthrough_handlers,
  667. dev);
  668. avrcp_register_player(dev->session, &control_ind, &control_cfm, dev);
  669. dev->queue = g_queue_new();
  670. ba2str(&dev->dst, address);
  671. /* FIXME: get the real name of the device */
  672. avrcp_init_uinput(dev->session, "bluetooth", address);
  673. bdaddr2android(&dev->dst, ev.bdaddr);
  674. ev.features = HAL_AVRCP_FEATURE_NONE;
  675. DBG("version 0x%02x", dev->version);
  676. if (dev->version < 0x0103)
  677. goto done;
  678. ev.features |= HAL_AVRCP_FEATURE_METADATA;
  679. if (dev->version < 0x0104)
  680. goto done;
  681. ev.features |= HAL_AVRCP_FEATURE_ABSOLUTE_VOLUME;
  682. avrcp_get_capabilities(dev->session, CAP_EVENTS_SUPPORTED);
  683. done:
  684. ipc_send_notif(hal_ipc, HAL_SERVICE_ID_AVRCP,
  685. HAL_EV_AVRCP_REMOTE_FEATURES,
  686. sizeof(ev), &ev);
  687. return 0;
  688. }
  689. static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
  690. {
  691. struct avrcp_device *dev = user_data;
  692. uint16_t imtu, omtu;
  693. char address[18];
  694. GError *gerr = NULL;
  695. int fd;
  696. if (err) {
  697. error("%s", err->message);
  698. return;
  699. }
  700. bt_io_get(chan, &gerr,
  701. BT_IO_OPT_DEST, address,
  702. BT_IO_OPT_IMTU, &imtu,
  703. BT_IO_OPT_OMTU, &omtu,
  704. BT_IO_OPT_INVALID);
  705. if (gerr) {
  706. error("%s", gerr->message);
  707. g_error_free(gerr);
  708. g_io_channel_shutdown(chan, TRUE, NULL);
  709. return;
  710. }
  711. fd = g_io_channel_unix_get_fd(chan);
  712. if (avrcp_device_add_session(dev, fd, imtu, omtu) < 0) {
  713. avrcp_device_free(dev);
  714. return;
  715. }
  716. g_io_channel_set_close_on_unref(chan, FALSE);
  717. if (dev->io) {
  718. g_io_channel_unref(dev->io);
  719. dev->io = NULL;
  720. }
  721. DBG("%s connected", address);
  722. }
  723. static bool avrcp_device_connect(struct avrcp_device *dev, BtIOConnect cb)
  724. {
  725. GError *err = NULL;
  726. dev->io = bt_io_connect(cb, dev, NULL, &err,
  727. BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
  728. BT_IO_OPT_DEST_BDADDR, &dev->dst,
  729. BT_IO_OPT_PSM, L2CAP_PSM_AVCTP,
  730. BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
  731. BT_IO_OPT_INVALID);
  732. if (err) {
  733. error("%s", err->message);
  734. g_error_free(err);
  735. return false;
  736. }
  737. return true;
  738. }
  739. static void search_cb(sdp_list_t *recs, int err, gpointer data)
  740. {
  741. struct avrcp_device *dev = data;
  742. sdp_list_t *list;
  743. DBG("");
  744. if (!g_slist_find(devices, dev))
  745. return;
  746. if (err < 0) {
  747. error("Unable to get AV_REMOTE_SVCLASS_ID SDP record: %s",
  748. strerror(-err));
  749. goto fail;
  750. }
  751. if (!recs || !recs->data) {
  752. error("No AVRCP records found");
  753. goto fail;
  754. }
  755. for (list = recs; list; list = list->next) {
  756. sdp_record_t *rec = list->data;
  757. sdp_list_t *l;
  758. sdp_profile_desc_t *desc;
  759. int features;
  760. if (sdp_get_profile_descs(rec, &l) < 0)
  761. continue;
  762. desc = l->data;
  763. dev->version = desc->version;
  764. if (sdp_get_int_attr(rec, SDP_ATTR_SUPPORTED_FEATURES,
  765. &features) == 0)
  766. dev->features = features;
  767. sdp_list_free(l, free);
  768. break;
  769. }
  770. if (dev->io) {
  771. GError *gerr = NULL;
  772. if (!bt_io_accept(dev->io, connect_cb, dev, NULL, &gerr)) {
  773. error("bt_io_accept: %s", gerr->message);
  774. g_error_free(gerr);
  775. goto fail;
  776. }
  777. return;
  778. }
  779. if (!avrcp_device_connect(dev, connect_cb)) {
  780. error("Unable to connect to AVRCP");
  781. goto fail;
  782. }
  783. return;
  784. fail:
  785. avrcp_device_remove(dev);
  786. }
  787. static int avrcp_device_search(struct avrcp_device *dev)
  788. {
  789. uuid_t uuid;
  790. sdp_uuid16_create(&uuid, AV_REMOTE_SVCLASS_ID);
  791. return bt_search_service(&adapter_addr, &dev->dst, &uuid, search_cb,
  792. dev, NULL, 0);
  793. }
  794. static void confirm_cb(GIOChannel *chan, gpointer data)
  795. {
  796. struct avrcp_device *dev;
  797. char address[18];
  798. bdaddr_t dst;
  799. GError *err = NULL;
  800. bt_io_get(chan, &err,
  801. BT_IO_OPT_DEST_BDADDR, &dst,
  802. BT_IO_OPT_DEST, address,
  803. BT_IO_OPT_INVALID);
  804. if (err) {
  805. error("%s", err->message);
  806. g_error_free(err);
  807. g_io_channel_shutdown(chan, TRUE, NULL);
  808. return;
  809. }
  810. DBG("incoming connect from %s", address);
  811. dev = avrcp_device_find(&dst);
  812. if (dev && dev->session) {
  813. error("AVRCP: Refusing unexpected connect");
  814. g_io_channel_shutdown(chan, TRUE, NULL);
  815. return;
  816. }
  817. dev = avrcp_device_new(&dst);
  818. if (avrcp_device_search(dev) < 0) {
  819. error("AVRCP: Failed to search SDP details");
  820. avrcp_device_free(dev);
  821. g_io_channel_shutdown(chan, TRUE, NULL);
  822. }
  823. dev->io = g_io_channel_ref(chan);
  824. }
  825. bool bt_avrcp_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode)
  826. {
  827. GError *err = NULL;
  828. sdp_record_t *rec;
  829. DBG("");
  830. bacpy(&adapter_addr, addr);
  831. server = bt_io_listen(NULL, confirm_cb, NULL, NULL, &err,
  832. BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
  833. BT_IO_OPT_PSM, L2CAP_PSM_AVCTP,
  834. BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
  835. BT_IO_OPT_INVALID);
  836. if (!server) {
  837. error("Failed to listen on AVDTP channel: %s", err->message);
  838. g_error_free(err);
  839. return false;
  840. }
  841. rec = avrcp_tg_record();
  842. if (!rec) {
  843. error("Failed to allocate AVRCP TG record");
  844. goto fail;
  845. }
  846. if (bt_adapter_add_record(rec, 0) < 0) {
  847. error("Failed to register AVRCP TG record");
  848. sdp_record_free(rec);
  849. goto fail;
  850. }
  851. record_tg_id = rec->handle;
  852. rec = avrcp_ct_record();
  853. if (!rec) {
  854. error("Failed to allocate AVRCP CT record");
  855. bt_adapter_remove_record(record_tg_id);
  856. goto fail;
  857. }
  858. if (bt_adapter_add_record(rec, 0) < 0) {
  859. error("Failed to register AVRCP CT record");
  860. bt_adapter_remove_record(record_tg_id);
  861. sdp_record_free(rec);
  862. goto fail;
  863. }
  864. record_ct_id = rec->handle;
  865. hal_ipc = ipc;
  866. ipc_register(hal_ipc, HAL_SERVICE_ID_AVRCP, cmd_handlers,
  867. G_N_ELEMENTS(cmd_handlers));
  868. return true;
  869. fail:
  870. g_io_channel_shutdown(server, TRUE, NULL);
  871. g_io_channel_unref(server);
  872. server = NULL;
  873. return false;
  874. }
  875. void bt_avrcp_unregister(void)
  876. {
  877. DBG("");
  878. g_slist_free_full(devices, avrcp_device_free);
  879. devices = NULL;
  880. ipc_unregister(hal_ipc, HAL_SERVICE_ID_AVRCP);
  881. hal_ipc = NULL;
  882. bt_adapter_remove_record(record_tg_id);
  883. record_tg_id = 0;
  884. bt_adapter_remove_record(record_ct_id);
  885. record_ct_id = 0;
  886. if (server) {
  887. g_io_channel_shutdown(server, TRUE, NULL);
  888. g_io_channel_unref(server);
  889. server = NULL;
  890. }
  891. }
  892. void bt_avrcp_connect(const bdaddr_t *dst)
  893. {
  894. struct avrcp_device *dev;
  895. char addr[18];
  896. DBG("");
  897. if (avrcp_device_find(dst))
  898. return;
  899. dev = avrcp_device_new(dst);
  900. if (avrcp_device_search(dev) < 0) {
  901. error("AVRCP: Failed to search SDP details");
  902. avrcp_device_free(dev);
  903. }
  904. ba2str(&dev->dst, addr);
  905. DBG("connecting to %s", addr);
  906. }
  907. void bt_avrcp_disconnect(const bdaddr_t *dst)
  908. {
  909. struct avrcp_device *dev;
  910. DBG("");
  911. dev = avrcp_device_find(dst);
  912. if (!dev)
  913. return;
  914. if (dev->session) {
  915. avrcp_shutdown(dev->session);
  916. return;
  917. }
  918. avrcp_device_remove(dev);
  919. }