luat_audio.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. /*
  2. * Copyright (c) 2022 OpenLuat & AirM2M
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy of
  5. * this software and associated documentation files (the "Software"), to deal in
  6. * the Software without restriction, including without limitation the rights to
  7. * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  8. * the Software, and to permit persons to whom the Software is furnished to do so,
  9. * subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in all
  12. * copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  16. * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  17. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  18. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  19. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  20. */
  21. #ifndef __LUAT_AUDIO_H__
  22. #define __LUAT_AUDIO_H__
  23. #include "luat_base.h"
  24. #include "luat_rtos.h"
  25. #include"luat_audio_codec.h"
  26. #include"luat_multimedia_codec.h"
  27. #ifndef __BSP_COMMON_H__
  28. #include "c_common.h"
  29. #endif
  30. typedef struct luat_audio_conf {
  31. luat_multimedia_codec_t multimedia_codec;
  32. uint64_t last_wakeup_time_ms;
  33. luat_audio_codec_conf_t codec_conf;
  34. void *hardware_data;
  35. luat_rtos_timer_t pa_delay_timer;
  36. uint32_t after_sleep_ready_time; //
  37. uint16_t pa_delay_time;
  38. uint16_t power_off_delay_time; // 电源关闭后延时时间
  39. uint16_t soft_vol;
  40. uint16_t speech_downlink_type;
  41. uint16_t speech_uplink_type;
  42. uint16_t last_vol;
  43. uint16_t last_mic_vol;
  44. uint8_t bus_type;
  45. uint8_t raw_mode;
  46. uint8_t debug_on_off;
  47. uint8_t sleep_mode;
  48. uint8_t wakeup_ready;
  49. uint8_t pa_on_enable;
  50. uint8_t record_mode;
  51. uint8_t pa_pin; // pa pin
  52. uint8_t pa_on_level; // pa 使能电平
  53. uint8_t power_pin; // 电源控制
  54. uint8_t power_on_level; // 电源使能电平
  55. uint8_t pa_is_control_enable;
  56. uint8_t voltage;
  57. } luat_audio_conf_t;
  58. typedef enum{
  59. LUAT_AUDIO_PM_RESUME = 0, /* 工作模式 */
  60. LUAT_AUDIO_PM_STANDBY, /* 待机模式 */
  61. LUAT_AUDIO_PM_SHUTDOWN, /* 关断模式 */
  62. LUAT_AUDIO_PM_POWER_OFF, /* 完全断电模式 */
  63. }luat_audio_pm_mode_t;
  64. typedef enum{
  65. LUAT_AUDIO_VOLTAGE_3300 = 0, /* 工作在3.3V */
  66. LUAT_AUDIO_VOLTAGE_1800, /* 工作在1.8V */
  67. }luat_audio_voltage_t;
  68. typedef enum{
  69. LUAT_RECORD_MONO = 1, /* 工作在3.3V */
  70. LUAT_RECORD_STEREO = 2, /* 工作在1.8V */
  71. }luat_record_channel_t;
  72. typedef enum{
  73. LUAT_AUDIO_BUS_DAC=0,
  74. LUAT_AUDIO_BUS_I2S,
  75. LUAT_AUDIO_BUS_SOFT_DAC
  76. }luat_audio_bus_type_t;
  77. #ifdef LUAT_USE_RECORD
  78. #include "luat_i2s.h"
  79. typedef struct{
  80. // luat_rtos_task_handle task_handle;
  81. FILE* fd;
  82. uint32_t record_time;
  83. uint32_t record_time_tmp;
  84. void* encoder_handler;
  85. luat_zbuff_t * record_buffer[2];
  86. uint32_t bak_sample_rate; // i2s采样率
  87. uint32_t bak_cb_rx_len; // 接收触发回调数据长度
  88. int (*bak_luat_i2s_event_callback)(uint8_t id ,luat_i2s_event_t event, uint8_t *rx_data, uint32_t rx_len, void *param); // i2s回调函数
  89. uint32_t type; // LUAT_MULTIMEDIA_DATA_TYPE 或者具体采样率
  90. uint32_t record_callback_level;
  91. uint8_t bak_is_full_duplex; // 是否全双工
  92. uint8_t record_buffer_index;
  93. uint8_t multimedia_id;
  94. uint8_t quailty;
  95. uint8_t is_run;
  96. luat_record_channel_t channelCnt;
  97. }luat_record_ctrl_t;
  98. #endif
  99. /**
  100. * @brief 设置音频硬件输出类型,后续初始化都会根据类型做不同处理,所以要首先使用此函数设置类型!!!
  101. *
  102. * @param bus_type 见MULTIMEDIA_AUDIO_BUS,目前只有0=DAC 1=I2S 2=SOFT_DAC
  103. */
  104. int luat_audio_set_bus_type(uint8_t multimedia_id,uint8_t bus_type);
  105. //此函数可获取multimedia_id对应的audio结构体,用于动态修改,如果有无法直接设置的函数可自行通过此方法修改结构体,一般不需要使用此函数
  106. luat_audio_conf_t *luat_audio_get_config(uint8_t multimedia_id);
  107. /**
  108. * @brief audio和codec绑定
  109. *
  110. * @param multimedia_id 多媒体通道,目前只有0
  111. * @param codec_conf codec信息
  112. * @return int =0成功,其他失败
  113. */
  114. int luat_audio_setup_codec(uint8_t multimedia_id, const luat_audio_codec_conf_t *codec_conf);
  115. /**
  116. * @brief 初始化audio
  117. *
  118. * @param multimedia_id 多媒体通道,目前只有0
  119. * @param init_vol 默认硬件音量
  120. * @param init_mic_vol 默认MIC音量
  121. * @return int =0成功,其他失败
  122. */
  123. int luat_audio_init(uint8_t multimedia_id, uint16_t init_vol, uint16_t init_mic_vol);
  124. /**
  125. * @brief audio休眠控制,注意,pm各个模式下功耗由具体audio硬件决定
  126. *
  127. * @param multimedia_id 多媒体通道
  128. * @param mode
  129. * @return int =0成功,其他失败
  130. */
  131. int luat_audio_pm_request(uint8_t multimedia_id,luat_audio_pm_mode_t mode);
  132. /**
  133. * @brief 播放空白音,一般不需要主动调用
  134. *
  135. * @param multimedia_id 多媒体通道
  136. * @param on_off 1打开空白,0关闭
  137. * @return int =0成功,其他失败
  138. */
  139. int luat_audio_play_blank(uint8_t multimedia_id, uint8_t on_off);
  140. #ifdef __LUATOS__
  141. /**
  142. * @brief 播放指定数量的文件或者ROM数组(文件数据直接写成数组形式)
  143. *
  144. * @param multimedia_id 多媒体通道,目前只有0
  145. * @param info 文件信息,文件路径信息
  146. * @param files_num 文件数量
  147. * @return int =0成功,其他失败
  148. */
  149. int luat_audio_play_multi_files(uint8_t multimedia_id, uData_t *info, uint32_t files_num, uint8_t error_stop);
  150. #endif
  151. /**
  152. * @brief 播放指定的文件或
  153. *
  154. * @param multimedia_id 多媒体通道,目前只有0
  155. * @param path 文件路径
  156. * @return int =0成功,其他失败
  157. */
  158. int luat_audio_play_file(uint8_t multimedia_id, const char *path);
  159. /**
  160. * @brief 是否播放完全部数据
  161. *
  162. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  163. * @return uint8_t =1是,=0没有
  164. */
  165. uint8_t luat_audio_is_finish(uint8_t multimedia_id);
  166. /**
  167. * @brief 强制停止播放文件,但是不会停止已经输出到底层驱动的数据播放
  168. *
  169. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  170. * @return int =0成功,其他失败
  171. */
  172. int luat_audio_play_stop(uint8_t multimedia_id);
  173. /**
  174. * @brief 获取上一次播放结果,在MULTIMEDIA_CB_AUDIO_DONE回调时调用最佳
  175. *
  176. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  177. * @return int =0完整的播放完成,<0被用户停止了,>0 TTS失败,或者第几个音频文件解码失败(用户在play_info未设置了解码失败后继续,文件位置+1)
  178. */
  179. int luat_audio_play_get_last_error(uint8_t multimedia_id);
  180. /**
  181. * @brief 立刻初始化播放未编码的原始音频数据流
  182. *
  183. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  184. * @param audio_format 音频数据格式,目前只支持PCM,即需要手动解码
  185. * @param num_channels 声道数,目前只能1或2
  186. * @param sample_rate 采样率,注意只有8K,16K,32K,48K,96K,22.05K,44.1K这些能被支持
  187. * @param bits_per_sample 量化bit,只能是16
  188. * @param is_signed 量化数据是否带符号,只能是1
  189. * @return int =0成功,其他失败
  190. */
  191. int luat_audio_start_raw(uint8_t multimedia_id, uint8_t audio_format, uint8_t num_channels, uint32_t sample_rate, uint8_t bits_per_sample, uint8_t is_signed);
  192. /**
  193. * @brief 向底层驱动传入一段原始音频数据
  194. *
  195. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  196. * @param data 原始音频数据
  197. * @param len 原始音频数据长度
  198. * @return int =0成功,其他失败
  199. */
  200. int luat_audio_write_raw(uint8_t multimedia_id, uint8_t *data, uint32_t len);
  201. /**
  202. * @brief 强制停止所有播放,同时底层驱动也会停止输出,不要用于播放文件的结束
  203. *
  204. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  205. * @return int =0成功,其他失败
  206. */
  207. int luat_audio_stop_raw(uint8_t multimedia_id);
  208. /**
  209. * @brief 暂停/恢复播放
  210. *
  211. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  212. * @param is_pause 0恢复,其他暂停
  213. * @return int =0成功,其他失败
  214. */
  215. int luat_audio_pause_raw(uint8_t multimedia_id, uint8_t is_pause);
  216. /**
  217. * @brief 编码并播放一段文字
  218. *
  219. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  220. * @param text 文字数据
  221. * @param text_bytes 文字数据长度
  222. * @return int =0成功,其他失败
  223. */
  224. int luat_audio_play_tts_text(uint8_t multimedia_id, void *text, uint32_t text_bytes);
  225. /**
  226. * @brief 在收到MULTIMEDIA_CB_TTS_INIT回调时,可以设置TTS参数,等同于ivTTS_SetParam
  227. *
  228. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  229. * @param param_id 见ivTTS_PARAM_XXX
  230. * @param param_value param_id对应的value
  231. * @return int =0成功,其他失败
  232. */
  233. int luat_audio_play_tts_set_param(uint8_t multimedia_id, uint32_t param_id, uint32_t param_value);
  234. /**
  235. * @brief pa引脚配置
  236. *
  237. * @param multimedia_id multimedia_id 多媒体通道
  238. * @param pin pa pin
  239. * @param level pa使能电平
  240. * @param dummy_time_len
  241. * @param pa_delay_time
  242. */
  243. void luat_audio_config_pa(uint8_t multimedia_id, uint32_t pin, int level, uint32_t dummy_time_len, uint32_t pa_delay_time);
  244. /**
  245. * @brief power引脚配置
  246. *
  247. * @param multimedia_id 多媒体通道
  248. * @param pin power pin
  249. * @param level 使能电平
  250. * @param dac_off_delay_time
  251. */
  252. void luat_audio_config_dac(uint8_t multimedia_id, int pin, int level, uint32_t dac_off_delay_time);
  253. /**
  254. * @brief 音量控制
  255. *
  256. * @param multimedia_id 多媒体通道
  257. * @param vol 音量,0-1000 0-100为硬件 100-1000为软件缩放,实际根据不同bsp不同硬件底层实现
  258. * @return uint16_t 音量,0-1000
  259. */
  260. uint16_t luat_audio_vol(uint8_t multimedia_id, uint16_t vol);
  261. /**
  262. * @brief mic音量控制
  263. *
  264. * @param multimedia_id 多媒体通道
  265. * @param vol 音量,0-100
  266. * @return uint8_t 音量 0-100
  267. */
  268. uint8_t luat_audio_mic_vol(uint8_t multimedia_id, uint16_t vol);
  269. /**
  270. * @brief 静音
  271. *
  272. * @param multimedia_id 多媒体通道
  273. * @param on 1 静音,0 取消静音
  274. * @return uint8_t 1 静音,0 取消静音
  275. */
  276. uint8_t luat_audio_mute(uint8_t multimedia_id, uint8_t on);
  277. /**
  278. * @brief 音频调试开关
  279. *
  280. * @param multimedia_id 多媒体通道
  281. * @param onoff 0关闭,1打开
  282. */
  283. void luat_audio_play_debug_onoff(uint8_t multimedia_id, uint8_t onoff);
  284. /**
  285. * @brief 检测音频是否准备就绪
  286. *
  287. * @param multimedia_id 多媒体通道
  288. * @return int -1未就绪,0就绪
  289. */
  290. int luat_audio_check_ready(uint8_t multimedia_id);
  291. /**
  292. * @brief 录音并播放
  293. *
  294. * @param multimedia_id 多媒体通道
  295. * @param sample_rate 采样率
  296. * @param play_buffer buffer
  297. * @param one_trunk_len 一次传输长度
  298. * @param total_trunk_cnt 传输次数
  299. * @return int 成功返回0,失败返回-1
  300. */
  301. int luat_audio_record_and_play(uint8_t multimedia_id, uint32_t sample_rate, const uint8_t *play_buffer, uint32_t one_trunk_len, uint32_t total_trunk_cnt);
  302. /**
  303. * @brief 录音停止
  304. *
  305. * @param multimedia_id 多媒体通道
  306. * @return int 成功返回0,失败返回-1
  307. */
  308. int luat_audio_record_stop(uint8_t multimedia_id);
  309. /**
  310. * @brief 开始通话输出
  311. *
  312. * @param multimedia_id 多媒体通道
  313. * @param is_downlink 通话是否连接
  314. * @param type 类型
  315. * @param downlink_buffer buffer
  316. * @param buffer_len buffer 长度
  317. * @param channel_num 通道
  318. * @return int 成功返回0,失败返回-1
  319. */
  320. int luat_audio_speech(uint8_t multimedia_id, uint8_t is_downlink, uint8_t type, const uint8_t *downlink_buffer, uint32_t buffer_len, uint8_t channel_num);
  321. /**
  322. * @brief 通话输出停止
  323. *
  324. * @param multimedia_id 多媒体通道
  325. * @return int 成功返回0,失败返回-1
  326. */
  327. int luat_audio_speech_stop(uint8_t multimedia_id);
  328. /**
  329. * @brief pa控制函数,一般不需要使用,底层会自动调用
  330. *
  331. * @param multimedia_id multimedia_id 多媒体通道
  332. * @param on 1开,0关
  333. * @param delay 延迟时间,非阻塞,不延迟写0
  334. */
  335. void luat_audio_pa(uint8_t multimedia_id,uint8_t on, uint32_t delay);
  336. /**
  337. * @brief power控制函数,一般不需要使用,底层会自动调用
  338. *
  339. * @param multimedia_id 多媒体通道
  340. * @param on 1开,0关
  341. */
  342. void luat_audio_power(uint8_t multimedia_id,uint8_t on);
  343. /**
  344. * @brief power保持控制,部分平台休眠时部分GPIO断电,因此需要控制是否进入休眠来
  345. *
  346. * @param on_off 1保持,0不保持
  347. */
  348. void luat_audio_power_keep_ctrl_by_bsp(uint8_t on_off);
  349. /**
  350. * @brief 把api投放到audio task运行
  351. *
  352. * @param api 需要运行的api
  353. * @param data api输入数据
  354. * @param len api输入数据长度
  355. */
  356. void luat_audio_run_callback_in_task(void *api, uint8_t *data, uint32_t len);
  357. typedef void (*luat_audio_record_callback)(uint8_t multimedia_id, uint8_t *rx_data, uint32_t rx_len, void *param); // 非i2s录音回调函数
  358. void luat_audio_setup_record_callback(uint8_t multimedia_id, luat_audio_record_callback callback, void *param);
  359. void *luat_audio_inter_amr_coder_init(uint8_t is_wb, uint8_t quality);
  360. int luat_audio_inter_amr_coder_encode(void *handle, const uint16_t *pcm_buf, uint8_t *amr_buf, uint8_t *amr_len);
  361. int luat_audio_inter_amr_coder_decode(void *handle, uint16_t *pcm_buf, const uint8_t *amr_buf, uint8_t *amr_len);
  362. void luat_audio_inter_amr_coder_deinit(void *handle);
  363. #endif