7. 各解码格式配置说明
AD16N、AW30N同时支持的解码格式有:F1A/B/C/X、UMP3、MIDI、A、标准MP3、WAV六种格式;
AW30N还支持OPUS、ADPCM-IMA、SBC/MSBC、SPEEX解码格式。
AD16N和AW30N各SDK对解码格式支持情况如下表;
解码格式\芯片对应SDK
AD16N otp 方案
AD16N flash 方案
AW30N 方案
f1a
不支持
支持
支持
midi解码&midi琴
不支持
支持
支持
A文件解码
不支持
支持
支持
标准MP3
支持
支持
支持
WAV
支持
支持
支持
UMP3
不支持
支持
支持
OPUS
不支持
不支持
支持
ADPCM-IMA
不支持
不支持
支持
SBC/MSBC/USBC
不支持
不支持
支持
SPEEX
不支持
不支持
支持
jla_lw
不支持
不支持
支持
- 下面简要介绍一下各个格式配置:
文件流解码格式:
音频数据流解码格式:
同时支持文件流解码和数据流解码格式:
11. “ump3 解码格式”
7.1. f1a 解码格式
f1a解码格式为我司特有的音频解码格式。具体内容可以了解 f1a_api.c 和 f1a_api.h
格式
后缀名
AD16N otp 方案
flash 方案
f1a
.f1a .f1b .f1c .f1x
不支持
支持
- 解码接口函数:
u32 f1a_decode_index(void *strm, u32 index, dec_obj **p_dec, void *p_dp_buf, f1x_data *p_f1x_data);
7.2. ump3 解码格式
ump3解码格式为我司特有的音频解码格式。具体内容可以了解 ump3_api.c 和 ump3_api.h
格式
后缀名
AD16N otp 方案
flash 方案
ump3
.ump3
不支持
支持
- 解码接口函数:
u32 ump3_decode_api(void *strm, void **p_dec, void *p_dp_buf);
7.3. midi 解码和 midi琴解码格式
midi解码和 midi琴解码格式MIDI解码具体内容可以了解 midi_api.c 和 MIDI_DEC_API.HMIDI琴解码具体内容可以了解 midi_ctrl_api.c 和 MIDI_CTRL_API.Hmidi解码 用户可参考midi_decode_app模式。midi琴 用户可参考midi_keyboard_app模式。详细midi功能及说明请看SDK包里的《杰理AD1x-45678_MIDI应用说明文档.pdf》文档。(注:该文档实际函数以AD16N_flash_v1.4.0工程为准,其余芯片SDK实际函数名会有出入,但实现原理不变)AD16N从V1.4.0版本开始开源2byte和4byte地址版本的midi中间层代码。
备注
7.3.1. midi驱动版本选择说明
AD16N从V1.4.0版本开始开源2byte和4byte地址版本的midi中间层代码,用户可使用位于SDK根目录的工具来选择编译链接2byte或4byte版本的中间层代码、头文件以及算法库。
注:该工具是通过修改cbp文件信息来选择编译对应的驱动的版本,不会对makefile做出任何改动,因此只能用于codeblocks等依赖cbp文件信息来编译的开发平台.
midi 2byte和4byte版本的基本差异如下表:
midi版本
乐谱后缀名
音色库后缀名
算法库名(已开源的库名)
音色库支持的PCM样点数
音色库支持的声道数
算法输出支持的声道数
2byte
.mfa
.mda
lib_midi_synth.a
<=65535个点
单声道
单声道
4byte
.mfa
.mdb
lib_midi_synth_pro.a
<=1900000
单声道、双声道
单声道、双声道
![]()
midi驱动版本选择工具
在上述工具中,双击midi_4byte.bat就是选择编译4byte版本的midi驱动,双击midi_2byte.bat则选择编译2byte版本的midi驱动.
双击后4byte的工具成功后会有以下打印,然后用文本编辑器点开AD16N_mbox_flash.cbp检查2byte的目录是否被替换成4byte,2byte算法库是否有被替换成4byte的算法库
![]()
midi驱动版本选择4byte版本
![]()
midi编译4byte版本驱动
![]()
midi头文件依赖选择4byte版本
![]()
链接4byte版本的midi算法库
然后打开SDK,在app_modules.h选择4byte版本的配置(该步骤影响midi的初始化流程、运算buf大小、音频数据流对midi算法适配的声道数)
![]()
SDK配置midi使用4byte版本驱动
最后需要准备好适应4byte版本的midi音色库,sdk下载目录中已有测试用的音色库(midi_cfg_ster1),将其加入download_bat.c,编译下载并启动SDK之后,midi初始化会打开此文件。
![]()
midi解码初始化打开音色库文件
声道配置注意:midi算法输出数据的声道数需要和音频数据流的配置适配,否则会出现播放声音异常的问题
![]()
midi声道数配置
7.3.2. midi相关资源文件说明
midi文件后缀名详情:
工具版本
乐谱后缀名
音色库后缀名
旧版无压缩
.mid
.mid
旧版有压缩
.mid
.mda
新版(2byte)
.mfa
.mda
新版(4byte)
.mfa
.mdb
7.3.3. midi相关功能配置说明
- MIDI解码基本功能以及对应的命令如下:
配置midi使用模式(CMD_MIDI_CTRL_MODE)
配置OKON模式发声(CMD_MIDI_GOON / CMD_MIDI_OKON_MODE)
切换主旋律乐器(CMD_MIDI_SET_PROG)
配置主通道乐器或者所以通道的乐器(CMD_MIDI_SET_CHN_PROG)
mark回调播放功能(CMD_MIDI_SET_MARK)
小节回调(CMD_MIDI_SEEK_BACK_N)
调节midi外部音量功能(CMD_MIDI_SET_EX_VOL)
移半音功能(CMD_MIDI_SET_SEMITONE)
更改节奏和衰减功能(CMD_MIDI_CTRL_TEMPO)
配置限幅器(CMD_MIDI_LIMITER_TRIGGER)
- MIDI琴基本功能与对应的命令如下:
动态修改音色相关参数
更改节奏和衰减功能(CMD_MIDI_CTRL_TEMPO)
调节midi外部音量功能(CMD_MIDI_SET_EX_VOL)
移半音功能(CMD_MIDI_SET_SEMITONE)
配置限幅器(CMD_MIDI_LIMITER_TRIGGER)
琴键颤音功能
弯音轮功能
动态修改当前播放的乐器通道
- 解码接口函数:
u32 midi_decode_api(void *strm, void **ppdec, void *p_dp_buf);u32 midi_ctrl_decode_api(void *strm, void **ppdec, void *p_dp_buf)
7.4. a 解码格式
a解码格式为我司特有的音频解码格式。a解码具体内容可以了解 a_api.c 和 a_api.h
格式
后缀名
AD16N otp 方案
flash 方案
a
.a .b .e
不支持
支持
- 解码接口函数:
u32 a_decode_api(void *strm, void **p_dec, void *p_dp_buf);
7.5. 标准MP3 解码格式
标准MP3解码格式MP3解码具体内容可以了解 mp3_standard_api.c 和 a_amp3_standard_apipi.h
格式
后缀名
AD16N otp 方案
flash 方案
标准MP3
.mp3 .mp2 .mp1
支持
支持
- 解码接口函数:
u32 mp3_st_decode_api(void *strm, void **p_dec, void *p_dp_buf);
7.6. WAV 解码格式
WAV解码格式WAV解码具体内容可以了解 wav_api.c 和 wav_api.h
格式
后缀名
AD16N otp 方案
flash 方案
WAV
.wav
支持
支持
- 解码接口函数:
u32 wav_decode_api(void *strm, void **p_dec, void *p_dp_buf);
7.7. OPUS 解码格式
OPUS解码格式为数据流解码格式。目前的OPUS解码仅支持百度格式。OPUS解码具体内容可以了解 opus_api.c 和 opus_api.h
- 解码接口函数:
u32 opus_decode_api(void *strm, void **p_dec, void *p_dp_buf);
7.8. ADPCM-IMA 解码格式
ADPCM-IMA解码格式为数据流解码格式。ADPCM-IMA解码具体内容可以了解 ima_api.c 和 ima_api.h
- 解码run返回值
1、 0x0:正常情况;2、 0x60:读不到数据;
- 输入输出量控制
ima_dec_stream_max_input:一次算法run input处理最大数据量(单位:byte)ima_dec_stream_max_output:一次算法run output解码出来的最大数据量(单位:样点数)两者会影响ADPCM-IMA里运行buff的大小。![]()
adpcm-ima 输入输出量控制
- 预测值与索引配置接口函数:
与adpcm_ima编码输出header功能对应,用户在使用前需要先用config配置CMD_SET_PRE_IDX命令config 配置说明:CMD_SET_PRE_IDX //配置每包预测值与步长表索引,在每包解码前配置使用方式 ima_test->dec_confing(ima_work_buf, CMD_SET_PRE_IDX, &prevalue_index_info)prevalue_index_info 是ima_dec_stream_pre_idx变量其中 prevalue_index_info.valpred = head[0] << 8 | head[1];prevalue_index_info.index = head[2];head是 unsigned char 类型注意:在配置之前需要暂停解码,配置之后才能开始解码(保证解码当前包开始,是使用的头中的valpred与index)
- 解码接口函数:
u32 ima_decode_api(void *strm, void **p_dec, void *p_dp_buf);
7.9. SBC/MSBC/USBC 解码格式
SBC/MSBC/USBC解码格式为数据流解码格式。sbc / msbc /usbc 共用一个算法库,用户需要注意的是选择sbc解码、msbc解码还是usbc解码,三者不可混用。即sbc的解码格式只能解码sbc的编码数据,msbc的解码格式只能解码msbc的编码数据,usbc的解码格式只能解码usbc的编码数据;sbc/msbc/usbc解码具体内容可以了解 sbc_api.c 和 sbc_stddec_api.h
sbc / msbc / usbc 解码选择
![]()
sbc/msbc/usbc解码格式选择
- 解码run返回值
1、0x0:正常读到数据。2、0x60:算法input读不到数据,即读到数据长度为03、0x61:错误的采样率/声道模式信息4、0x62:错误的bitpool/subband信息5、0x63:错误的bitpool+suband+channel mode组合6、0x64:目标帧长超出范围
- 解码接口函数:
u32 sbc_decode_api(void *strm, void **p_dec, void *p_dp_buf);
备注
usbc参数配置
7.10. speex 解码格式
speex解码格式为数据流解码格式,该格式主要用于人声场景。speex解码具体内容可以了解 speex_api.c 和 speex_api.h
- 解码接口函数:
u32 speex_decode_api(void *strm, void **p_dec , void *p_dp_buf);
7.11. jla_lw 解码格式
jla_lw解码格式为数据流解码格式JLA_LW编解码共用同一个算法库,解码的采样率 和 码率需要与编码一致。该格式目前主要应用在对讲机应用上,用来和蓝牙连接间隔对齐。jla_lw解码具体内容可以了解 jla_lw_api.c 和 jla_lw_api.h 和 jla_lw_codec_ctrl.h
- 丢包修复
JLA_LW 解码格式自带有丢包修复功能。即该格式10ms处理一包数据,若该10ms的数据丢失,则会根据前文数据生成一包新的数据来弥补这10ms的音频。//具体修复多少包数据可以查看 trans_unpacket.c 里的 fill_empty_frames() 函数。//代码实现为通过计算蓝牙传输每包数据的index序号,根据本包数据的index序号与上一包数据的index序号相差多少就填以0x55aa为头的空包进入解码器(目前应用层当设置丢失超过5包时,只填充5包数据)
- 淡入淡出功能
当蓝牙信号弱时出现丢包现象,如果打开了淡入淡出功能,JLA_LW格式除了在库里面会做丢包修复,还会使得丢包处的声音尽量平滑过度不至于出现明显的卡音。
![]()
jla_lw淡入淡出配置
jla_lw_br_level 压缩档位(位于app_config.c)
0档位适用于:
16k采样率,36kbps,每帧编码间隔为20ms; 32k采样率,72kbps,每帧编码格式为10ms;1档位适用于:
16k采样率,72kbps,每帧编码间隔为10ms;![]()
JLA格式的jla_lw_br_level配置
备注
- 解码接口函数:
u32 jla_lw_decode_api(void *strm, void **p_dec, void *p_dp_buf);