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

不支持

不支持

支持

下面简要介绍一下各个格式配置:

文件流解码格式:

音频数据流解码格式:

同时支持文件流解码和数据流解码格式:


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.H
MIDI琴解码具体内容可以了解 midi_ctrl_api.c 和 MIDI_CTRL_API.H
midi解码 用户可参考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中间层代码。

备注

midi功能常涉及两部分文件,一个是 音色库 ,一个是用户自己的 midi乐曲文件
1. 音色库 只能 烧写放入内置flash里,不支持放在其他设备!!!
2. 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驱动版本选择工具

在上述工具中,双击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版本驱动“

midi编译4byte版本驱动

"midi头文件依赖选择4byte版本“

midi头文件依赖选择4byte版本

"链接4byte版本的midi算法库“

链接4byte版本的midi算法库

然后打开SDK,在app_modules.h选择4byte版本的配置(该步骤影响midi的初始化流程、运算buf大小、音频数据流对midi算法适配的声道数)

"SDK配置midi使用4byte版本驱动“

SDK配置midi使用4byte版本驱动

最后需要准备好适应4byte版本的midi音色库,sdk下载目录中已有测试用的音色库(midi_cfg_ster1),将其加入download_bat.c,编译下载并启动SDK之后,midi初始化会打开此文件。

"midi解码初始化打开音色库文件“

midi解码初始化打开音色库文件

声道配置注意:midi算法输出数据的声道数需要和音频数据流的配置适配,否则会出现播放声音异常的问题

"midi声道数配置“

midi声道数配置

7.3.2. midi相关资源文件说明

midi文件后缀名详情:

工具版本

乐谱后缀名

音色库后缀名

旧版无压缩

.mid

.mid

旧版有压缩

.mid

.mda

新版(2byte)

.mfa

.mda

新版(4byte)

.mfa

.mdb

7.3.3. midi相关功能配置说明

MIDI解码基本功能以及对应的命令如下:
  1. 配置midi使用模式(CMD_MIDI_CTRL_MODE)

  2. 配置OKON模式发声(CMD_MIDI_GOON / CMD_MIDI_OKON_MODE)

  3. 切换主旋律乐器(CMD_MIDI_SET_PROG)

  4. 配置主通道乐器或者所以通道的乐器(CMD_MIDI_SET_CHN_PROG)

  5. mark回调播放功能(CMD_MIDI_SET_MARK)

  6. 小节回调(CMD_MIDI_SEEK_BACK_N)

  7. 调节midi外部音量功能(CMD_MIDI_SET_EX_VOL)

  8. 移半音功能(CMD_MIDI_SET_SEMITONE)

  9. 更改节奏和衰减功能(CMD_MIDI_CTRL_TEMPO)

  10. 配置限幅器(CMD_MIDI_LIMITER_TRIGGER)

MIDI琴基本功能与对应的命令如下:
  1. 动态修改音色相关参数

  2. 更改节奏和衰减功能(CMD_MIDI_CTRL_TEMPO)

  3. 调节midi外部音量功能(CMD_MIDI_SET_EX_VOL)

  4. 移半音功能(CMD_MIDI_SET_SEMITONE)

  5. 配置限幅器(CMD_MIDI_LIMITER_TRIGGER)

  6. 琴键颤音功能

  7. 弯音轮功能

  8. 动态修改当前播放的乐器通道

  • 解码接口函数:
    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 输入输出量控制

  • 预测值与索引配置接口函数:
    与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解码格式选择"

sbc/msbc/usbc解码格式选择

  • 解码run返回值
    1、0x0:正常读到数据。
    2、0x60:算法input读不到数据,即读到数据长度为0
    3、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做解码格式时,只能解码对应参数的usbc编码。
所以用户需要配置usbc的参数和编码端的参数一致。
"usbc参数配置"

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淡入淡出配置

  • jla_lw_br_level 压缩档位(位于app_config.c)

    0档位适用于:

    16k采样率,36kbps,每帧编码间隔为20ms;
    32k采样率,72kbps,每帧编码格式为10ms;
    

    1档位适用于:

    16k采样率,72kbps,每帧编码间隔为10ms;
    
"JLA格式的jla_lw_br_level配置"

JLA格式的jla_lw_br_level配置

备注

在v1.4.0版本前,JLA格式只支持0档位的配置(该压缩档位没有开放出来)
在v1.4.0版本后,JLA格式才支持 0 和 1 档位的配置;
该配置需要编解码双方一致!!!!!!
  • 解码接口函数:

    u32 jla_lw_decode_api(void *strm, void **p_dec, void *p_dp_buf);