音频播放器(AUDIO PLAYER)¶
1. 概述¶
SDK内置组件轻量级音频播放器是一个非常重要的组件,CI14LP系列芯片作为一款语音识别芯片,在语音交互上语音播报是不可缺失的一环。该组件具有轻量、易用的特点。
CI14LP的播放器组件(components\player\)集成了MP3解码库(mp3lib,提供 .a 库及mp3dec接口)和简单MP3播放器(simple_mp3_player),通过codec_manager组件(内部CODEC/外部CODEC)输出音频,同时支持读取FLASH中打包的MP3提示音(XIP方式,无需占用RAM缓存整个文件)进行解码播放。
播放器结构如下:
| 模块 | 说明 |
|---|---|
| simple_mp3_player | 播放器调度主任务、消息队列、解码流程 |
| mp3lib(libmp3.a / mp3dec.c) | MP3软解码库(PVMP3) |
| codec_manager | 声卡硬件抽象(录音/播音codec注册与管理) |
| flash_rw_process | FLASH数据读取(XIP) |
2. 使用说明¶
2.1. 代码结构¶
| 源文件 | 说明 |
|---|---|
| components\player\simple_mp3_player\simple_mp3_player.c/.h | 播放器接口函数与调度主任务 |
| components\player\mp3lib*.c、libmp3.a | MP3解码库 |
| components\codec_manager*.c/.h | 声卡硬件(codec管理) |
2.2. 关键类型¶
| 类型 | 说明 |
|---|---|
| audio_format_info_t | 音频信息:采样率samprate、通道数nChans、帧长度out_min_size |
| smp_msg_id_t | 播放器消息:SMP_MSG_START_PLAY(开始播放)、SMP_MSG_STOP_PLAY(强制停止) |
| SMP_PLAY_END_CALLBACK | 播放结束回调函数指针类型:void (*)(int32_t arg) |
播放器内部状态机为:SMP_STATE_START(启动)→ SMP_STATE_PLAY(播放中)→ SMP_STATE_STOP(停止)→ SMP_STATE_IDLE(空闲)。
MP3数据头部可携带CI自定义信息帧(ci_mp3_header_t,ID3V2 “PRIV”帧,标签”CI”),用于记录文件大小与PCM大小,供播放器校验数据完整性。
2.3. 播放API¶
| 函数 | 说明 |
|---|---|
| smp_init | 初始化播放器(创建播放器调度主任务) |
| smp_play | 从FLASH指定地址开始播放MP3数据(异步,带播放结束回调) |
| smp_stop | 停止当前播放 |
使用示例如下:
/*初始化播放器:在系统初始化时调用一次*/
smp_init();
/*播放FLASH中0x4000处的MP3提示音,播放完成后调用play_end_callback*/
smp_play(0x4000, play_end_callback);
/*停止播放*/
smp_stop();
提示
smp_play为非阻塞接口,播放结束时机通过回调函数SMP_PLAY_END_CALLBACK(void (*)(int32_t arg))通知,提示音地址可从命令词信息模块(cmd_info/prompt_player)获取;AUDIO_PLAYER_ENABLE宏(默认1)控制播放器组件是否编译进SDK,不需要播放功能时可关闭以节省空间。
2.4. 播放控制API¶
| 函数 | 说明 |
|---|---|
| audio_play_hw_pa_da_ctl | 功放与DAC硬件控制(是否同时控制功放由参数指定) |
| audio_play_set_vol_gain | 设置播放音量增益 |
/*播放时打开功放与DAC*/
audio_play_hw_pa_da_ctl(ENABLE, true);
/*设置音量增益*/
audio_play_set_vol_gain(gain);
2.5. 播放器与codec_manager的关系¶
播放器解码得到的PCM数据通过codec_manager注册的播音codec输出。CI14LP支持以下播音配置(sdk_default_config.h):
| 宏 | 说明 |
|---|---|
| PLAY_CODEC_ID | 播音codec id:0为外部CODEC,2为内部CODEC(默认) |
| PLAYER_CONTROL_PA | 功放开关是否由音频播放器控制(默认0) |
| IF_JUST_CLOSE_HPOUT_WHILE_NO_PLAY | 无播报时只关HPOUT还是关DAC |
板级接口 audio_play_out_codec_registe(board.h)完成播音codec的注册。
注意
关于录音codec、播音codec的完整管理说明请参考 API参考-Speech-API-音频系统管理。