esp_a2dp_api.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  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);
  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);
  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);
  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);
  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);
  103. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  104. }
  105. #endif /* BTC_AV_SINK_INCLUDED */
  106. esp_err_t esp_a2d_register_callback(esp_a2d_cb_t callback)
  107. {
  108. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  109. return ESP_ERR_INVALID_STATE;
  110. }
  111. if (g_a2dp_sink_ongoing_deinit || g_a2dp_source_ongoing_deinit) {
  112. return ESP_ERR_INVALID_STATE;
  113. }
  114. if (callback == NULL) {
  115. return ESP_FAIL;
  116. }
  117. btc_profile_cb_set(BTC_PID_A2DP, callback);
  118. return ESP_OK;
  119. }
  120. esp_err_t esp_a2d_media_ctrl(esp_a2d_media_ctrl_t ctrl)
  121. {
  122. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  123. return ESP_ERR_INVALID_STATE;
  124. }
  125. if (g_a2dp_on_deinit || g_a2dp_sink_ongoing_deinit || g_a2dp_source_ongoing_deinit) {
  126. return ESP_ERR_INVALID_STATE;
  127. }
  128. bt_status_t stat;
  129. btc_av_args_t arg;
  130. btc_msg_t msg;
  131. msg.sig = BTC_SIG_API_CALL;
  132. msg.pid = BTC_PID_A2DP;
  133. msg.act = BTC_AV_API_MEDIA_CTRL_EVT;
  134. memset(&arg, 0, sizeof(btc_av_args_t));
  135. /* Switch to BTC context */
  136. arg.ctrl = ctrl;
  137. stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL);
  138. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  139. }
  140. #if BTC_AV_SRC_INCLUDED
  141. esp_err_t esp_a2d_source_init(void)
  142. {
  143. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  144. return ESP_ERR_INVALID_STATE;
  145. }
  146. if (g_a2dp_on_init || g_a2dp_source_ongoing_deinit) {
  147. return ESP_ERR_INVALID_STATE;
  148. }
  149. btc_msg_t msg;
  150. msg.sig = BTC_SIG_API_CALL;
  151. msg.pid = BTC_PID_A2DP;
  152. msg.act = BTC_AV_SRC_API_INIT_EVT;
  153. /* Switch to BTC context */
  154. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL);
  155. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  156. }
  157. esp_err_t esp_a2d_source_deinit(void)
  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_source_ongoing_deinit) {
  163. return ESP_ERR_INVALID_STATE;
  164. }
  165. btc_msg_t msg;
  166. msg.sig = BTC_SIG_API_CALL;
  167. msg.pid = BTC_PID_A2DP;
  168. msg.act = BTC_AV_SRC_API_DEINIT_EVT;
  169. /* Switch to BTC context */
  170. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL);
  171. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  172. }
  173. esp_err_t esp_a2d_source_connect(esp_bd_addr_t remote_bda)
  174. {
  175. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  176. return ESP_ERR_INVALID_STATE;
  177. }
  178. if (g_a2dp_on_deinit || g_a2dp_source_ongoing_deinit) {
  179. return ESP_ERR_INVALID_STATE;
  180. }
  181. bt_status_t stat;
  182. btc_av_args_t arg;
  183. btc_msg_t msg;
  184. msg.sig = BTC_SIG_API_CALL;
  185. msg.pid = BTC_PID_A2DP;
  186. msg.act = BTC_AV_SRC_API_CONNECT_EVT;
  187. memset(&arg, 0, sizeof(btc_av_args_t));
  188. /* Switch to BTC context */
  189. memcpy(&(arg.src_connect), remote_bda, sizeof(bt_bdaddr_t));
  190. stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL);
  191. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  192. }
  193. esp_err_t esp_a2d_source_disconnect(esp_bd_addr_t remote_bda)
  194. {
  195. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  196. return ESP_ERR_INVALID_STATE;
  197. }
  198. if (g_a2dp_on_deinit || g_a2dp_source_ongoing_deinit) {
  199. return ESP_ERR_INVALID_STATE;
  200. }
  201. bt_status_t stat;
  202. btc_av_args_t arg;
  203. btc_msg_t msg;
  204. msg.sig = BTC_SIG_API_CALL;
  205. msg.pid = BTC_PID_A2DP;
  206. msg.act = BTC_AV_SRC_API_DISCONNECT_EVT;
  207. memset(&arg, 0, sizeof(btc_av_args_t));
  208. /* Switch to BTC context */
  209. memcpy(&(arg.src_disconn), remote_bda, sizeof(bt_bdaddr_t));
  210. stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL);
  211. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  212. }
  213. esp_err_t esp_a2d_source_register_data_callback(esp_a2d_source_data_cb_t callback)
  214. {
  215. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  216. return ESP_ERR_INVALID_STATE;
  217. }
  218. if (g_a2dp_source_ongoing_deinit) {
  219. return ESP_ERR_INVALID_STATE;
  220. }
  221. btc_msg_t msg;
  222. msg.sig = BTC_SIG_API_CALL;
  223. msg.pid = BTC_PID_A2DP;
  224. msg.act = BTC_AV_SRC_API_REG_DATA_CB_EVT;
  225. btc_av_args_t arg;
  226. memset(&arg, 0, sizeof(btc_av_args_t));
  227. arg.src_data_cb = callback;
  228. /* Switch to BTC context */
  229. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL);
  230. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  231. }
  232. #endif /* BTC_AV_SRC_INCLUDED */
  233. #endif /* #if BTC_AV_INCLUDED */