esp_a2dp_api.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. /*
  2. * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "common/bt_target.h"
  7. #include <string.h>
  8. #include "esp_err.h"
  9. #include "esp_a2dp_api.h"
  10. #include "esp_bt_main.h"
  11. #include "btc/btc_manage.h"
  12. #include "btc_av.h"
  13. #if BTC_AV_INCLUDED
  14. #if BTC_AV_SINK_INCLUDED
  15. esp_err_t esp_a2d_sink_init(void)
  16. {
  17. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  18. return ESP_ERR_INVALID_STATE;
  19. }
  20. if (g_a2dp_on_init || g_a2dp_sink_ongoing_deinit) {
  21. return ESP_ERR_INVALID_STATE;
  22. }
  23. btc_msg_t msg;
  24. msg.sig = BTC_SIG_API_CALL;
  25. msg.pid = BTC_PID_A2DP;
  26. msg.act = BTC_AV_SINK_API_INIT_EVT;
  27. /* Switch to BTC context */
  28. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  29. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  30. }
  31. esp_err_t esp_a2d_sink_deinit(void)
  32. {
  33. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  34. return ESP_ERR_INVALID_STATE;
  35. }
  36. if (g_a2dp_on_deinit || g_a2dp_sink_ongoing_deinit) {
  37. return ESP_ERR_INVALID_STATE;
  38. }
  39. btc_msg_t msg;
  40. msg.sig = BTC_SIG_API_CALL;
  41. msg.pid = BTC_PID_A2DP;
  42. msg.act = BTC_AV_SINK_API_DEINIT_EVT;
  43. /* Switch to BTC context */
  44. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  45. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  46. }
  47. esp_err_t esp_a2d_sink_register_data_callback(esp_a2d_sink_data_cb_t callback)
  48. {
  49. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  50. return ESP_ERR_INVALID_STATE;
  51. }
  52. if (g_a2dp_sink_ongoing_deinit) {
  53. return ESP_ERR_INVALID_STATE;
  54. }
  55. btc_msg_t msg;
  56. msg.sig = BTC_SIG_API_CALL;
  57. msg.pid = BTC_PID_A2DP;
  58. msg.act = BTC_AV_SINK_API_REG_DATA_CB_EVT;
  59. btc_av_args_t arg;
  60. memset(&arg, 0, sizeof(btc_av_args_t));
  61. arg.data_cb = callback;
  62. /* Switch to BTC context */
  63. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL, NULL);
  64. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  65. }
  66. esp_err_t esp_a2d_sink_connect(esp_bd_addr_t remote_bda)
  67. {
  68. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  69. return ESP_ERR_INVALID_STATE;
  70. }
  71. if (g_a2dp_on_deinit || g_a2dp_sink_ongoing_deinit) {
  72. return ESP_ERR_INVALID_STATE;
  73. }
  74. bt_status_t stat;
  75. btc_av_args_t arg;
  76. btc_msg_t msg;
  77. msg.sig = BTC_SIG_API_CALL;
  78. msg.pid = BTC_PID_A2DP;
  79. msg.act = BTC_AV_SINK_API_CONNECT_EVT;
  80. memset(&arg, 0, sizeof(btc_av_args_t));
  81. /* Switch to BTC context */
  82. memcpy(&(arg.connect), remote_bda, sizeof(bt_bdaddr_t));
  83. stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL, NULL);
  84. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  85. }
  86. esp_err_t esp_a2d_sink_disconnect(esp_bd_addr_t remote_bda)
  87. {
  88. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  89. return ESP_ERR_INVALID_STATE;
  90. }
  91. if (g_a2dp_on_deinit || g_a2dp_sink_ongoing_deinit) {
  92. return ESP_ERR_INVALID_STATE;
  93. }
  94. bt_status_t stat;
  95. btc_av_args_t arg;
  96. btc_msg_t msg;
  97. msg.sig = BTC_SIG_API_CALL;
  98. msg.pid = BTC_PID_A2DP;
  99. msg.act = BTC_AV_SINK_API_DISCONNECT_EVT;
  100. /* Switch to BTC context */
  101. memcpy(&(arg.disconn), remote_bda, sizeof(bt_bdaddr_t));
  102. stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL, NULL);
  103. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  104. }
  105. esp_err_t esp_a2d_sink_set_delay_value(uint16_t delay_value)
  106. {
  107. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  108. return ESP_ERR_INVALID_STATE;
  109. }
  110. if (g_a2dp_on_deinit || g_a2dp_sink_ongoing_deinit) {
  111. return ESP_ERR_INVALID_STATE;
  112. }
  113. bt_status_t stat;
  114. btc_av_args_t arg;
  115. btc_msg_t msg;
  116. msg.sig = BTC_SIG_API_CALL;
  117. msg.pid = BTC_PID_A2DP;
  118. msg.act = BTC_AV_SINK_API_SET_DELAY_VALUE_EVT;
  119. memset(&arg, 0, sizeof(btc_av_args_t));
  120. arg.delay_value = delay_value;
  121. /* Switch to BTC context */
  122. stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL, NULL);
  123. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  124. }
  125. esp_err_t esp_a2d_sink_get_delay_value(void)
  126. {
  127. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  128. return ESP_ERR_INVALID_STATE;
  129. }
  130. if (g_a2dp_on_deinit || g_a2dp_sink_ongoing_deinit) {
  131. return ESP_ERR_INVALID_STATE;
  132. }
  133. bt_status_t stat;
  134. btc_msg_t msg;
  135. msg.sig = BTC_SIG_API_CALL;
  136. msg.pid = BTC_PID_A2DP;
  137. msg.act = BTC_AV_SINK_API_GET_DELAY_VALUE_EVT;
  138. /* Switch to BTC context */
  139. stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  140. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  141. }
  142. #endif /* BTC_AV_SINK_INCLUDED */
  143. esp_err_t esp_a2d_register_callback(esp_a2d_cb_t callback)
  144. {
  145. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  146. return ESP_ERR_INVALID_STATE;
  147. }
  148. if (g_a2dp_sink_ongoing_deinit || g_a2dp_source_ongoing_deinit) {
  149. return ESP_ERR_INVALID_STATE;
  150. }
  151. if (callback == NULL) {
  152. return ESP_FAIL;
  153. }
  154. btc_profile_cb_set(BTC_PID_A2DP, callback);
  155. return ESP_OK;
  156. }
  157. esp_err_t esp_a2d_media_ctrl(esp_a2d_media_ctrl_t ctrl)
  158. {
  159. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  160. return ESP_ERR_INVALID_STATE;
  161. }
  162. if (g_a2dp_on_deinit || g_a2dp_sink_ongoing_deinit || g_a2dp_source_ongoing_deinit) {
  163. return ESP_ERR_INVALID_STATE;
  164. }
  165. if (ctrl == ESP_A2D_MEDIA_CTRL_STOP) {
  166. LOG_WARN("ESP_A2D_MEDIA_CTRL_STOP is deprecated, using ESP_A2D_MEDIA_CTRL_SUSPEND instead.\n");
  167. ctrl = ESP_A2D_MEDIA_CTRL_SUSPEND;
  168. }
  169. bt_status_t stat;
  170. btc_av_args_t arg;
  171. btc_msg_t msg;
  172. msg.sig = BTC_SIG_API_CALL;
  173. msg.pid = BTC_PID_A2DP;
  174. msg.act = BTC_AV_API_MEDIA_CTRL_EVT;
  175. memset(&arg, 0, sizeof(btc_av_args_t));
  176. /* Switch to BTC context */
  177. arg.ctrl = ctrl;
  178. stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL, NULL);
  179. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  180. }
  181. #if BTC_AV_SRC_INCLUDED
  182. esp_err_t esp_a2d_source_init(void)
  183. {
  184. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  185. return ESP_ERR_INVALID_STATE;
  186. }
  187. if (g_a2dp_on_init || g_a2dp_source_ongoing_deinit) {
  188. return ESP_ERR_INVALID_STATE;
  189. }
  190. btc_msg_t msg;
  191. msg.sig = BTC_SIG_API_CALL;
  192. msg.pid = BTC_PID_A2DP;
  193. msg.act = BTC_AV_SRC_API_INIT_EVT;
  194. /* Switch to BTC context */
  195. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  196. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  197. }
  198. esp_err_t esp_a2d_source_deinit(void)
  199. {
  200. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  201. return ESP_ERR_INVALID_STATE;
  202. }
  203. if (g_a2dp_on_deinit || g_a2dp_source_ongoing_deinit) {
  204. return ESP_ERR_INVALID_STATE;
  205. }
  206. btc_msg_t msg;
  207. msg.sig = BTC_SIG_API_CALL;
  208. msg.pid = BTC_PID_A2DP;
  209. msg.act = BTC_AV_SRC_API_DEINIT_EVT;
  210. /* Switch to BTC context */
  211. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  212. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  213. }
  214. esp_err_t esp_a2d_source_connect(esp_bd_addr_t remote_bda)
  215. {
  216. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  217. return ESP_ERR_INVALID_STATE;
  218. }
  219. if (g_a2dp_on_deinit || g_a2dp_source_ongoing_deinit) {
  220. return ESP_ERR_INVALID_STATE;
  221. }
  222. bt_status_t stat;
  223. btc_av_args_t arg;
  224. btc_msg_t msg;
  225. msg.sig = BTC_SIG_API_CALL;
  226. msg.pid = BTC_PID_A2DP;
  227. msg.act = BTC_AV_SRC_API_CONNECT_EVT;
  228. memset(&arg, 0, sizeof(btc_av_args_t));
  229. /* Switch to BTC context */
  230. memcpy(&(arg.src_connect), remote_bda, sizeof(bt_bdaddr_t));
  231. stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL, NULL);
  232. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  233. }
  234. esp_err_t esp_a2d_source_disconnect(esp_bd_addr_t remote_bda)
  235. {
  236. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  237. return ESP_ERR_INVALID_STATE;
  238. }
  239. if (g_a2dp_on_deinit || g_a2dp_source_ongoing_deinit) {
  240. return ESP_ERR_INVALID_STATE;
  241. }
  242. bt_status_t stat;
  243. btc_av_args_t arg;
  244. btc_msg_t msg;
  245. msg.sig = BTC_SIG_API_CALL;
  246. msg.pid = BTC_PID_A2DP;
  247. msg.act = BTC_AV_SRC_API_DISCONNECT_EVT;
  248. memset(&arg, 0, sizeof(btc_av_args_t));
  249. /* Switch to BTC context */
  250. memcpy(&(arg.src_disconn), remote_bda, sizeof(bt_bdaddr_t));
  251. stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL, NULL);
  252. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  253. }
  254. esp_err_t esp_a2d_source_register_data_callback(esp_a2d_source_data_cb_t callback)
  255. {
  256. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  257. return ESP_ERR_INVALID_STATE;
  258. }
  259. if (g_a2dp_source_ongoing_deinit) {
  260. return ESP_ERR_INVALID_STATE;
  261. }
  262. btc_msg_t msg;
  263. msg.sig = BTC_SIG_API_CALL;
  264. msg.pid = BTC_PID_A2DP;
  265. msg.act = BTC_AV_SRC_API_REG_DATA_CB_EVT;
  266. btc_av_args_t arg;
  267. memset(&arg, 0, sizeof(btc_av_args_t));
  268. arg.src_data_cb = callback;
  269. /* Switch to BTC context */
  270. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL, NULL);
  271. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  272. }
  273. #endif /* BTC_AV_SRC_INCLUDED */
  274. #endif /* #if BTC_AV_INCLUDED */