esp_hf_client_api.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. // Copyright 2018 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. #include "common/bt_target.h"
  14. #include <string.h>
  15. #include "esp_err.h"
  16. #include "esp_hf_client_api.h"
  17. #include "esp_bt_main.h"
  18. #include "btc/btc_manage.h"
  19. #include "btc_hf_client.h"
  20. #include "bta/bta_api.h"
  21. #include "bta/bta_hf_client_api.h"
  22. #if BTC_HF_CLIENT_INCLUDED
  23. esp_err_t esp_hf_client_register_callback(esp_hf_client_cb_t callback)
  24. {
  25. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  26. return ESP_ERR_INVALID_STATE;
  27. }
  28. if (callback == NULL) {
  29. return ESP_FAIL;
  30. }
  31. btc_profile_cb_set(BTC_PID_HF_CLIENT, callback);
  32. return ESP_OK;
  33. }
  34. esp_err_t esp_hf_client_init(void)
  35. {
  36. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  37. return ESP_ERR_INVALID_STATE;
  38. }
  39. btc_msg_t msg;
  40. msg.sig = BTC_SIG_API_CALL;
  41. msg.pid = BTC_PID_HF_CLIENT;
  42. msg.act = BTC_HF_CLIENT_INIT_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_hf_client_deinit(void)
  48. {
  49. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  50. return ESP_ERR_INVALID_STATE;
  51. }
  52. btc_msg_t msg;
  53. msg.sig = BTC_SIG_API_CALL;
  54. msg.pid = BTC_PID_HF_CLIENT;
  55. msg.act = BTC_HF_CLIENT_DEINIT_EVT;
  56. /* Switch to BTC context */
  57. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL);
  58. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  59. }
  60. esp_err_t esp_hf_client_connect(esp_bd_addr_t remote_bda)
  61. {
  62. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  63. return ESP_ERR_INVALID_STATE;
  64. }
  65. bt_status_t stat;
  66. btc_hf_client_args_t arg;
  67. btc_msg_t msg;
  68. msg.sig = BTC_SIG_API_CALL;
  69. msg.pid = BTC_PID_HF_CLIENT;
  70. msg.act = BTC_HF_CLIENT_CONNECT_EVT;
  71. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  72. /* Switch to BTC context */
  73. memcpy(&(arg.connect), remote_bda, sizeof(bt_bdaddr_t));
  74. stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL);
  75. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  76. }
  77. esp_err_t esp_hf_client_disconnect(esp_bd_addr_t remote_bda)
  78. {
  79. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  80. return ESP_ERR_INVALID_STATE;
  81. }
  82. bt_status_t stat;
  83. btc_hf_client_args_t arg;
  84. btc_msg_t msg;
  85. msg.sig = BTC_SIG_API_CALL;
  86. msg.pid = BTC_PID_HF_CLIENT;
  87. msg.act = BTC_HF_CLIENT_DISCONNECT_EVT;
  88. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  89. /* Switch to BTC context */
  90. memcpy(&(arg.disconnect), remote_bda, sizeof(bt_bdaddr_t));
  91. stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL);
  92. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  93. }
  94. esp_err_t esp_hf_client_connect_audio(esp_bd_addr_t remote_bda)
  95. {
  96. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  97. return ESP_ERR_INVALID_STATE;
  98. }
  99. bt_status_t stat;
  100. btc_hf_client_args_t arg;
  101. btc_msg_t msg;
  102. msg.sig = BTC_SIG_API_CALL;
  103. msg.pid = BTC_PID_HF_CLIENT;
  104. msg.act = BTC_HF_CLIENT_CONNECT_AUDIO_EVT;
  105. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  106. /* Switch to BTC context */
  107. memcpy(&(arg.connect_audio), remote_bda, sizeof(bt_bdaddr_t));
  108. stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL);
  109. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  110. }
  111. esp_err_t esp_hf_client_disconnect_audio(esp_bd_addr_t remote_bda)
  112. {
  113. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  114. return ESP_ERR_INVALID_STATE;
  115. }
  116. bt_status_t stat;
  117. btc_hf_client_args_t arg;
  118. btc_msg_t msg;
  119. msg.sig = BTC_SIG_API_CALL;
  120. msg.pid = BTC_PID_HF_CLIENT;
  121. msg.act = BTC_HF_CLIENT_DISCONNECT_AUDIO_EVT;
  122. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  123. /* Switch to BTC context */
  124. memcpy(&(arg.disconnect_audio), remote_bda, sizeof(bt_bdaddr_t));
  125. stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL);
  126. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  127. }
  128. esp_err_t esp_hf_client_start_voice_recognition(void)
  129. {
  130. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  131. return ESP_ERR_INVALID_STATE;
  132. }
  133. btc_msg_t msg;
  134. msg.sig = BTC_SIG_API_CALL;
  135. msg.pid = BTC_PID_HF_CLIENT;
  136. msg.act = BTC_HF_CLIENT_START_VOICE_RECOGNITION_EVT;
  137. /* Switch to BTC context */
  138. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL);
  139. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  140. }
  141. esp_err_t esp_hf_client_stop_voice_recognition(void)
  142. {
  143. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  144. return ESP_ERR_INVALID_STATE;
  145. }
  146. btc_msg_t msg;
  147. msg.sig = BTC_SIG_API_CALL;
  148. msg.pid = BTC_PID_HF_CLIENT;
  149. msg.act = BTC_HF_CLIENT_STOP_VOICE_RECOGNITION_EVT;
  150. /* Switch to BTC context */
  151. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL);
  152. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  153. }
  154. esp_err_t esp_hf_client_volume_update(esp_hf_volume_control_target_t type, int volume)
  155. {
  156. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  157. return ESP_ERR_INVALID_STATE;
  158. }
  159. btc_msg_t msg;
  160. btc_hf_client_args_t arg;
  161. msg.sig = BTC_SIG_API_CALL;
  162. msg.pid = BTC_PID_HF_CLIENT;
  163. msg.act = BTC_HF_CLIENT_VOLUME_UPDATE_EVT;
  164. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  165. arg.volume_update.type = type;
  166. arg.volume_update.volume = volume;
  167. /* Switch to BTC context */
  168. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL);
  169. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  170. }
  171. esp_err_t esp_hf_client_dial(const char *number)
  172. {
  173. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  174. return ESP_ERR_INVALID_STATE;
  175. }
  176. btc_msg_t msg;
  177. btc_hf_client_args_t arg;
  178. if (number != NULL && strlen(number) > ESP_BT_HF_CLIENT_NUMBER_LEN) {
  179. return ESP_ERR_INVALID_ARG;
  180. }
  181. msg.sig = BTC_SIG_API_CALL;
  182. msg.pid = BTC_PID_HF_CLIENT;
  183. msg.act = BTC_HF_CLIENT_DIAL_EVT;
  184. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  185. if (number != NULL) {
  186. strcpy(arg.dial.number, number);
  187. } else {
  188. arg.dial.number[0] = '\0';
  189. }
  190. /* Switch to BTC context */
  191. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL);
  192. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  193. }
  194. esp_err_t esp_hf_client_dial_memory(int location)
  195. {
  196. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  197. return ESP_ERR_INVALID_STATE;
  198. }
  199. btc_msg_t msg;
  200. btc_hf_client_args_t arg;
  201. msg.sig = BTC_SIG_API_CALL;
  202. msg.pid = BTC_PID_HF_CLIENT;
  203. msg.act = BTC_HF_CLIENT_DIAL_MEMORY_EVT;
  204. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  205. arg.dial_memory.location = location;
  206. /* Switch to BTC context */
  207. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL);
  208. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  209. }
  210. esp_err_t esp_hf_client_send_chld_cmd(esp_hf_chld_type_t chld, int idx)
  211. {
  212. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  213. return ESP_ERR_INVALID_STATE;
  214. }
  215. btc_msg_t msg;
  216. btc_hf_client_args_t arg;
  217. msg.sig = BTC_SIG_API_CALL;
  218. msg.pid = BTC_PID_HF_CLIENT;
  219. msg.act = BTC_HF_CLIENT_SEND_CHLD_CMD_EVT;
  220. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  221. arg.chld.type = chld;
  222. arg.chld.idx = idx;
  223. /* Switch to BTC context */
  224. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL);
  225. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  226. }
  227. esp_err_t esp_hf_client_send_btrh_cmd(esp_hf_btrh_cmd_t btrh)
  228. {
  229. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  230. return ESP_ERR_INVALID_STATE;
  231. }
  232. btc_msg_t msg;
  233. btc_hf_client_args_t arg;
  234. msg.sig = BTC_SIG_API_CALL;
  235. msg.pid = BTC_PID_HF_CLIENT;
  236. msg.act = BTC_HF_CLIENT_SEND_BTRH_CMD_EVT;
  237. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  238. arg.btrh.cmd = btrh;
  239. /* Switch to BTC context */
  240. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL);
  241. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  242. }
  243. esp_err_t esp_hf_client_answer_call(void)
  244. {
  245. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  246. return ESP_ERR_INVALID_STATE;
  247. }
  248. btc_msg_t msg;
  249. msg.sig = BTC_SIG_API_CALL;
  250. msg.pid = BTC_PID_HF_CLIENT;
  251. msg.act = BTC_HF_CLIENT_ANSWER_CALL_EVT;
  252. /* Switch to BTC context */
  253. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL);
  254. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  255. }
  256. esp_err_t esp_hf_client_reject_call(void)
  257. {
  258. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  259. return ESP_ERR_INVALID_STATE;
  260. }
  261. btc_msg_t msg;
  262. msg.sig = BTC_SIG_API_CALL;
  263. msg.pid = BTC_PID_HF_CLIENT;
  264. msg.act = BTC_HF_CLIENT_REJECT_CALL_EVT;
  265. /* Switch to BTC context */
  266. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL);
  267. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  268. }
  269. esp_err_t esp_hf_client_query_current_calls(void)
  270. {
  271. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  272. return ESP_ERR_INVALID_STATE;
  273. }
  274. btc_msg_t msg;
  275. msg.sig = BTC_SIG_API_CALL;
  276. msg.pid = BTC_PID_HF_CLIENT;
  277. msg.act = BTC_HF_CLIENT_QUERY_CURRENT_CALLS_EVT;
  278. /* Switch to BTC context */
  279. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL);
  280. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  281. }
  282. esp_err_t esp_hf_client_query_current_operator_name(void)
  283. {
  284. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  285. return ESP_ERR_INVALID_STATE;
  286. }
  287. btc_msg_t msg;
  288. msg.sig = BTC_SIG_API_CALL;
  289. msg.pid = BTC_PID_HF_CLIENT;
  290. msg.act = BTC_HF_CLIENT_QUERY_CURRENT_OPERATOR_NAME_EVT;
  291. /* Switch to BTC context */
  292. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL);
  293. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  294. }
  295. esp_err_t esp_hf_client_retrieve_subscriber_info(void)
  296. {
  297. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  298. return ESP_ERR_INVALID_STATE;
  299. }
  300. btc_msg_t msg;
  301. msg.sig = BTC_SIG_API_CALL;
  302. msg.pid = BTC_PID_HF_CLIENT;
  303. msg.act = BTC_HF_CLIENT_RETRIEVE_SUBSCRIBER_INFO_EVT;
  304. /* Switch to BTC context */
  305. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL);
  306. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  307. }
  308. esp_err_t esp_hf_client_send_dtmf(char code)
  309. {
  310. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  311. return ESP_ERR_INVALID_STATE;
  312. }
  313. btc_msg_t msg;
  314. btc_hf_client_args_t arg;
  315. msg.sig = BTC_SIG_API_CALL;
  316. msg.pid = BTC_PID_HF_CLIENT;
  317. msg.act = BTC_HF_CLIENT_SEND_DTMF_EVT;
  318. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  319. arg.send_dtmf.code = code;
  320. /* Switch to BTC context */
  321. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL);
  322. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  323. }
  324. esp_err_t esp_hf_client_request_last_voice_tag_number(void)
  325. {
  326. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  327. return ESP_ERR_INVALID_STATE;
  328. }
  329. btc_msg_t msg;
  330. msg.sig = BTC_SIG_API_CALL;
  331. msg.pid = BTC_PID_HF_CLIENT;
  332. msg.act = BTC_HF_CLIENT_REQUEST_LAST_VOICE_TAG_NUMBER_EVT;
  333. /* Switch to BTC context */
  334. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL);
  335. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  336. }
  337. esp_err_t esp_hf_client_send_nrec(void)
  338. {
  339. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  340. return ESP_ERR_INVALID_STATE;
  341. }
  342. btc_msg_t msg;
  343. msg.sig = BTC_SIG_API_CALL;
  344. msg.pid = BTC_PID_HF_CLIENT;
  345. msg.act = BTC_HF_CLIENT_SEND_NREC_EVT;
  346. /* Switch to BTC context */
  347. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL);
  348. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  349. }
  350. esp_err_t esp_hf_client_register_data_callback(esp_hf_client_incoming_data_cb_t recv,
  351. esp_hf_client_outgoing_data_cb_t send)
  352. {
  353. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  354. return ESP_ERR_INVALID_STATE;
  355. }
  356. btc_msg_t msg;
  357. msg.sig = BTC_SIG_API_CALL;
  358. msg.pid = BTC_PID_HF_CLIENT;
  359. msg.act = BTC_HF_CLIENT_REGISTER_DATA_CALLBACK_EVT;
  360. btc_hf_client_args_t arg;
  361. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  362. arg.reg_data_cb.recv = recv;
  363. arg.reg_data_cb.send = send;
  364. /* Switch to BTC context */
  365. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL);
  366. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  367. }
  368. #if (BTM_SCO_HCI_INCLUDED == TRUE )
  369. void esp_hf_client_outgoing_data_ready(void)
  370. {
  371. BTA_HfClientCiData();
  372. }
  373. void esp_hf_client_pcm_resample_init(uint32_t src_sps, uint32_t bits, uint32_t channels)
  374. {
  375. BTA_DmPcmInitSamples(src_sps, bits, channels);
  376. }
  377. void esp_hf_client_pcm_resample_deinit(void)
  378. {
  379. BTA_DmPcmDeinitSamples();
  380. }
  381. int32_t esp_hf_client_pcm_resample(void *src, uint32_t in_bytes, void *dst)
  382. {
  383. return BTA_DmPcmResample(src, in_bytes, dst);
  384. }
  385. #endif /* #if (BTM_SCO_HCI_INCLUDED == TRUE ) */
  386. #endif /* BTC_HF_CLIENT_INCLUDED */