luat_audio.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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. #ifndef __BSP_COMMON_H__
  25. #include "c_common.h"
  26. #endif
  27. #include "luat_rtos.h"
  28. #include"luat_audio_codec.h"
  29. typedef struct luat_audio_conf {
  30. uint64_t last_wakeup_time_ms;
  31. luat_audio_codec_conf_t codec_conf;
  32. void *hardware_data;
  33. luat_rtos_timer_t pa_delay_timer;
  34. uint16_t soft_vol;
  35. uint16_t hardware_vol;
  36. uint8_t bus_type;
  37. uint8_t raw_mode;
  38. uint8_t debug_on_off;
  39. uint8_t is_sleep;
  40. uint8_t wakeup_ready;
  41. uint8_t pa_on_enable;
  42. } luat_audio_conf_t;
  43. /**
  44. * @brief audio和codec绑定
  45. *
  46. * @param multimedia_id 多媒体通道,目前只有0,在绑定前,需要先设置好codec的相关信息
  47. * @param codec_conf codec信息
  48. * @return int =0成功,其他失败
  49. */
  50. int luat_audio_setup_codec(uint8_t multimedia_id, const luat_audio_codec_conf_t *codec_conf);
  51. /**
  52. * @brief 初始化codec
  53. *
  54. * @param multimedia_id 多媒体通道,目前只有0
  55. * @param init_vol 默认硬件音量,如果不带调节功能的codec,则忽略
  56. * @param init_mic_vol 默认MIC音量,如果不带调节功能的codec,则忽略
  57. * @return int =0成功,其他失败
  58. */
  59. int luat_audio_init_codec(uint8_t multimedia_id, uint16_t init_vol, uint16_t init_mic_vol);
  60. /**
  61. * @brief audio休眠控制,进入休眠状态时,芯片才允许进入休眠
  62. *
  63. * @param multimedia_id 多媒体通道,目前只有0
  64. * @param on_off 0退出休眠,其他进入休眠
  65. * @return int =0成功,其他失败
  66. */
  67. int luat_audio_sleep(uint8_t multimedia_id, uint8_t on_off);
  68. #ifdef __LUATOS__
  69. /**
  70. * @brief 播放指定数量的文件或者ROM数组(文件数据直接写成数组形式)
  71. *
  72. * @param multimedia_id 多媒体通道,目前只有0
  73. * @param info 文件信息,文件路径信息
  74. * @param files_num 文件数量
  75. * @return int =0成功,其他失败
  76. */
  77. int luat_audio_play_multi_files(uint8_t multimedia_id, uData_t *info, uint32_t files_num, uint8_t error_stop);
  78. #endif
  79. /**
  80. * @brief 播放指定的文件或
  81. *
  82. * @param multimedia_id 多媒体通道,目前只有0
  83. * @param path 文件路径
  84. * @return int =0成功,其他失败
  85. */
  86. int luat_audio_play_file(uint8_t multimedia_id, const char *path);
  87. /**
  88. * @brief 是否播放完全部数据
  89. *
  90. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  91. * @return uint8_t =1是,=0没有
  92. */
  93. uint8_t luat_audio_is_finish(uint8_t multimedia_id);
  94. /**
  95. * @brief 强制停止播放文件,但是不会停止已经输出到底层驱动的数据播放
  96. *
  97. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  98. * @return int =0成功,其他失败
  99. */
  100. int luat_audio_play_stop(uint8_t multimedia_id);
  101. /**
  102. * @brief 获取上一次播放结果,在MULTIMEDIA_CB_AUDIO_DONE回调时调用最佳
  103. *
  104. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  105. * @return int =0完整的播放完成,<0被用户停止了,>0 TTS失败,或者第几个音频文件解码失败(用户在play_info未设置了解码失败后继续,文件位置+1)
  106. */
  107. int luat_audio_play_get_last_error(uint8_t multimedia_id);
  108. /**
  109. * @brief 立刻初始化播放未编码的原始音频数据流
  110. *
  111. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  112. * @param audio_format 音频数据格式,目前只支持PCM,即需要手动解码
  113. * @param num_channels 声道数,目前只能1或2
  114. * @param sample_rate 采样率,注意只有8K,16K,32K,48K,96K,22.05K,44.1K这些能被支持
  115. * @param bits_per_sample 量化bit,只能是16
  116. * @param is_signed 量化数据是否带符号,只能是1
  117. * @return int =0成功,其他失败
  118. */
  119. 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);
  120. /**
  121. * @brief 向底层驱动传入一段原始音频数据
  122. *
  123. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  124. * @param data 原始音频数据
  125. * @param len 原始音频数据长度
  126. * @return int =0成功,其他失败
  127. */
  128. int luat_audio_write_raw(uint8_t multimedia_id, uint8_t *data, uint32_t len);
  129. /**
  130. * @brief 强制停止所有播放,同时底层驱动也会停止输出,不要用于播放文件的结束
  131. *
  132. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  133. * @return int =0成功,其他失败
  134. */
  135. int luat_audio_stop_raw(uint8_t multimedia_id);
  136. /**
  137. * @brief 暂停/恢复播放
  138. *
  139. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  140. * @param is_pause 0恢复,其他暂停
  141. * @return int =0成功,其他失败
  142. */
  143. int luat_audio_pause_raw(uint8_t multimedia_id, uint8_t is_pause);
  144. /**
  145. * @brief 编码并播放一段文字
  146. *
  147. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  148. * @param text 文字数据
  149. * @param text_bytes 文字数据长度
  150. * @return int =0成功,其他失败
  151. */
  152. int luat_audio_play_tts_text(uint8_t multimedia_id, void *text, uint32_t text_bytes);
  153. /**
  154. * @brief 在收到MULTIMEDIA_CB_TTS_INIT回调时,可以设置TTS参数,等同于ivTTS_SetParam
  155. *
  156. * @param multimedia_id multimedia_id 多媒体通道,目前只有0
  157. * @param param_id 见ivTTS_PARAM_XXX
  158. * @param param_value param_id对应的value
  159. * @return int =0成功,其他失败
  160. */
  161. int luat_audio_play_tts_set_param(uint8_t multimedia_id, uint32_t param_id, uint32_t param_value);
  162. void luat_audio_config_pa(uint8_t multimedia_id, uint32_t pin, int level, uint32_t dummy_time_len, uint32_t pa_delay_time);
  163. void luat_audio_config_dac(uint8_t multimedia_id, int pin, int level, uint32_t dac_off_delay_time);
  164. uint16_t luat_audio_vol(uint8_t multimedia_id, uint16_t vol);
  165. uint8_t luat_audio_mic_vol(uint8_t multimedia_id, uint16_t vol);
  166. /**
  167. * @brief 设置音频硬件输出类型
  168. *
  169. * @param bus_type 见MULTIMEDIA_AUDIO_BUS,目前只有0=DAC 1=I2S 2=SOFT_DAC
  170. */
  171. int luat_audio_set_bus_type(uint8_t multimedia_id,uint8_t bus_type);
  172. luat_audio_conf_t *luat_audio_get_config(uint8_t multimedia_id);
  173. void luat_audio_play_debug_onoff(uint8_t multimedia_id, uint8_t onoff);
  174. int luat_audio_standby(uint8_t multimedia_id);
  175. int luat_audio_check_ready(uint8_t multimedia_id);
  176. #endif