btsrv_a2dp.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790
  1. /*
  2. * Copyright (c) 2017 Actions Semi Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /**
  7. * @file
  8. * @brief btsrvice a2dp
  9. */
  10. #define SYS_LOG_DOMAIN "btsrv_a2dp"
  11. #include "btsrv_os_common.h"
  12. #include "btsrv_inner.h"
  13. struct btsrv_a2dp_codec_cb {
  14. struct bt_conn *conn;
  15. struct bt_a2dp_media_codec codec;
  16. uint8_t cp_type;
  17. };
  18. static btsrv_a2dp_hdl_callback a2dp_user_callback;
  19. static struct bt_a2dp_endpoint a2dp_sbc_endpoint[CONFIG_MAX_A2DP_ENDPOINT];
  20. static struct bt_a2dp_endpoint a2dp_aac_endpoint[CONFIG_MAX_A2DP_ENDPOINT];
  21. static uint8_t a2dp_register_aac_num;
  22. static struct bt_conn *trs_conn = NULL;
  23. #if 0
  24. static const uint8_t a2dp_sbc_codec[] = {
  25. BT_A2DP_AUDIO << 4,
  26. BT_A2DP_SBC,
  27. 0xFF, /* (SNK mandatory)44100, 48000, mono, dual channel, stereo, join stereo */
  28. /* (SNK optional) 16000, 32000 */
  29. 0xFF, /* (SNK mandatory) Block length: 4/8/12/16, subbands:4/8, Allocation Method: SNR, Londness */
  30. 0x02, /* min bitpool */
  31. 0x35 /* max bitpool */
  32. };
  33. static const uint8_t a2dp_aac_codec[] = {
  34. BT_A2DP_AUDIO << 4,
  35. BT_A2DP_MPEG2,
  36. 0xF0, /* MPEG2 AAC LC, MPEG4 AAC LC, MPEG AAC LTP, MPEG4 AAC Scalable */
  37. 0x01, /* Sampling Frequecy 44100 */
  38. 0x8F, /* Sampling Frequecy 48000, channels 1, channels 2 */
  39. 0xFF, /* VBR, bit rate */
  40. 0xFF, /* bit rate */
  41. 0xFF /* bit rate */
  42. };
  43. #endif
  44. #define A2DP_AAC_FREQ_NUM 12
  45. const static uint8_t a2dp_aac_freq_table[A2DP_AAC_FREQ_NUM] = {96, 88, 64, 48, 44, 32, 24, 22, 16, 12, 11, 8};
  46. static void btsrv_a2dp_hdl_cb_user(struct bt_conn *conn, btsrv_a2dp_event_e event, void *packet, int size)
  47. {
  48. if (a2dp_user_callback) {
  49. a2dp_user_callback(hostif_bt_conn_get_handle(conn), event, packet, size);
  50. }
  51. }
  52. static uint8_t btsrv_convert_sample_rate(struct bt_a2dp_media_codec *codec)
  53. {
  54. uint8_t sample_rate = 44, i;
  55. uint16_t freq;
  56. if (codec->head.codec_type == BT_A2DP_SBC) {
  57. switch (codec->sbc.freq) {
  58. case BT_A2DP_SBC_48000:
  59. sample_rate = 48;
  60. break;
  61. case BT_A2DP_SBC_44100:
  62. sample_rate = 44;
  63. break;
  64. case BT_A2DP_SBC_32000:
  65. sample_rate = 32;
  66. break;
  67. case BT_A2DP_SBC_16000:
  68. sample_rate = 16;
  69. break;
  70. }
  71. } else if (codec->head.codec_type == BT_A2DP_MPEG2) {
  72. freq = (codec->aac.freq0 << 4) | codec->aac.freq1;
  73. for (i = 0; i < A2DP_AAC_FREQ_NUM; i++) {
  74. if (freq & (BT_A2DP_AAC_96000 << i)) {
  75. sample_rate = a2dp_aac_freq_table[i];
  76. break;
  77. }
  78. }
  79. }
  80. return sample_rate;
  81. }
  82. static uint8_t btsrv_parse_bitpool(struct bt_a2dp_media_codec *codec)
  83. {
  84. if (codec->head.codec_type == BT_A2DP_SBC) {
  85. return codec->sbc.max_bitpool;
  86. } else {
  87. return 0;
  88. }
  89. }
  90. static void _btsrv_a2dp_connect_cb(struct bt_conn *conn)
  91. {
  92. btsrv_event_notify(MSG_BTSRV_CONNECT, MSG_BTSRV_A2DP_CONNECTED, conn);
  93. }
  94. static void _btsrv_a2dp_disconnected_cb(struct bt_conn *conn)
  95. {
  96. /* TODO: Disconnected process order: btsrv_tws->btsrv_a2dp->btsrv_connect */
  97. btsrv_event_notify(MSG_BTSRV_A2DP, MSG_BTSRV_A2DP_DISCONNECTED, conn);
  98. }
  99. #ifdef CONFIG_DEBUG_DATA_RATE
  100. #define TEST_RECORD_NUM 10
  101. static uint32_t pre_rx_time;
  102. static uint8_t test_index;
  103. static uint16_t test_rx_record[TEST_RECORD_NUM][2];
  104. static inline void _btsrv_a2dp_debug_date_rate(uint16_t len)
  105. {
  106. static int start_time_stamp;
  107. static int received_data;
  108. uint32_t curr_time;
  109. if (!start_time_stamp) {
  110. received_data = 0;
  111. start_time_stamp = k_cycle_get_32();
  112. }
  113. received_data += len;
  114. if ((k_cycle_get_32() - start_time_stamp) > 5 * sys_clock_hw_cycles_per_sec()) {
  115. if (start_time_stamp != 0) {
  116. SYS_LOG_INF("a2dp data rate: %d bytes/s\n", received_data / 5);
  117. }
  118. received_data = 0;
  119. start_time_stamp = k_cycle_get_32();
  120. }
  121. curr_time = os_uptime_get_32();
  122. test_rx_record[test_index][0] = curr_time - pre_rx_time;
  123. test_rx_record[test_index][1] = len;
  124. test_index++;
  125. if (test_index >= TEST_RECORD_NUM) {
  126. test_index = 0;
  127. }
  128. pre_rx_time = curr_time;
  129. }
  130. void debug_dump_media_rx_state(void)
  131. {
  132. static uint32_t pre_dump_time;
  133. uint32_t curr_time;
  134. uint16_t time_cnt = 0, len_cnt = 0;
  135. int flag, i;
  136. curr_time = os_uptime_get_32();
  137. if ((curr_time - pre_dump_time) < 500) {
  138. return;
  139. }
  140. pre_dump_time = curr_time;
  141. flag = btsrv_set_negative_prio();
  142. printk("diff_time data_len\n");
  143. for (i = test_index; i < TEST_RECORD_NUM; i++) {
  144. time_cnt += test_rx_record[i][0];
  145. len_cnt += test_rx_record[i][1];
  146. printk("%d(%d)\t %d(%d)\n", test_rx_record[i][0], time_cnt, test_rx_record[i][1], len_cnt);
  147. }
  148. for (i = 0; i < test_index; i++) {
  149. time_cnt += test_rx_record[i][0];
  150. len_cnt += test_rx_record[i][1];
  151. printk("%d(%d)\t %d(%d)\n", test_rx_record[i][0], time_cnt, test_rx_record[i][1], len_cnt);
  152. }
  153. printk("%d(%d)\n", curr_time - pre_rx_time, time_cnt + (curr_time - pre_rx_time));
  154. btsrv_revert_prio(flag);
  155. }
  156. #else
  157. void debug_dump_media_rx_state(void)
  158. {
  159. }
  160. #endif
  161. struct avdtp_data_header_t
  162. {
  163. uint16_t frame_cnt;
  164. uint16_t seq_no;
  165. uint16_t frame_len; //stream len
  166. uint16_t padding_len;
  167. } __packed;
  168. static uint8_t btsrv_a2dp_pack_date_header(struct bt_conn *conn, uint8_t *data, uint16_t media_len, uint8_t head_len, uint8_t format, uint8_t *padding_len)
  169. {
  170. struct avdtp_data_header_t header;
  171. uint8_t pack_header_size = sizeof(struct avdtp_data_header_t);
  172. uint8_t start_pos;
  173. /* data start from RTTP */
  174. if (format == BT_A2DP_SBC) {
  175. header.frame_cnt = (uint16_t)(data[head_len - 1]&0x0F);
  176. } else {
  177. header.frame_cnt = 1;
  178. }
  179. header.seq_no = data[3] | ((uint16_t)(data[2]) << 8);
  180. header.frame_len = media_len;
  181. header.padding_len = media_len % 2;
  182. *padding_len = header.padding_len;
  183. start_pos = head_len - pack_header_size;
  184. memcpy(&data[start_pos], (uint8_t*)&header, pack_header_size);
  185. #if 1
  186. static struct bt_conn *rec_seq_conn;
  187. static uint16_t rec_seq_no;
  188. static uint32_t rec_time;
  189. uint32_t curr_time;
  190. curr_time = os_uptime_get_32();
  191. if (rec_seq_conn != conn || ((curr_time - rec_time) > 300)) {
  192. rec_seq_conn = conn;
  193. rec_seq_no = header.seq_no;
  194. } else {
  195. rec_seq_no += 1;
  196. if (rec_seq_no != header.seq_no) {
  197. SYS_LOG_ERR("pkt miss %d %d\n", header.seq_no, (rec_seq_no - 1));
  198. }
  199. rec_seq_no = header.seq_no;
  200. }
  201. rec_time = curr_time;
  202. #endif
  203. return start_pos;
  204. }
  205. /** this callback dircty call to app, will in bt stack context */
  206. static void _btsrv_a2dp_media_handler_cb(struct bt_conn *conn, uint8_t *data, uint16_t len)
  207. {
  208. uint8_t head_len, format, sample_rate, cp_type, padding_len;
  209. if (btsrv_rdm_get_a2dp_pending_ahead_start(conn)) {
  210. btsrv_a2dp_media_state_change(conn, BT_A2DP_MEDIA_STATE_START);
  211. }
  212. #ifdef CONFIG_SUPPORT_TWS
  213. if (btsrv_tws_protocol_data_cb(conn, data, len)) {
  214. return;
  215. }
  216. #endif
  217. /* Must get info after btsrv_tws_protocol_data_cb,
  218. * tws slave update format in btsrv_tws_protocol_data_cb
  219. */
  220. btsrv_rdm_a2dp_get_codec_info(conn, &format, &sample_rate, &cp_type);
  221. switch (format) {
  222. case BT_A2DP_SBC:
  223. case BT_A2DP_MPEG2:
  224. if (!(btsrv_rdm_a2dp_get_actived() == conn ||
  225. btsrv_rdm_get_dev_role() == BTSRV_TWS_SLAVE)) {
  226. SYS_LOG_DBG("return for master role %d\n", btsrv_rdm_get_dev_role());
  227. break;
  228. }
  229. if (format == BT_A2DP_SBC) {
  230. head_len = AVDTP_SBC_HEADER_LEN;
  231. } else {
  232. head_len = AVDTP_AAC_HEADER_LEN;
  233. }
  234. if (cp_type == BT_AVDTP_AV_CP_TYPE_SCMS_T) {
  235. head_len++;
  236. }
  237. #ifdef CONFIG_DEBUG_DATA_RATE
  238. _btsrv_a2dp_debug_date_rate(len - head_len);
  239. #endif
  240. head_len = btsrv_a2dp_pack_date_header(conn, data, (len - head_len), head_len, format, &padding_len);
  241. btsrv_a2dp_hdl_cb_user(conn, BTSRV_A2DP_DATA_INDICATED, data + head_len, (len - head_len + padding_len));
  242. break;
  243. default:
  244. SYS_LOG_INF("A2dp not support type: 0x%x, 0x%x, %d\n", data[0], data[1], format);
  245. break;
  246. }
  247. }
  248. static int _btsrv_a2dp_media_state_req_cb(struct bt_conn *conn, uint8_t state)
  249. {
  250. btsrv_event_notify_ext(MSG_BTSRV_A2DP, MSG_BTSRV_A2DP_MEDIA_STATE_CB, conn, state);
  251. return 0;
  252. }
  253. static int btsrv_a2dp_media_state_req_proc(struct bt_conn *conn, uint8_t state)
  254. {
  255. int cmd = -1;
  256. uint8_t send_notify = 0;
  257. uint16_t delay_report;
  258. #ifdef CONFIG_BT_A2DP_TRS
  259. if(btsrv_trs_a2dp_media_state_req_cb(conn, state) == true) {
  260. SYS_LOG_INF("trs a2dp media state req %d", state);
  261. if (state == BT_A2DP_MEDIA_STATE_START) {
  262. btsrv_rdm_trs_a2dp_stream_open(conn, true);
  263. } else if (state == BT_A2DP_MEDIA_STATE_CLOSE ||
  264. state == BT_A2DP_MEDIA_STATE_SUSPEND) {
  265. btsrv_rdm_trs_a2dp_stream_open(conn, false);
  266. }
  267. return 0;
  268. }
  269. #endif
  270. SYS_LOG_INF("a2dp media state req %d", state);
  271. switch (state) {
  272. case BT_A2DP_MEDIA_STATE_OPEN:
  273. cmd = MSG_BTSRV_A2DP_MEDIA_STATE_OPEN;
  274. delay_report = 0;
  275. btsrv_a2dp_hdl_cb_user(conn, BTSRV_A2DP_GET_INIT_DELAY_REPORT, &delay_report, sizeof(delay_report));
  276. if (delay_report) {
  277. hostif_bt_a2dp_send_delay_report(conn, delay_report);
  278. }
  279. break;
  280. case BT_A2DP_MEDIA_STATE_START:
  281. cmd = MSG_BTSRV_A2DP_MEDIA_STATE_START;
  282. btsrv_rdm_a2dp_actived(conn, 1);
  283. btsrv_rdm_set_a2dp_pending_ahead_start(conn, 0);
  284. break;
  285. case BT_A2DP_MEDIA_STATE_CLOSE:
  286. cmd = MSG_BTSRV_A2DP_MEDIA_STATE_CLOSE;
  287. btsrv_rdm_a2dp_actived(conn, 0);
  288. btsrv_rdm_set_a2dp_pending_ahead_start(conn, 0);
  289. break;
  290. case BT_A2DP_MEDIA_STATE_SUSPEND:
  291. cmd = MSG_BTSRV_A2DP_MEDIA_STATE_SUSPEND;
  292. btsrv_rdm_a2dp_actived(conn, 0);
  293. btsrv_rdm_set_a2dp_pending_ahead_start(conn, 0);
  294. break;
  295. case BT_A2DP_MEDIA_STATE_PENDING_AHEAD_START:
  296. btsrv_rdm_set_a2dp_pending_ahead_start(conn, 1);
  297. break;
  298. }
  299. if (cmd > 0) {
  300. if (btsrv_rdm_a2dp_get_actived() == conn) {
  301. /* Phone state req */
  302. send_notify = 1;
  303. } else if (btsrv_rdm_a2dp_get_actived() &&
  304. (btsrv_rdm_get_dev_role() == BTSRV_TWS_MASTER)) {
  305. /* Tws source_restart state req,
  306. * only notify when have a2dp active device.
  307. */
  308. send_notify = 1;
  309. } else if (btsrv_rdm_get_dev_role() == BTSRV_TWS_SLAVE) {
  310. /* Tws mater send to slave state req */
  311. send_notify = 1;
  312. }
  313. if ((btsrv_rdm_a2dp_get_actived() == conn || btsrv_rdm_get_dev_role() == BTSRV_TWS_SLAVE) &&
  314. (cmd == MSG_BTSRV_A2DP_MEDIA_STATE_START)) {
  315. uint8_t format, sample_rate;
  316. uint8_t codec_info[3];
  317. btsrv_rdm_a2dp_get_codec_info(conn, &format, &sample_rate, NULL);
  318. codec_info[0] = format;
  319. codec_info[1] = sample_rate;
  320. codec_info[2] = btsrv_rdm_a2dp_get_bitpool(conn);
  321. btsrv_a2dp_hdl_cb_user(conn, BTSRV_A2DP_CODEC_INFO, codec_info, sizeof(codec_info));
  322. }
  323. if (send_notify) {
  324. btsrv_event_notify(MSG_BTSRV_A2DP, cmd, conn);
  325. }
  326. }
  327. return 0;
  328. }
  329. static void _btsrv_a2dp_seted_codec_cb(struct bt_conn *conn, struct bt_a2dp_media_codec *codec, uint8_t cp_type)
  330. {
  331. struct btsrv_a2dp_codec_cb param;
  332. memset(&param, 0, sizeof(param));
  333. param.conn = conn;
  334. memcpy(&param.codec, codec, sizeof(struct bt_a2dp_media_codec));
  335. param.cp_type = cp_type;
  336. btsrv_event_notify_malloc(MSG_BTSRV_A2DP, MSG_BTSRV_A2DP_SET_CODEC_CB, (uint8_t *)&param, sizeof(param), 0);
  337. }
  338. static void btsrv_a2dp_seted_codec_proc(void *in_parm)
  339. {
  340. struct btsrv_a2dp_codec_cb *param = in_parm;
  341. uint8_t codec_info[3];
  342. codec_info[0] = param->codec.head.codec_type;
  343. codec_info[1] = btsrv_convert_sample_rate(&param->codec);
  344. codec_info[2] = btsrv_parse_bitpool(&param->codec);
  345. SYS_LOG_INF("media %d, codec %d, freq %d, cp %d\n", param->codec.head.media_type, codec_info[0], codec_info[1], param->cp_type);
  346. btsrv_rdm_a2dp_set_codec_info(param->conn, codec_info[0], codec_info[1], param->cp_type);
  347. btsrv_rdm_a2dp_set_bitpool(param->conn, codec_info[2]);
  348. #ifdef CONFIG_BT_A2DP_TRS
  349. /* Wait TODO: Not ready support a2dp device and TRS concurrently */
  350. btsrv_a2dp_hdl_cb_user(param->conn, BTSRV_A2DP_CODEC_INFO, codec_info, sizeof(codec_info));
  351. btsrv_trs_a2dp_seted_codec_cb(param->conn, &param->codec);
  352. #endif
  353. }
  354. static const struct bt_a2dp_app_cb btsrv_a2dp_cb = {
  355. .connected = _btsrv_a2dp_connect_cb,
  356. .disconnected = _btsrv_a2dp_disconnected_cb,
  357. .media_handler = _btsrv_a2dp_media_handler_cb,
  358. .media_state_req = _btsrv_a2dp_media_state_req_cb,
  359. .seted_codec = _btsrv_a2dp_seted_codec_cb,
  360. };
  361. int btsrv_a2dp_media_state_change(struct bt_conn *conn, uint8_t state)
  362. {
  363. return _btsrv_a2dp_media_state_req_cb(conn, state);
  364. }
  365. static void _btsrv_a2dp_connected(struct bt_conn *conn)
  366. {
  367. char addr_str[BT_ADDR_STR_LEN];
  368. bd_address_t *addr = GET_CONN_BT_ADDR(conn);
  369. hostif_bt_addr_to_str((const bt_addr_t *)addr, addr_str, BT_ADDR_STR_LEN);
  370. SYS_LOG_INF("A2dp connected:%p addr %s\n", conn, addr_str);
  371. btsrv_a2dp_hdl_cb_user(conn, BTSRV_A2DP_CONNECTED, NULL, 0);
  372. }
  373. static void _btsrv_a2dp_disconnected(struct bt_conn *conn)
  374. {
  375. char addr_str[BT_ADDR_STR_LEN];
  376. bd_address_t *addr = GET_CONN_BT_ADDR(conn);
  377. hostif_bt_addr_to_str((const bt_addr_t *)addr, addr_str, BT_ADDR_STR_LEN);
  378. SYS_LOG_INF("A2dp disconnected:%p addr %s\n", conn, addr_str);
  379. btsrv_a2dp_hdl_cb_user(conn, BTSRV_A2DP_DISCONNECTED, NULL, 0);
  380. }
  381. static void _btsrv_a2dp_actived_dev_changed(struct bt_conn *conn)
  382. {
  383. uint8_t format, sample_rate;
  384. uint8_t codec_info[3];
  385. struct bt_conn *second_conn = btsrv_rdm_a2dp_get_second_dev();
  386. btsrv_a2dp_hdl_cb_user(second_conn, BTSRV_A2DP_STREAM_SUSPEND, NULL, 0);
  387. btsrv_rdm_a2dp_get_codec_info(conn, &format, &sample_rate, NULL);
  388. codec_info[0] = format;
  389. codec_info[1] = sample_rate;
  390. codec_info[2] = btsrv_rdm_a2dp_get_bitpool(conn);
  391. btsrv_a2dp_hdl_cb_user(conn, BTSRV_A2DP_CODEC_INFO, codec_info, sizeof(codec_info));
  392. btsrv_a2dp_hdl_cb_user(conn, BTSRV_A2DP_STREAM_STARED, NULL, 0);
  393. }
  394. static void _btsrv_a2dp_check_state(void)
  395. {
  396. struct bt_conn *conn = btsrv_rdm_a2dp_get_actived();
  397. struct bt_conn *second_conn = btsrv_rdm_a2dp_get_second_dev();
  398. if (btsrv_rdm_is_actived_a2dp_stream_open()) {
  399. SYS_LOG_INF("a2dp trigger start\n");
  400. uint8_t format, sample_rate;
  401. uint8_t codec_info[3];
  402. btsrv_rdm_a2dp_get_codec_info(conn, &format, &sample_rate, NULL);
  403. codec_info[0] = format;
  404. codec_info[1] = sample_rate;
  405. codec_info[2] = btsrv_rdm_a2dp_get_bitpool(conn);
  406. btsrv_a2dp_hdl_cb_user(conn, BTSRV_A2DP_CODEC_INFO, codec_info, sizeof(codec_info));
  407. btsrv_a2dp_hdl_cb_user(conn, BTSRV_A2DP_STREAM_STARED, NULL, 0);
  408. } else if (second_conn && btsrv_rdm_is_a2dp_stream_open(second_conn)) {
  409. /* active dev may not update during call,so after call exit,
  410. * we should change active dev if current active dev is not
  411. * stream opened.
  412. */
  413. btsrv_rdm_a2dp_actived(second_conn, 1);
  414. SYS_LOG_INF("change active dev to another\n");
  415. }
  416. }
  417. static void pts_send_delay_report(struct bt_conn *base_conn, uint8_t tws_dev, void *cb_param)
  418. {
  419. uint32_t delay_time = (uint32_t)cb_param;
  420. hostif_bt_a2dp_send_delay_report(base_conn, (uint16_t)delay_time);
  421. }
  422. static void btsrv_a2dp_send_delay_report(uint16_t delay_time)
  423. {
  424. struct bt_conn *conn = btsrv_rdm_a2dp_get_actived();
  425. uint32_t cb_param = delay_time;
  426. if (btsrv_is_pts_test() && conn == NULL) {
  427. btsrv_rdm_get_connected_dev(pts_send_delay_report, (void *)cb_param);
  428. return;
  429. }
  430. if (conn) {
  431. hostif_bt_a2dp_send_delay_report(conn, delay_time);
  432. }
  433. }
  434. int btsrv_a2dp_init(struct btsrv_a2dp_start_param *param)
  435. {
  436. int ret = 0;
  437. int i = 0, max_register;
  438. max_register = MIN(CONFIG_MAX_A2DP_ENDPOINT, param->sbc_endpoint_num);
  439. max_register = (max_register == 1) ? 2 : max_register; /* Register two endpoint for 1 phone */
  440. for (i = 0; i < max_register; i++) {
  441. a2dp_sbc_endpoint[i].info.codec = (struct bt_a2dp_media_codec *)param->sbc_codec;
  442. a2dp_sbc_endpoint[i].info.a2dp_cp_scms_t = param->a2dp_cp_scms_t;
  443. a2dp_sbc_endpoint[i].info.a2dp_delay_report = param->a2dp_delay_report;
  444. #ifdef CONFIG_BT_A2DP_SINK
  445. ret |= hostif_bt_a2dp_register_endpoint(&a2dp_sbc_endpoint[i], BT_A2DP_AUDIO, BT_A2DP_EP_SINK);
  446. #endif
  447. }
  448. max_register = MIN(CONFIG_MAX_A2DP_ENDPOINT, param->aac_endpoint_num);
  449. max_register = (max_register == 1) ? 2 : max_register; /* Register two endpoint for 1 phone */
  450. a2dp_register_aac_num = max_register;
  451. for (i = 0; i < max_register; i++) {
  452. a2dp_aac_endpoint[i].info.codec = (struct bt_a2dp_media_codec *)param->aac_codec;
  453. a2dp_aac_endpoint[i].info.a2dp_cp_scms_t = param->a2dp_cp_scms_t;
  454. a2dp_aac_endpoint[i].info.a2dp_delay_report = param->a2dp_delay_report;
  455. #ifdef CONFIG_BT_A2DP_SINK
  456. ret |= hostif_bt_a2dp_register_endpoint(&a2dp_aac_endpoint[i], BT_A2DP_AUDIO, BT_A2DP_EP_SINK);
  457. #endif
  458. }
  459. if (ret) {
  460. SYS_LOG_ERR("bt br-a2dp-register failed\n");
  461. goto err;
  462. }
  463. a2dp_user_callback = param->cb;
  464. #ifdef CONFIG_BT_A2DP_TRS
  465. btsrv_trs_a2dp_init(param);
  466. #endif
  467. hostif_bt_a2dp_register_cb((struct bt_a2dp_app_cb *)&btsrv_a2dp_cb);
  468. return 0;
  469. err:
  470. return -1;
  471. }
  472. int btsrv_a2dp_deinit(void)
  473. {
  474. hostif_bt_a2dp_register_cb(NULL);
  475. a2dp_user_callback = NULL;
  476. #ifdef CONFIG_BT_A2DP_TRS
  477. btsrv_trs_a2dp_deinit();
  478. #endif
  479. return 0;
  480. }
  481. static int btsrv_a2dp_disable(void)
  482. {
  483. struct bt_conn *conn;
  484. /** step 1: unregister sdp list*****************************/
  485. #ifdef CONFIG_BT_AVDTP
  486. #ifdef CONFIG_BT_A2DP_SINK
  487. bt_unregister_a2dp_sink_sdp();
  488. #endif
  489. #if defined(CONFIG_TWS) || defined(CONFIG_BT_A2DP_TRS)
  490. bt_unregister_a2dp_source_sdp();
  491. #endif
  492. #endif
  493. #ifdef CONFIG_BT_AVRCP
  494. bt_unregister_avrcp_ct_sdp();
  495. bt_unregister_avrcp_tg_sdp();
  496. #endif
  497. /*** step 2: unregister avdtp psm, disable a2dp/avrcp********/
  498. hostif_bt_a2dp_disable(0);
  499. hostif_bt_avrcp_disable(0);
  500. /*** step 3: disconnect a2dp/avrcp***************************/
  501. conn = btsrv_rdm_a2dp_get_connected_dev();
  502. if (conn) {
  503. btsrv_a2dp_disconnect(conn);
  504. }
  505. conn = btsrv_rdm_avrcp_get_connected_dev();
  506. if (conn) {
  507. btsrv_avrcp_disconnect(conn);
  508. }
  509. #ifdef CONFIG_BT_A2DP_TRS
  510. conn = btsrv_rdm_trs_a2dp_get_actived();
  511. if (conn) {
  512. btsrv_a2dp_disconnect(conn);
  513. }
  514. conn = btsrv_rdm_trs_avrcp_get_actived();
  515. if (conn) {
  516. btsrv_avrcp_disconnect(conn);
  517. }
  518. #endif
  519. return 0;
  520. }
  521. static int btsrv_a2dp_enable(void)
  522. {
  523. struct bt_conn *conn;
  524. /** step 1: register sdp list*********************************/
  525. #ifdef CONFIG_BT_AVDTP
  526. #ifdef CONFIG_BT_A2DP_SINK
  527. bt_register_a2dp_sink_sdp();
  528. #endif
  529. #if defined(CONFIG_TWS) || defined(CONFIG_BT_A2DP_TRS)
  530. bt_register_a2dp_source_sdp();
  531. #endif
  532. #endif
  533. #ifdef CONFIG_BT_AVRCP
  534. bt_register_avrcp_ct_sdp();
  535. bt_register_avrcp_tg_sdp();
  536. #endif
  537. /*** step 2: register avdtp psm, enable a2dp/avrcp***********/
  538. hostif_bt_a2dp_enable(0);
  539. hostif_bt_avrcp_enable(0);
  540. /*** step 3: connect a2dp/avrcp******************************/
  541. conn = btsrv_rdm_acl_get_connected_dev();
  542. if (conn) {
  543. if (!btsrv_rdm_is_a2dp_connected(conn)) {
  544. btsrv_a2dp_connect(conn, BT_A2DP_CH_SINK);
  545. }
  546. if (!btsrv_rdm_is_avrcp_connected(conn)) {
  547. btsrv_avrcp_connect(conn);
  548. }
  549. }
  550. return 0;
  551. }
  552. int btsrv_a2dp_disconnect(struct bt_conn *conn)
  553. {
  554. if (!conn) {
  555. SYS_LOG_ERR("conn is NULL\n");
  556. return -EINVAL;
  557. }
  558. hostif_bt_a2dp_disconnect(conn);
  559. SYS_LOG_INF("a2dp_disconnect\n");
  560. return 0;
  561. }
  562. int btsrv_a2dp_connect(struct bt_conn *conn, uint8_t role)
  563. {
  564. #ifndef CONFIG_BT_A2DP_SINK
  565. if (role == BT_A2DP_CH_SINK) {
  566. SYS_LOG_INF("Not config A2DP SINK");
  567. return 0;
  568. }
  569. #endif
  570. if (!hostif_bt_a2dp_connect(conn, role)) {
  571. SYS_LOG_INF("Connect a2dp\n");
  572. } else {
  573. SYS_LOG_ERR("Connect a2dp failed\n");
  574. }
  575. return 0;
  576. }
  577. void btsrv_a2dp_halt_aac_endpoint(bool halt)
  578. {
  579. int ret, i;
  580. for (i = 0; i < a2dp_register_aac_num; i++) {
  581. ret = hostif_bt_a2dp_halt_endpoint(&a2dp_aac_endpoint[i], halt);
  582. SYS_LOG_INF("%s AAC endpoint %d\n", (halt ? "Halt" : "Resume"), ret);
  583. }
  584. }
  585. int btsrv_a2dp_process(struct app_msg *msg)
  586. {
  587. struct bt_conn *conn;
  588. #ifdef CONFIG_BT_A2DP_TRS
  589. if (btsrv_trs_a2dp_process(msg) == true) {
  590. if (MSG_BTSRV_A2DP_CONNECTED == _btsrv_get_msg_param_cmd(msg)) {
  591. trs_conn = (struct bt_conn *)(msg->ptr);
  592. } else if (MSG_BTSRV_A2DP_DISCONNECTED == _btsrv_get_msg_param_cmd(msg)) {
  593. trs_conn = NULL;
  594. }
  595. SYS_LOG_INF("trs proc offset %d", (_btsrv_get_msg_param_cmd(msg) - MSG_BTSRV_A2DP_START));
  596. return 0;
  597. }
  598. #endif
  599. switch (_btsrv_get_msg_param_cmd(msg)) {
  600. case MSG_BTSRV_A2DP_START:
  601. SYS_LOG_INF("btsrv a2dp start");
  602. btsrv_a2dp_init(msg->ptr);
  603. break;
  604. case MSG_BTSRV_A2DP_STOP:
  605. SYS_LOG_INF("btsrv a2dp stop");
  606. btsrv_a2dp_deinit();
  607. break;
  608. case MSG_BTSRV_A2DP_DISABLE:
  609. SYS_LOG_INF("btsrv a2dp disable");
  610. btsrv_a2dp_disable();
  611. break;
  612. case MSG_BTSRV_A2DP_ENABLE:
  613. SYS_LOG_INF("btsrv a2dp enable");
  614. btsrv_a2dp_enable();
  615. break;
  616. case MSG_BTSRV_A2DP_CONNECT_TO:
  617. SYS_LOG_INF("btsrv a2dp connect");
  618. conn = btsrv_rdm_find_conn_by_addr(msg->ptr);
  619. if (conn) {
  620. btsrv_a2dp_connect(conn, (_btsrv_get_msg_param_reserve(msg) ? BT_A2DP_CH_SOURCE : BT_A2DP_CH_SINK));
  621. }
  622. break;
  623. case MSG_BTSRV_A2DP_DISCONNECT:
  624. SYS_LOG_INF("btsrv a2dp disconnect");
  625. conn = btsrv_rdm_find_conn_by_addr(msg->ptr);
  626. if (conn) {
  627. btsrv_a2dp_disconnect(conn);
  628. }
  629. break;
  630. case MSG_BTSRV_A2DP_CONNECTED:
  631. SYS_LOG_INF("btsrv a2dp connected");
  632. _btsrv_a2dp_connected(msg->ptr);
  633. break;
  634. case MSG_BTSRV_A2DP_DISCONNECTED:
  635. SYS_LOG_INF("btsrv a2dp disconnected");
  636. if (btsrv_rdm_a2dp_get_actived() == (struct bt_conn *)(msg->ptr) ||
  637. btsrv_rdm_get_conn_role(msg->ptr) == BTSRV_TWS_SLAVE) {
  638. /* Device with media start, without media suspend/close buf direct
  639. * a2dp disconnect, need send media close to upper layer to stop music play.
  640. */
  641. btsrv_a2dp_hdl_cb_user(msg->ptr, BTSRV_A2DP_STREAM_CLOSED, NULL, 0);
  642. }
  643. _btsrv_a2dp_disconnected(msg->ptr);
  644. btsrv_event_notify(MSG_BTSRV_CONNECT, _btsrv_get_msg_param_cmd(msg), msg->ptr);
  645. break;
  646. case MSG_BTSRV_A2DP_MEDIA_STATE_CB:
  647. btsrv_a2dp_media_state_req_proc(msg->ptr, _btsrv_get_msg_param_reserve(msg));
  648. break;
  649. case MSG_BTSRV_A2DP_SET_CODEC_CB:
  650. btsrv_a2dp_seted_codec_proc(msg->ptr);
  651. break;
  652. case MSG_BTSRV_A2DP_MEDIA_STATE_OPEN:
  653. btsrv_a2dp_hdl_cb_user(msg->ptr, BTSRV_A2DP_STREAM_OPENED, NULL, 0);
  654. break;
  655. case MSG_BTSRV_A2DP_MEDIA_STATE_START:
  656. btsrv_a2dp_hdl_cb_user(msg->ptr, BTSRV_A2DP_STREAM_STARED, NULL, 0);
  657. break;
  658. case MSG_BTSRV_A2DP_MEDIA_STATE_CLOSE:
  659. btsrv_a2dp_hdl_cb_user(msg->ptr, BTSRV_A2DP_STREAM_CLOSED, NULL, 0);
  660. break;
  661. case MSG_BTSRV_A2DP_MEDIA_STATE_SUSPEND:
  662. btsrv_a2dp_hdl_cb_user(msg->ptr, BTSRV_A2DP_STREAM_SUSPEND, NULL, 0);
  663. break;
  664. case MSG_BTSRV_A2DP_ACTIVED_DEV_CHANGED:
  665. _btsrv_a2dp_actived_dev_changed(msg->ptr);
  666. break;
  667. case MSG_BTSRV_A2DP_CHECK_STATE:
  668. _btsrv_a2dp_check_state();
  669. break;
  670. case MSG_BTSRV_A2DP_SEND_DELAY_REPORT:
  671. btsrv_a2dp_send_delay_report((uint16_t)_btsrv_get_msg_param_value(msg));
  672. break;
  673. default:
  674. break;
  675. }
  676. return 0;
  677. }
  678. int btsrv_a2dp_trs_conn_get(void)
  679. {
  680. return (int)trs_conn;
  681. }