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;
    }
}