wm_audio_sink.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. /*****************************************************************************
  2. **
  3. ** Name: wm_audio_sink.c
  4. **
  5. ** Description: This file contains the sample functions for bluetooth audio sink application
  6. **
  7. *****************************************************************************/
  8. #include <string.h>
  9. #include <stdint.h>
  10. #include <stdbool.h>
  11. #include <assert.h>
  12. #include "wm_bt_config.h"
  13. #if (WM_BTA_AV_SINK_INCLUDED == CFG_ON)
  14. #include "wm_bt_av.h"
  15. #include "wm_audio_sink.h"
  16. #include "wm_bt_util.h"
  17. #if (WM_AUDIO_BOARD_INCLUDED == CFG_ON)
  18. #include "audio.h"
  19. #endif
  20. static uint16_t g_sample_rate = 44100;
  21. static uint8_t g_bit_width = 16;
  22. static uint8_t g_chan_count = 2;
  23. static uint8_t g_playing_state = 0;
  24. /**This function is the pcm output function, type is 0(PCM)*/
  25. #if (WM_AUDIO_BOARD_INCLUDED == CFG_ON)
  26. static uint32_t Stereo2Mono(void *audio_buf, uint32_t len, int LR)
  27. {
  28. if (!audio_buf || !len || len % 4) {
  29. printf( "%s arg err\n", __func__);
  30. return 0;
  31. }
  32. int16_t *buf = audio_buf;
  33. uint32_t i = 0;
  34. LR = LR ? 1 : 0;
  35. for (i = 0; i < len / 4; i++) {
  36. buf[i] = buf[i * 2 + LR];
  37. }
  38. return len / 2;
  39. }
  40. int btif_co_avk_data_incoming(uint8_t type, uint8_t *p_data,uint16_t length)
  41. {
  42. uint16_t fif0_len = 0;
  43. Stereo2Mono(p_data, length, 1);
  44. fif0_len = FifoSpaceLen();
  45. if(fif0_len < length/2)
  46. {
  47. printf("overwritten, fifo_space(%d), write to len(%d)\r\n", fif0_len, length/2);
  48. }
  49. FifoWrite(p_data, length/2);
  50. if(g_playing_state)
  51. {
  52. if(FifoDataLen()>4*1024)
  53. {
  54. PlayStart(g_sample_rate, g_bit_width, g_chan_count);
  55. g_playing_state = 0;
  56. }
  57. }
  58. }
  59. #else
  60. int btif_co_avk_data_incoming(uint8_t type, uint8_t *p_data,uint16_t length)
  61. {
  62. }
  63. #endif
  64. static void bta2dp_connection_state_callback(tls_btav_connection_state_t state, tls_bt_addr_t *bd_addr)
  65. {
  66. switch(state)
  67. {
  68. case WM_BTAV_CONNECTION_STATE_DISCONNECTED:
  69. TLS_BT_APPL_TRACE_DEBUG("BTAV_CONNECTION_STATE_DISCONNECTED\r\n");
  70. //sbc_ABV_buffer_reset();
  71. break;
  72. case WM_BTAV_CONNECTION_STATE_CONNECTING:
  73. TLS_BT_APPL_TRACE_DEBUG("BTAV_CONNECTION_STATE_CONNECTING\r\n");
  74. break;
  75. case WM_BTAV_CONNECTION_STATE_CONNECTED:
  76. TLS_BT_APPL_TRACE_DEBUG("BTAV_CONNECTION_STATE_CONNECTED\r\n");
  77. break;
  78. case WM_BTAV_CONNECTION_STATE_DISCONNECTING:
  79. TLS_BT_APPL_TRACE_DEBUG("BTAV_CONNECTION_STATE_DISCONNECTING\r\n");
  80. break;
  81. default:
  82. TLS_BT_APPL_TRACE_DEBUG("UNKNOWN BTAV_AUDIO_STATE...\r\n");
  83. }
  84. }
  85. static void bta2dp_audio_state_callback(tls_btav_audio_state_t state, tls_bt_addr_t *bd_addr)
  86. {
  87. switch(state)
  88. {
  89. case WM_BTAV_AUDIO_STATE_STARTED:
  90. TLS_BT_APPL_TRACE_DEBUG("BTAV_AUDIO_STATE_STARTED\r\n");
  91. //sbc_ABV_buffer_reset();
  92. //VolumeControl(16);
  93. //PlayStart(g_sample_rate, g_bit_width);
  94. g_playing_state = 1;
  95. break;
  96. case WM_BTAV_AUDIO_STATE_STOPPED:
  97. TLS_BT_APPL_TRACE_DEBUG("BTAV_AUDIO_STATE_STOPPED\r\n");
  98. #if (WM_AUDIO_BOARD_INCLUDED == CFG_ON)
  99. PlayStop();
  100. #endif
  101. break;
  102. case WM_BTAV_AUDIO_STATE_REMOTE_SUSPEND:
  103. TLS_BT_APPL_TRACE_DEBUG("BTAV_AUDIO_STATE_REMOTE_SUSPEND\r\n");
  104. #if (WM_AUDIO_BOARD_INCLUDED == CFG_ON)
  105. PlayStop();
  106. #endif
  107. break;
  108. default:
  109. TLS_BT_APPL_TRACE_DEBUG("UNKNOWN BTAV_AUDIO_STATE...\r\n");
  110. }
  111. }
  112. static void bta2dp_audio_config_callback(tls_bt_addr_t *bd_addr, uint32_t sample_rate, uint8_t channel_count)
  113. {
  114. TLS_BT_APPL_TRACE_DEBUG("CBACK:%02x:%02x:%02x:%02x:%02x:%02x::sample_rate=%d, channel_count=%d\r\n",
  115. bd_addr->address[0], bd_addr->address[1], bd_addr->address[2], bd_addr->address[3], bd_addr->address[4], bd_addr->address[5], sample_rate, channel_count);
  116. g_sample_rate = sample_rate;
  117. }
  118. static void bta2dp_audio_payload_callback(tls_bt_addr_t *bd_addr, uint8_t format, uint8_t *p_data, uint16_t length)
  119. {
  120. //TLS_BT_APPL_TRACE_DEBUG("CBACK(%s): length=%d\r\n", __FUNCTION__, length);
  121. }
  122. static void btavrcp_remote_features_callback(tls_bt_addr_t *bd_addr, tls_btrc_remote_features_t features)
  123. {
  124. TLS_BT_APPL_TRACE_DEBUG("CBACK(%s): features:%d\r\n", __FUNCTION__, features);
  125. }
  126. static void btavrcp_get_play_status_callback()
  127. {
  128. TLS_BT_APPL_TRACE_DEBUG("CBACK(%s): \r\n", __FUNCTION__);
  129. }
  130. static void btavrcp_get_element_attr_callback(uint8_t num_attr, tls_btrc_media_attr_t *p_attrs)
  131. {
  132. TLS_BT_APPL_TRACE_DEBUG("CBACK(%s): num_attr:%d, param:%d\r\n", __FUNCTION__, num_attr);
  133. }
  134. static void btavrcp_register_notification_callback(tls_btrc_event_id_t event_id, uint32_t param)
  135. {
  136. TLS_BT_APPL_TRACE_DEBUG("CBACK(%s): event_id:%d, param:%d\r\n", __FUNCTION__, event_id, param);
  137. }
  138. static void btavrcp_volume_change_callback(uint8_t volume, uint8_t ctype)
  139. {
  140. TLS_BT_APPL_TRACE_DEBUG("CBACK: volume:%d, type:%d\r\n", volume, ctype);
  141. }
  142. static void btavrcp_passthrough_command_callback(int id, int pressed)
  143. {
  144. TLS_BT_APPL_TRACE_DEBUG("CBACK(%s): id:%d, pressed:%d\r\n", __FUNCTION__, id, pressed);
  145. }
  146. static void btavrcp_passthrough_response_callback(int id, int pressed)
  147. {
  148. }
  149. static void btavrcp_connection_state_callback(bool state, tls_bt_addr_t *bd_addr)
  150. {
  151. TLS_BT_APPL_TRACE_DEBUG("CBACK:%02x:%02x:%02x:%02x:%02x:%02x::state:%d\r\n",
  152. bd_addr->address[0], bd_addr->address[1], bd_addr->address[2], bd_addr->address[3], bd_addr->address[4], bd_addr->address[5], state);
  153. }
  154. static void wm_a2dp_sink_callback(tls_bt_av_evt_t evt, tls_bt_av_msg_t *msg)
  155. {
  156. switch(evt)
  157. {
  158. case WMBT_A2DP_CONNECTION_STATE_EVT:
  159. bta2dp_connection_state_callback(msg->av_connection_state.stat, msg->av_connection_state.bd_addr);
  160. break;
  161. case WMBT_A2DP_AUDIO_STATE_EVT:
  162. bta2dp_audio_state_callback(msg->av_audio_state.stat, msg->av_audio_state.bd_addr);
  163. break;
  164. case WMBT_A2DP_AUDIO_CONFIG_EVT:
  165. bta2dp_audio_config_callback(msg->av_audio_config.bd_addr, msg->av_audio_config.sample_rate, msg->av_audio_config.channel_count);
  166. break;
  167. case WMBT_A2DP_AUDIO_PAYLOAD_EVT:
  168. bta2dp_audio_payload_callback(msg->av_audio_payload.bd_addr,msg->av_audio_payload.audio_format,msg->av_audio_payload.payload, msg->av_audio_payload.payload_length);
  169. break;
  170. }
  171. }
  172. static void wm_btrc_callback(tls_btrc_evt_t evt, tls_btrc_msg_t *msg)
  173. {
  174. switch(evt)
  175. {
  176. case WM_BTRC_REMOTE_FEATURE_EVT:
  177. btavrcp_remote_features_callback(msg->remote_features.bd_addr, msg->remote_features.features);
  178. break;
  179. case WM_BTRC_GET_PLAY_STATUS_EVT:
  180. btavrcp_get_play_status_callback();
  181. break;
  182. case WM_BTRC_GET_ELEMENT_ATTR_EVT:
  183. btavrcp_get_element_attr_callback(msg->get_element_attr.num_attr, msg->get_element_attr.p_attrs);
  184. break;
  185. case WM_BTRC_REGISTER_NOTIFICATION_EVT:
  186. btavrcp_register_notification_callback(msg->register_notification.event_id, msg->register_notification.param);
  187. break;
  188. case WM_BTRC_VOLUME_CHANGED_EVT:
  189. btavrcp_volume_change_callback(msg->volume_change.ctype, msg->volume_change.volume);
  190. break;
  191. case WM_BTRC_PASSTHROUGH_CMD_EVT:
  192. btavrcp_passthrough_command_callback(msg->passthrough_cmd.id, msg->passthrough_cmd.key_state);
  193. break;
  194. default:
  195. TLS_BT_APPL_TRACE_VERBOSE("unhandled wm_btrc_callback, evt=%d\r\n", evt);
  196. break;
  197. }
  198. }
  199. static void wm_btrc_ctrl_callback(tls_btrc_ctrl_evt_t evt, tls_btrc_ctrl_msg_t *msg)
  200. {
  201. switch(evt)
  202. {
  203. case WM_BTRC_PASSTHROUGH_CMD_EVT:
  204. btavrcp_passthrough_response_callback(msg->passthrough_rsp.id, msg->passthrough_rsp.key_state);
  205. break;
  206. default:
  207. TLS_BT_APPL_TRACE_VERBOSE("unhandled wm_btrc_ctrl_callback, evt=%d\r\n", evt);
  208. break;
  209. }
  210. }
  211. tls_bt_status_t tls_bt_enable_a2dp_sink()
  212. {
  213. tls_bt_status_t status;
  214. status = tls_bt_av_sink_init(wm_a2dp_sink_callback);
  215. if(status != TLS_BT_STATUS_SUCCESS)
  216. {
  217. TLS_BT_APPL_TRACE_ERROR("tls_bt_av_sink_init failed, status=%d\r\n", status);
  218. return status;
  219. }
  220. status = tls_btrc_init(wm_btrc_callback);
  221. if(status != TLS_BT_STATUS_SUCCESS)
  222. {
  223. TLS_BT_APPL_TRACE_ERROR("tls_btrc_init failed, status=%d\r\n", status);
  224. tls_bt_av_sink_deinit();
  225. return status;
  226. }
  227. status = tls_btrc_ctrl_init(wm_btrc_ctrl_callback);
  228. if(status != TLS_BT_STATUS_SUCCESS)
  229. {
  230. TLS_BT_APPL_TRACE_ERROR("tls_btrc_init failed, status=%d\r\n", status);
  231. tls_bt_av_sink_deinit();
  232. tls_btrc_deinit();
  233. return status;
  234. }
  235. #if (WM_AUDIO_BOARD_INCLUDED == CFG_ON)
  236. AudioInit(12*1024);
  237. #endif
  238. return status;
  239. }
  240. tls_bt_status_t tls_bt_disable_a2dp_sink()
  241. {
  242. tls_bt_av_sink_deinit();
  243. tls_btrc_deinit();
  244. tls_btrc_ctrl_deinit();
  245. return TLS_BT_STATUS_SUCCESS;
  246. }
  247. #endif