esp_hf_client_api.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. /*
  2. * SPDX-FileCopyrightText: 2015-2023 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_hf_client_api.h"
  10. #include "esp_bt_main.h"
  11. #include "btc/btc_manage.h"
  12. #include "btc_hf_client.h"
  13. #include "bta/bta_api.h"
  14. #include "bta/bta_hf_client_api.h"
  15. #if BTC_HF_CLIENT_INCLUDED
  16. esp_err_t esp_hf_client_register_callback(esp_hf_client_cb_t callback)
  17. {
  18. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  19. return ESP_ERR_INVALID_STATE;
  20. }
  21. if (callback == NULL) {
  22. return ESP_FAIL;
  23. }
  24. btc_profile_cb_set(BTC_PID_HF_CLIENT, callback);
  25. return ESP_OK;
  26. }
  27. esp_err_t esp_hf_client_init(void)
  28. {
  29. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  30. return ESP_ERR_INVALID_STATE;
  31. }
  32. btc_msg_t msg;
  33. msg.sig = BTC_SIG_API_CALL;
  34. msg.pid = BTC_PID_HF_CLIENT;
  35. msg.act = BTC_HF_CLIENT_INIT_EVT;
  36. /* Switch to BTC context */
  37. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  38. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  39. }
  40. esp_err_t esp_hf_client_deinit(void)
  41. {
  42. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  43. return ESP_ERR_INVALID_STATE;
  44. }
  45. btc_msg_t msg;
  46. msg.sig = BTC_SIG_API_CALL;
  47. msg.pid = BTC_PID_HF_CLIENT;
  48. msg.act = BTC_HF_CLIENT_DEINIT_EVT;
  49. /* Switch to BTC context */
  50. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  51. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  52. }
  53. esp_err_t esp_hf_client_connect(esp_bd_addr_t remote_bda)
  54. {
  55. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  56. return ESP_ERR_INVALID_STATE;
  57. }
  58. bt_status_t stat;
  59. btc_hf_client_args_t arg;
  60. btc_msg_t msg;
  61. msg.sig = BTC_SIG_API_CALL;
  62. msg.pid = BTC_PID_HF_CLIENT;
  63. msg.act = BTC_HF_CLIENT_CONNECT_EVT;
  64. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  65. /* Switch to BTC context */
  66. memcpy(&(arg.connect), remote_bda, sizeof(bt_bdaddr_t));
  67. stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL, NULL);
  68. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  69. }
  70. esp_err_t esp_hf_client_disconnect(esp_bd_addr_t remote_bda)
  71. {
  72. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  73. return ESP_ERR_INVALID_STATE;
  74. }
  75. bt_status_t stat;
  76. btc_hf_client_args_t arg;
  77. btc_msg_t msg;
  78. msg.sig = BTC_SIG_API_CALL;
  79. msg.pid = BTC_PID_HF_CLIENT;
  80. msg.act = BTC_HF_CLIENT_DISCONNECT_EVT;
  81. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  82. /* Switch to BTC context */
  83. memcpy(&(arg.disconnect), remote_bda, sizeof(bt_bdaddr_t));
  84. stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL, NULL);
  85. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  86. }
  87. esp_err_t esp_hf_client_connect_audio(esp_bd_addr_t remote_bda)
  88. {
  89. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  90. return ESP_ERR_INVALID_STATE;
  91. }
  92. bt_status_t stat;
  93. btc_hf_client_args_t arg;
  94. btc_msg_t msg;
  95. msg.sig = BTC_SIG_API_CALL;
  96. msg.pid = BTC_PID_HF_CLIENT;
  97. msg.act = BTC_HF_CLIENT_CONNECT_AUDIO_EVT;
  98. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  99. /* Switch to BTC context */
  100. memcpy(&(arg.connect_audio), remote_bda, sizeof(bt_bdaddr_t));
  101. stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL, NULL);
  102. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  103. }
  104. esp_err_t esp_hf_client_disconnect_audio(esp_bd_addr_t remote_bda)
  105. {
  106. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  107. return ESP_ERR_INVALID_STATE;
  108. }
  109. bt_status_t stat;
  110. btc_hf_client_args_t arg;
  111. btc_msg_t msg;
  112. msg.sig = BTC_SIG_API_CALL;
  113. msg.pid = BTC_PID_HF_CLIENT;
  114. msg.act = BTC_HF_CLIENT_DISCONNECT_AUDIO_EVT;
  115. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  116. /* Switch to BTC context */
  117. memcpy(&(arg.disconnect_audio), remote_bda, sizeof(bt_bdaddr_t));
  118. stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL, NULL);
  119. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  120. }
  121. esp_err_t esp_hf_client_start_voice_recognition(void)
  122. {
  123. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  124. return ESP_ERR_INVALID_STATE;
  125. }
  126. btc_msg_t msg;
  127. msg.sig = BTC_SIG_API_CALL;
  128. msg.pid = BTC_PID_HF_CLIENT;
  129. msg.act = BTC_HF_CLIENT_START_VOICE_RECOGNITION_EVT;
  130. /* Switch to BTC context */
  131. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  132. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  133. }
  134. esp_err_t esp_hf_client_stop_voice_recognition(void)
  135. {
  136. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  137. return ESP_ERR_INVALID_STATE;
  138. }
  139. btc_msg_t msg;
  140. msg.sig = BTC_SIG_API_CALL;
  141. msg.pid = BTC_PID_HF_CLIENT;
  142. msg.act = BTC_HF_CLIENT_STOP_VOICE_RECOGNITION_EVT;
  143. /* Switch to BTC context */
  144. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  145. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  146. }
  147. esp_err_t esp_hf_client_volume_update(esp_hf_volume_control_target_t type, int volume)
  148. {
  149. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  150. return ESP_ERR_INVALID_STATE;
  151. }
  152. btc_msg_t msg;
  153. btc_hf_client_args_t arg;
  154. msg.sig = BTC_SIG_API_CALL;
  155. msg.pid = BTC_PID_HF_CLIENT;
  156. msg.act = BTC_HF_CLIENT_VOLUME_UPDATE_EVT;
  157. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  158. arg.volume_update.type = type;
  159. arg.volume_update.volume = volume;
  160. /* Switch to BTC context */
  161. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL, NULL);
  162. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  163. }
  164. esp_err_t esp_hf_client_dial(const char *number)
  165. {
  166. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  167. return ESP_ERR_INVALID_STATE;
  168. }
  169. btc_msg_t msg;
  170. btc_hf_client_args_t arg;
  171. if (number != NULL && strlen(number) > ESP_BT_HF_CLIENT_NUMBER_LEN) {
  172. return ESP_ERR_INVALID_ARG;
  173. }
  174. msg.sig = BTC_SIG_API_CALL;
  175. msg.pid = BTC_PID_HF_CLIENT;
  176. msg.act = BTC_HF_CLIENT_DIAL_EVT;
  177. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  178. if (number != NULL) {
  179. strcpy(arg.dial.number, number);
  180. } else {
  181. arg.dial.number[0] = '\0';
  182. }
  183. /* Switch to BTC context */
  184. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL, NULL);
  185. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  186. }
  187. esp_err_t esp_hf_client_dial_memory(int location)
  188. {
  189. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  190. return ESP_ERR_INVALID_STATE;
  191. }
  192. btc_msg_t msg;
  193. btc_hf_client_args_t arg;
  194. msg.sig = BTC_SIG_API_CALL;
  195. msg.pid = BTC_PID_HF_CLIENT;
  196. msg.act = BTC_HF_CLIENT_DIAL_MEMORY_EVT;
  197. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  198. arg.dial_memory.location = location;
  199. /* Switch to BTC context */
  200. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL, NULL);
  201. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  202. }
  203. esp_err_t esp_hf_client_send_chld_cmd(esp_hf_chld_type_t chld, int idx)
  204. {
  205. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  206. return ESP_ERR_INVALID_STATE;
  207. }
  208. btc_msg_t msg;
  209. btc_hf_client_args_t arg;
  210. msg.sig = BTC_SIG_API_CALL;
  211. msg.pid = BTC_PID_HF_CLIENT;
  212. msg.act = BTC_HF_CLIENT_SEND_CHLD_CMD_EVT;
  213. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  214. arg.chld.type = chld;
  215. arg.chld.idx = idx;
  216. /* Switch to BTC context */
  217. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL, NULL);
  218. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  219. }
  220. esp_err_t esp_hf_client_send_btrh_cmd(esp_hf_btrh_cmd_t btrh)
  221. {
  222. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  223. return ESP_ERR_INVALID_STATE;
  224. }
  225. btc_msg_t msg;
  226. btc_hf_client_args_t arg;
  227. msg.sig = BTC_SIG_API_CALL;
  228. msg.pid = BTC_PID_HF_CLIENT;
  229. msg.act = BTC_HF_CLIENT_SEND_BTRH_CMD_EVT;
  230. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  231. arg.btrh.cmd = btrh;
  232. /* Switch to BTC context */
  233. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL, NULL);
  234. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  235. }
  236. esp_err_t esp_hf_client_answer_call(void)
  237. {
  238. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  239. return ESP_ERR_INVALID_STATE;
  240. }
  241. btc_msg_t msg;
  242. msg.sig = BTC_SIG_API_CALL;
  243. msg.pid = BTC_PID_HF_CLIENT;
  244. msg.act = BTC_HF_CLIENT_ANSWER_CALL_EVT;
  245. /* Switch to BTC context */
  246. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  247. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  248. }
  249. esp_err_t esp_hf_client_reject_call(void)
  250. {
  251. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  252. return ESP_ERR_INVALID_STATE;
  253. }
  254. btc_msg_t msg;
  255. msg.sig = BTC_SIG_API_CALL;
  256. msg.pid = BTC_PID_HF_CLIENT;
  257. msg.act = BTC_HF_CLIENT_REJECT_CALL_EVT;
  258. /* Switch to BTC context */
  259. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  260. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  261. }
  262. esp_err_t esp_hf_client_query_current_calls(void)
  263. {
  264. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  265. return ESP_ERR_INVALID_STATE;
  266. }
  267. btc_msg_t msg;
  268. msg.sig = BTC_SIG_API_CALL;
  269. msg.pid = BTC_PID_HF_CLIENT;
  270. msg.act = BTC_HF_CLIENT_QUERY_CURRENT_CALLS_EVT;
  271. /* Switch to BTC context */
  272. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  273. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  274. }
  275. esp_err_t esp_hf_client_query_current_operator_name(void)
  276. {
  277. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  278. return ESP_ERR_INVALID_STATE;
  279. }
  280. btc_msg_t msg;
  281. msg.sig = BTC_SIG_API_CALL;
  282. msg.pid = BTC_PID_HF_CLIENT;
  283. msg.act = BTC_HF_CLIENT_QUERY_CURRENT_OPERATOR_NAME_EVT;
  284. /* Switch to BTC context */
  285. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  286. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  287. }
  288. esp_err_t esp_hf_client_retrieve_subscriber_info(void)
  289. {
  290. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  291. return ESP_ERR_INVALID_STATE;
  292. }
  293. btc_msg_t msg;
  294. msg.sig = BTC_SIG_API_CALL;
  295. msg.pid = BTC_PID_HF_CLIENT;
  296. msg.act = BTC_HF_CLIENT_RETRIEVE_SUBSCRIBER_INFO_EVT;
  297. /* Switch to BTC context */
  298. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  299. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  300. }
  301. esp_err_t esp_hf_client_send_dtmf(char code)
  302. {
  303. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  304. return ESP_ERR_INVALID_STATE;
  305. }
  306. btc_msg_t msg;
  307. btc_hf_client_args_t arg;
  308. msg.sig = BTC_SIG_API_CALL;
  309. msg.pid = BTC_PID_HF_CLIENT;
  310. msg.act = BTC_HF_CLIENT_SEND_DTMF_EVT;
  311. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  312. arg.send_dtmf.code = code;
  313. /* Switch to BTC context */
  314. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL, NULL);
  315. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  316. }
  317. esp_err_t esp_hf_client_send_xapl(char *information, uint32_t features)
  318. {
  319. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  320. return ESP_ERR_INVALID_STATE;
  321. }
  322. if (information == NULL || strlen(information) != ESP_BT_HF_AT_SEND_XAPL_LEN) {
  323. return ESP_ERR_INVALID_ARG;
  324. }
  325. btc_msg_t msg;
  326. btc_hf_client_args_t arg;
  327. msg.sig = BTC_SIG_API_CALL;
  328. msg.pid = BTC_PID_HF_CLIENT;
  329. msg.act = BTC_HF_CLIENT_SEND_XAPL_EVT;
  330. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  331. strcpy(arg.send_xapl.information, information);
  332. arg.send_xapl.features = features;
  333. /* Switch to BTC context */
  334. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL, NULL);
  335. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  336. }
  337. esp_err_t esp_hf_client_send_iphoneaccev(uint32_t bat_level, bool docked)
  338. {
  339. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  340. return ESP_ERR_INVALID_STATE;
  341. }
  342. if (bat_level > 9) {
  343. return ESP_ERR_INVALID_ARG;
  344. }
  345. btc_msg_t msg;
  346. btc_hf_client_args_t arg;
  347. msg.sig = BTC_SIG_API_CALL;
  348. msg.pid = BTC_PID_HF_CLIENT;
  349. msg.act = BTC_HF_CLIENT_SEND_IPHONEACCEV_EVT;
  350. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  351. arg.send_iphoneaccev.bat_level = bat_level;
  352. arg.send_iphoneaccev.docked = docked;
  353. /* Switch to BTC context */
  354. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL, NULL);
  355. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  356. }
  357. esp_err_t esp_hf_client_request_last_voice_tag_number(void)
  358. {
  359. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  360. return ESP_ERR_INVALID_STATE;
  361. }
  362. btc_msg_t msg;
  363. msg.sig = BTC_SIG_API_CALL;
  364. msg.pid = BTC_PID_HF_CLIENT;
  365. msg.act = BTC_HF_CLIENT_REQUEST_LAST_VOICE_TAG_NUMBER_EVT;
  366. /* Switch to BTC context */
  367. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  368. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  369. }
  370. esp_err_t esp_hf_client_send_nrec(void)
  371. {
  372. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  373. return ESP_ERR_INVALID_STATE;
  374. }
  375. btc_msg_t msg;
  376. msg.sig = BTC_SIG_API_CALL;
  377. msg.pid = BTC_PID_HF_CLIENT;
  378. msg.act = BTC_HF_CLIENT_SEND_NREC_EVT;
  379. /* Switch to BTC context */
  380. bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
  381. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  382. }
  383. esp_err_t esp_hf_client_register_data_callback(esp_hf_client_incoming_data_cb_t recv,
  384. esp_hf_client_outgoing_data_cb_t send)
  385. {
  386. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  387. return ESP_ERR_INVALID_STATE;
  388. }
  389. btc_msg_t msg;
  390. msg.sig = BTC_SIG_API_CALL;
  391. msg.pid = BTC_PID_HF_CLIENT;
  392. msg.act = BTC_HF_CLIENT_REGISTER_DATA_CALLBACK_EVT;
  393. btc_hf_client_args_t arg;
  394. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  395. arg.reg_data_cb.recv = recv;
  396. arg.reg_data_cb.send = send;
  397. /* Switch to BTC context */
  398. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL, NULL);
  399. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  400. }
  401. #if (BTM_SCO_HCI_INCLUDED == TRUE)
  402. esp_err_t esp_hf_client_pkt_stat_nums_get(uint16_t sync_conn_handle)
  403. {
  404. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  405. return ESP_ERR_INVALID_STATE;
  406. }
  407. btc_msg_t msg;
  408. msg.sig = BTC_SIG_API_CALL;
  409. msg.pid = BTC_PID_HF_CLIENT;
  410. msg.act = BTC_HF_CLIENT_REQUEST_PKT_STAT_EVT;
  411. btc_hf_client_args_t arg;
  412. memset(&arg, 0, sizeof(btc_hf_client_args_t));
  413. arg.pkt_sync_hd.sync_conn_handle = sync_conn_handle;
  414. /* Switch to BTC context */
  415. bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hf_client_args_t), NULL, NULL);
  416. return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
  417. }
  418. void esp_hf_client_outgoing_data_ready(void)
  419. {
  420. BTA_HfClientCiData();
  421. }
  422. void esp_hf_client_pcm_resample_init(uint32_t src_sps, uint32_t bits, uint32_t channels)
  423. {
  424. BTA_DmPcmInitSamples(src_sps, bits, channels);
  425. }
  426. void esp_hf_client_pcm_resample_deinit(void)
  427. {
  428. BTA_DmPcmDeinitSamples();
  429. }
  430. int32_t esp_hf_client_pcm_resample(void *src, uint32_t in_bytes, void *dst)
  431. {
  432. return BTA_DmPcmResample(src, in_bytes, dst);
  433. }
  434. #endif /* #if (BTM_SCO_HCI_INCLUDED == TRUE) */
  435. #endif /* BTC_HF_CLIENT_INCLUDED */