2.1. Decode
音频输出可以选择使用APA或者DAC方式,该部分涉及文件在decode.c和voice.c。
通过以下配置进行选择音频输出方式。
2.1.1. 音频解码播放输出配置
#define DECODE_OUTPUT_DAC 0
#define DECODE_OUTPUT_APA 1
#define DECODE_OUTPUT_WAY DECODE_OUTPUT_APA //音频播放输出配置
#if (DECODE_OUTPUT_WAY == DECODE_OUTPUT_APA)
#define DECODE_REG_VOL_TAB APA_REG_VOL_TAB
#define DECODE_GET_MAX_VOL APA_GET_MAX_VOL
#define DECODE_SET_MAX_VOL APA_SET_MAX_VOL
#define DECODE_GET_CUR_VOL APA_GET_CUR_VOL
#define DECODE_SET_CUR_VOL APA_SET_CUR_VOL
#define DECODE_CLR_DMA_BUF APA_CLR_DMA_BUF
#define DECODE_SET_SR APA_SET_SR
#define DECODE_GET_SR APA_GET_SR
#define DECODE_IE_CTL APA_IE_CTL
#define DECODE_DEFAULT_SR (32000) //初始化的采样率
#define decode_drv apa_drv
#else
#define DAC_PA_MUTE_PORT IO_PORTA_01
#define DECODE_REG_VOL_TAB DAC_REG_VOL_TAB
#define DECODE_GET_MAX_VOL DAC_GET_MAX_VOL
#define DECODE_SET_MAX_VOL DAC_SET_MAX_VOL
#define DECODE_GET_CUR_VOL DAC_GET_CUR_VOL
#define DECODE_SET_CUR_VOL DAC_SET_CUR_VOL
#define DECODE_CLR_DMA_BUF DAC_CLR_DMA_BUF
#define DECODE_SET_SR DAC_SET_SR
#define DECODE_GET_SR DAC_GET_SR
#define DECODE_IE_CTL DAC_IE_CTL
#define DECODE_DEFAULT_SR (32000) //初始化的采样率
#define decode_drv dac_drv
#endif
#define DECODE_SOFT_ISR IRQ_SOFT0_IDX //使用的软中断
#define DECODE_SOFT_ISR_PRIORITY IRQ_SOFT0_PRIORITY //使用的软中断优先级
#define DEC_THRESHOLD_VALUE (720*2L) //decode_cbuf小于阈值则启动软中断解码
#define OBUF_SIZE (18*64*4L) //pcm_buf_size每次解码输出18*64个点
#define MAX_SYS_VOL (31) //最大音量等级
#define DEFUAL_SYS_VOL (MAX_SYS_VOL) //系统默认音量
用户可在下面的文件列表中添加自己的音频文件。
//音频文件列表
const char *const tone_table[] = {
TONE_NUM_0, TONE_NUM_1, TONE_NUM_2, TONE_NUM_3, TONE_NUM_4,
TONE_NUM_5, TONE_NUM_6, TONE_NUM_7, TONE_NUM_8, TONE_NUM_9,
TONE_ALARM, TONE_AVERAGE, TONE_BAI, TONE_BASEWORLD, TONE_BEGIN,
TONE_CONTINUEHIGH, TONE_DIAN, TONE_END, TONE_ERROR, TONE_HIGH,
TONE_KP, TONE_LOW, TONE_LOWPOWER, TONE_MAIBO, TONE_MMHG,
TONE_NORMAL, TONE_NORMALHIGH, TONE_PLEASESEAT, TONE_REGISTER, TONE_SHI,
TONE_SHOUSUOYA, TONE_SHUZHANGYA, TONE_THANKS, TONE_ZHUYI,
};
下面介绍一下相关的接口。
2.1.2. 常用音频解码播放接口函数
2.1.2.1. decode_init
功能: 对音频播放控制相关的模块进行初始化。
void decode_init(void);
参数:
返回值
void
2.1.2.2. decode_uninit
功能: 对音频播放控制相关的模块资源进行释放。
void decode_uninit(void);
参数:
返回值
void
2.1.2.3. a_player_pause
功能: 暂停/启动 音频播放函数
u8 a_player_pause(void);
参数:
返回值
返回当前播放状态
2.1.2.4. a_player_stop
功能: 结束音频播放,关闭播放器
void a_player_stop(u8 wait)
参数:
wait
1: 等待当前音频播放结束 0:不等待
返回值
void
2.1.2.5. a_player_tonebyindex
功能: 通过文件索引,播放音频文件
u8 a_player_tonebyindex(enum INDEX_TONE index)
参数:
index
音频文件索引
返回值
DEC_FAIL: 解码失败 DEC_SUCC: 解码成功
2.1.2.6. app_play_files
功能: 启动播放,开始播放音频文件列表
void app_play_files(void);
参数:
返回值
void
2.1.2.7. app_play_file_loop
功能: 播放音频文件列表
char app_play_file_loop();
参数:
返回值
0:所有文件都播放结束 1:还有文件未播放
2.1.3. 音频播放参考demo
void voice_test_demo(void)
{
decode_init();
// 在该接口内添加音频到播放列表后开始播放
app_play_set_and_begin();
// 每播放完一条音频都会发出MSG_EVENT_DECODE_END消息事件
// 在app_msg_event_handler中对该事件进行处理
}
void app_msg_event_handler(struct sys_event *event)
{
struct msg_event *msg = &event->u.msg;
switch (msg->event) {
case MSG_EVENT_DECODE_END:
// 检查是否已播放完所有音频,未播放完则继续播放下一条
if (!app_play_file_loop()) {
// 播放完则结束解码播放
a_player_stop(1);
}
break;
}
}