概述

AUDIO模块包括音频输入、音频输出、音频编码、音频解码四个子模块。音频输入和输出模块通过对芯片音频接口的控制实现音频输入输出功能。音频编码和解码模块提供对G711、G726、ADPCM格式的音频编解码功能,并支持录制和播放LPCM格式的原始音频文件。

注意:未有特殊说明,SS625V100描述与SS528V100一致;SS522V100描述与SS524V100一致。

功能描述

音频输入和音频输出

音频接口和AI、AO设备

音频输入输出接口简称为AIO(Audio Input/Output)接口,用于和Audio Codec对接,完成声音的录制和播放。

AIO接口分为两种类型:只支持输入或只支持输出。

  • 当为输入类型时,又称为AIP;

  • 当为输出类型时,又称为AOP。

软件中负责抽象音频接口输入功能的单元,称之为AI设备;负责抽象音频接口输出功能的单元,称之为AO设备。

对每个输入输出接口,软件根据该接口支持的功能,分别与AI设备和AO设备建立映射关系。例如:AIP0只支持音频输入,则AIP0映射为AiDev0;AOP0只支持音频输出,则AOP0映射为AoDev0。

录音和播放原理

原始音频信号以模拟信号的形式给出后,通过Audio Codec,按一定采样率和采样精度转换为数字信号。Audio Codec以I2S时序或PCM时序的方式,将数字信号传输给AI设备。芯片利用DMA将AI设备中的音频数据搬移到内存中,完成录音操作。

播放和录音是基于同样的原理。芯片利用DMA将内存中的数据传输到AO设备。AO设备通过I2S时序或PCM时序向Audio Codec发送数据。Audio Codec完成数字信号到模拟信号的转换过程,并输出模拟信号。

图 1 录音和播放示意图

音频接口时序和AI、AO通道排列

音频接口时序

音频接口支持标准的I2S接口时序模式和PCM接口时序模式,并提供灵活的配置以支持与多种Audio Codec对接。详细的时序支持情况请参考对应芯片的用户指南。

为实现成功对接,需要对I2S或者PCM协议以及对接的Audio Codec时序支持情况有足够了解,这里只简单介绍下I2S及PCM接口时序的几个特性:

  • 按照标准I2S或PCM协议,总是先传送最高有效位MSB,后传送最低有效位LSB,即按照从高位到低位的顺序传输串行数据。

  • AI设备支持扩展的多路接收的I2S及PCM接口时序。对接时,Codec的时序模式选择、同步时钟、采样位宽等配置必须与AI设备的配置保持一致,否则可能采集不到正确的数据。

  • AI/AO设备支持主模式和从模式,主模式即AI/AO设备提供时钟,从模式即Audio Codec提供时钟。主模式时,如果AI设备与AO设备同时对接同一个Codec,则时钟供输入和输出共同使用,其他情况没有此限制。而从模式时的输入输出时钟可以分别由外围Audio Codec提供。

  • 由于时序的问题,在AI/AO设备从模式下,建议用户先配置好对接的Codec,再配置AI或AO设备;而在AI/AO设备主模式下,建议用户先配置好AI或AO设备,再配置对接的Codec。

  • AI/AO设备选择主模式时,有些AI/AO设备只提供用于时序同步的帧同步时钟和位流时钟,不提供MCLK,这时如果Audio Codec使用外接的晶振作为工作时钟,这样可能导致声音失真,因此推荐使用从模式或者使用位流时钟产生Codec内部工作主时钟。

  • 当AI/AO设备为主模式时,对于向外提供了MCLK的AI/AO设备,通道数为1/2/4/8/16路时,MCLK的设定为:

    • 采样率为96k/48k/24k/12k时,提供12.288MHz的主时钟。

    • 采样率为64k/32k/16k/8k时,提供8.192MHz的主时钟。

    • 采样率为44.1k/22.05k/11.025k时,提供11.2896MHz的主时钟。

    通道数为20路时,MCLK的设定为:

    • 采样率为48k/24k/12k时,提供15.36MHz的主时钟。

    • 采样率为32k/16k/8k时,提供10.24MHz的主时钟。

    • 采样率为44.1k/22.05k/11.025k时,提供14.112MHz的主时钟。

  • AI/AO设备支持标准PCM模式和自定义PCM模式。PCM模式下只支持单声道模式,因此在PCM模式下,需要关闭对接Codec的右声道输出,否则声音会有杂音。根据PCM标准模式协议,当工作模式为标准PCM主模式或标准PCM从模式时,音频输入输出的数据相对帧同步信号延迟1个位流时钟(BCLK)周期。如果在标准PCM主模式或标准PCM从模式下对接外置的Codec,需要确保外置Codec的数据相对帧同步信号延迟的位流时钟(BCLK)周期数大于音频输入输出数据相对帧同步信号延迟的位流时钟周期数(1个BCLK),否则声音会有杂音。

图 1 I2S 1/2/4/8/16/20路接收

注:m0~m3为4路mic数据。1ch模式仅在非时分复用时支持。

AI、AO通道

AI和AO通道是软件层次的概念,下面通过举例的方式来说明通道的概念。

例如:

  • 当AI设备使用多路复用的I2S接收模式时,标准的I2S协议只有左右声道这个概念,AI设备最大支持左右声道各接收128bit音频数据。此时假设Codec具有复用功能,可以将16路16bit采样精度的音频数据复用为2路128bit的I2S左右声道数据,那么AI设备可以解析这16路音频数据,并称这16路音频数据为16个音频通道。

  • 当AO设备使用多路复用的I2S发送模式时,标准的I2S协议只有左右声道这个概念,AO设备最大支持左右声道各发送128bit音频数据。此时假设Codec具有复用功能,可以将8路24bit采样精度的音频数据复用为2路128bit的I2S左右声道数据,那么AO设备可以解析这8路音频数据,并称这8路音频数据为8个音频通道。

  • 当AO设备使用多线的I2S发送模式时,此时仅支持标准的I2S协议,即每根数据线最大支持左右声道各发送24bit数据。此时假设使用了4根数据线,可以将每根数据线上的左右声道数据视为2路音频数据,那么AO设备可以发送这8路音频数据,并称这8路音频数据为8个音频通道。

AIO在不同协议时,支持的AI、AO多路复用模式有差异,不同的解决方案也不相同。

  • SS528V100/SS524V100如表1所示。

表 1 SS528V100/SS524V100 AIO最大支持AI、AO通道数

AIO多路复用

最大支持

通道举例

I2S时序接收

左右声道各160bit

16bit20chn等

PCM时序接收

单声道320bit

16bit20chn等

I2S时序发送

每根数据线左右声道各24bit(支持4根数据线,最大仅2根有效)

24bit8chn等

PCM时序发送

单声道16bit

16bit1chn

  • SS928V100如表2所示。

表 2 SS928V100 AIO最大支持AI、AO通道数

AIO多路复用

最大支持

通道举例

I2S时序接收

左右声道各128bit

16bit16chn等

PCM时序接收

单声道256bit

16bit16chn等

I2S时序发送

左右声道各128bit

16bit8chn等

PCM时序发送

单声道16bit

16bit1chn

  • SS626V100如表3所示。

表 3 SS626V100 AIO最大支持AI、AO通道数

AIO多路复用

最大支持

通道举例

I2S时序接收

左右声道各160bit

16bit20chn等

PCM时序接收

单声道320bit

16bit20chn等

I2S时序发送

左右声道各24bit

16bit2chn等

PCM时序发送

单声道16bit

16bit1chn

AI、AO可以在AI/AO设备最大支持的比特范围内,按采样精度拆分AI和AO通道,并按照时序上的顺序,依次视为AiChn0、AiChn1等或AoChn0、AoChn1等。只有AI/AO设备配置的I2S或PCM时序与Codec配置的时序一致时,才能接收或传送正确的音频数据,将AI/AO设备的时序配置和Codec的时序配置调为一致的过程称作对接。例如配置AI为标准PCM从模式,8k采样率,16bit采样精度,2通道;配置Codec提供的帧同步时钟为8k,位流时钟为8kx32bit,每个采样点为32bit(Codec支持将两个16bit的采样点复用为一个采样点);PCM时序上的通道排列如图1所示,I2S时序多线模式上的通道排列如图2所示。

图 1 PCM时序发送示意图

图 2 I2S时序多线发送示意图

SS528V100/SS524V100上音频AI支持的最大通道数为20通道,I2S模式下AO支持的最大通道数为8通道(每根数据线支持2通道,受I2S数据线数量限制,最大仅4通道有效),PCM模式下AO支持的最大通道数为1通道。多通道情况下,AI、AO视通道排列中相对应的两通道为立体声输入输出。

  • 对于AI,例如图1中,通道0和4、1和5、2和6、3和7视为立体声的左右声道,即共有四路16bit采样精度的立体声输入,这时只应对左声道0~3进行操作。

  • 对于AO,例如图2中,通道0和4、1和5、2和6、3和7视为立体声的左右声道,即每根数据线传输一路立体声,共有四路立体声输出,这时只应对左声道0、1、2、3进行操作。

AIO接口中的AI设备与AO设备是相互独立的,如果它们同时对接同一个Codec,则AI和AO配置的工作模式必须一致,例如AI和AO均配置为I2S时序的从模式。当AIO工作在主模式时,AI和AO的通道数与采样精度的乘积也必须相等,这样才能保证由AIO发送给Audio Codec的同步时钟,对AI和AO是一致的,如果他们没有同时对接同一个Codec,则没有此限制。当AIO工作在从模式时,AI和AO的通道数与采样精度的乘积可以不一致,此时可以由Audio Codec发送不同的同步时钟给AI和AO。SDK支持通过SYS模块绑定接口,建立AI、AO通道间的绑定关系,实现音频数据的实时播放。

重采样

音频输入和音频输出模块支持对音频数据实施重采样。如果启用AI重采样功能,则在ss_mpi_ai_get_frame获取数据返回前,内部将会先执行重采样处理,再返回处理后的数据。如果启用了AO重采样功能,则音频数据在发送给AO之前,内部先执行重采样处理,处理完成后再发送给AO通道进行播放。

音频重采样支持任意两种不同采样率(64k、96k除外)之间的重采样,也支持64kHz下采样到8kHz或16kHz。重采样支持的输入采样率为:8kHz,11.025kHz,12kHz,16kHz,22.05kHz,24kHz,32kHz,44.1kHz,48kHz,64kHz,不支持的输入采样率:96kHz;支持的输出采样率为:8kHz,11.025kHz,12kHz,16kHz,22.05kHz,24kHz,32kHz,44.1kHz,48kHz;不支持的输出采样率:64kHz,96kHz;重采样仅支持处理单声道。

  • 如果是AI的重采样,则重采样的输入采样率与AI设备属性配置的采样率相同,重采样的输出采样率必须与AI设备属性配置的采样率不相同,用户只需要配置重采样的输出采样率。重采样之前的每帧采样点数目与AI设备属性配置的每帧采样点数目相同。

  • 如果是AO的重采样,则重采样的输出采样率与AO设备属性配置的采样率相同,重采样的输入采样率必须与AO设备属性配置的采样率不相同,用户只需要配置重采样的输入采样率。重采样之后音频帧的每帧采样点数目与AO设备属性配置的每帧采样点数目相同。

  • 如果AI的数据需要送到AENC进行编码且AI启动了重采样,则重采样后的音频帧长out_point_num_per_frame必须满足:CPU软件编码时out_point_num_per_frame小于等于编码通道属性的point_num_per_frame;VOIE编码时out_point_num_per_frame必须是80、160、240、320、480中的一个值。out_point_num_per_frame、重采样前的音频帧长in_point_num_per_frame、重采样前的采样率in_sample_rate、重采样后的采样率out_sample_rate之间的换算关系为:out_point_num_per_frame=out_sample_rate * in_point_num_per_frame / in_sample_rate。SS528V100/SS524V100不支持VOIE编码。

    须知:

    • 当AI通道模式设为OT_AI_CHN_MODE_FAST且AI-AO、AI-AENC的数据传输方式为系统绑定方式时,AI的重采样无效,其余情况则AI的重采样有效。

    • 非系统绑定方式下,用户可以通过ss_mpi_ai_get_frame接口获取重采样处理后的AI音频帧,并发送给AENC/AO,以建立AI-AENC或AI-AO的数据传输,此时AI或AO的重采样有效。

    • 当AI通道模式设为OT_AI_CHN_MODE_FAST时,启用AI的重采样功能后,建议不要在调用ss_mpi_ai_get_frame获取该AI通道的数据后将同一个AI通道绑定到AENC通道,否则会导致重采样处理异常。

    • 重采样输入采样率配置为64kHz时,仅支持输出采样率为8kHz或16kHz。

    • 当AI通道模式设为OT_AI_CHN_MODE_NORMAL时,在启用AI的重采样后,支持同一个AI通道绑定多个AENC通道(重采样输出采样率需一致),也支持在AI绑定AENC通道后再调用ss_mpi_ai_get_frame获取同一个AI通道的数据。

    • ADEC-AO的数据传输方式无上述限制,当为系统绑定方式时,AO的重采样仍有效。

    • 接口ss_mpi_ai_enable_resample和ss_mpi_ai_disable_resample使用的是声音质量增强功能中的RES模块。

    • 重采样仅支持OT_AUDIO_SOUND_MODE_MONO模式。

    • 重采样不支持处理24bit位宽的数据。

声音质量增强(VQE)

音频输入和输出模块支持对音频数据进行声音质量增强(Voice Quality Enhancement)处理。VQE针对AI和AO两条通路的异同点,分别通过UpVQE和DnVQE两个调度逻辑来处理两个通路的数据。

  • VQE现有TalkVQE、HIFIVQE、RecordVQE、TalkVQEV2四种方式。

    • TalkVQE主要用于_录像机_语音对讲场景,适用于低音质语音处理场景(8/16kHz采样率,16bit位宽,单声道),支持双向对讲场景;

    • HIFIVQE主要用于Mobile Camera录音场景,适用于高音质语音处理场景(48kHz采样率,16bit位宽,单声道),不支持双向对讲;

    • RecordVQE是HIFIVQE的升级版本,其支持16/48kHz采样率,16bit位宽,单/双声道。对于支持RecordVQE和其他方式的解决方案来说,Mobile Camera录音场景推荐优先使用RecordVQE。

    • TalkVQEV2是TalkVQE的升级版本,其支持16kHz采样率,16bit位宽,双声道。对于支持TalkVQEV2和其他方式的解决方案来说,_录像机_场景推荐优先使用TalkVQEV2。

  • AI上行通路的VQE最多支持TalkVQE、HIFIVQE、RecordVQE三种方式,其功能包含回声抵消、语音降噪、自动增益、高通滤波、录音噪声消除、均衡器、动态压缩、参量均衡器、高动态范围九个处理模块,如图1所示。AI上行通路的VQE功能在ss_mpi_ai_get_frame接口内实现,并返回处理后的数据。

  • AO下行通路的VQE支持TalkVQE方式,其功能包含语音降噪、自动增益、高通滤波、均衡器四个处理模块,如图2所示。AO下行通路的VQE功能在ss_mpi_ao_send_frame接口内实现。

VQE分为2个调度接口模块(UpVQE和DnVQE),11个功能模块(AEC、ANR、AGC、RNR、EQ、HPF、GAIN、RES、HDR、DRC、PEQ),以及1个共用模块(COMMON)。两个调度逻辑使用libdl库的dlopen方式动态加载各个功能模块,通过统一功能模块的API接口格式,对功能模块进行统一调度。VQE功能模块支持剪裁,用户可根据实际应用场景选择需要用到的功能模块动态库文件,如表1所示。

表 1 VQE库的应用关系

模块名

功能描述

库文件名称

AI上行通路

AO下行通路

是否可剪裁

依赖

互斥

UpVQE

AI音效处理调度接口

libss_upvqe.a(.so)

DnVQE

AO音效处理调度接口

libss_dnvqe.a(.so)

AEC

回声抵消

libvqe_aec.so

COMMON

RNR/DRC/PEQ

ANR

语音降噪

libvqe_anr.so

COMMON

RNR/DRC/PEQ

AGC

自动增益控制

libvqe_agc.so

COMMON

PEQ

RNR

录音噪声消除

libvqe_rnr.so

AEC/ANR

DRC

动态压缩控制

libvqe_drc.so

AEC/ANR

PEQ

参量均衡器

libvqe_peq.so

AEC/ANR/AGC/EQ

HDR

高动态范围

libvqe_hdr.so

EQ

均衡处理器

libvqe_eq.so

AGC/COMMON

PEQ

HPF

高通滤波

libvqe_hpf.so

GAIN

音量调节

libvqe_gain.so

RES

重采样

libvqe_res.so

COMMON

公共模块

libvqe_common.so

WNR

降风噪

libvqe_wnr.so

须知:

  • AI上行音效处理的相关接口为ss_mpi_ai_set_talk_vqe_attr、ss_mpi_ai_get_talk_vqe_attr、ss_mpi_ai_set_talk_vqe_v2_attr、ss_mpi_ai_get_talk_vqe_v2_attr、ss_mpi_ai_set_record_vqe_attr、ss_mpi_ai_get_record_vqe_attr、ss_mpi_ai_enable_vqe、ss_mpi_ai_disable_vqe。其中,ss_mpi_ai_set_talk_vqe_attr和ss_mpi_ai_get_talk_vqe_attr、ss_mpi_ai_set_talk_vqe_v2_attr和ss_mpi_ai_get_talk_vqe_v2_attr、ss_mpi_ai_set_record_vqe_attr和ss_mpi_ai_get_record_vqe_attr是三对接口,它们只能配对调用,例如:如果调用ss_mpi_ai_set_talk_vqe_attr设置了参数,则只能使用ss_mpi_ai_get_talk_vqe_attr获取设置的参数,调用ss_mpi_ai_get_record_vqe_attr或ss_mpi_ai_get_talk_vqe_v2_attr获取参数会返回错误。在调用其中一个set接口设置参数后,在调用ss_mpi_ai_enable_vqe使能vqe之前,可以调用另外一个set接口设置参数;调用ss_mpi_ai_enable_vqe后,如果想设置参数,则须先调用ss_mpi_ai_disable_vqe禁止使能vqe,然后再调用其中的一个set接口设置参数。各解决方案对这三对接口的支持情况表,如Vqe、HiFiVqe、TalkVqe和RecordVqe接口支持情况表中分别用TalkVqe、RecordVqe和TalkVqeV2代替这三对接口名字。

  • AO下行音效处理的相关接口为ss_mpi_ao_set_vqe_attr、ss_mpi_ao_get_vqe_attr、ss_mpi_ao_enable_vqe、ss_mpi_ao_disable_vqe。

  • 与libvqe_res.so有关联的接口还有ss_mpi_ai_enable_resample、ss_mpi_ai_disable_resample、ss_mpi_ao_enable_resample、ss_mpi_ao_disable_resample。

  • libvqe_res.so仅在不使能重采样,且ai和ao设置的采样率与vqe工作采样率一致的情况下可剪裁。

  • libvqe_common.so在不使用AEC、AGC、ANR、EQ功能模块时可剪裁。

  • libvqe_record.so仅在ss_mpi_ai_set_record_vqe_attr设置属性之后使用,该库涵盖了HPF、HDR、RNR、DRC、EQ、AGC等功能,因此调用ss_mpi_ai_set_record_vqe_attr接口设置vqe属性启动vqe时,在无需重采样的情况下只需要libvqe_ record.so库(在需要重采样的情况下还需要libvqe_res.so及相关库),不再需要libvqe_common.so、libvqe_hpf.so等其他库。

  • libvqe_talkv2.so仅在ss_mpi_ai_set_talk_vqe_v2_attr设置属性之后使用,该库涵盖了PNR、NR、EQ、AGC、DRC、LIMITER、DEREVERB、FMP等功能,因此调用ss_mpi_ai_set_talk_vqe_v2_attr接口设置vqe属性启动vqe时,在无需重采样及降风噪的情况下只需要libvqe_talkv2.so库(在需要重采样的情况下还需要libvqe_res.so及相关库,在需要降风噪的情况下还需要libvqe_wnr.so及相关库),不再需要libvqe_common.so、libvqe_eq.so等其他库。

  • 使用音频动态库时,需在执行应用程序前指定音频动态库的路径或者将音频动态库拷贝到“/usr/lib”目录下。动态库是在运行时加载的,因此在编译应用程序时不需要链接动态库。

  • VQE相关动态库需要依赖libsecurec.so库。

  • AEC功能开启时需要同时从对应的AI和AO通道分别获取输入帧和参考帧,在未使能对应的AO通道的情况下开启AEC功能可能会导致其它VQE和重采样模块处理异常,建议在使能对应的AO通道之后再开启AEC功能,同时在关闭AEC功能之后再关闭对应的AO通道。

表 2 Vqe、HiFiVqe、TalkVqe和RecordVqe接口支持情况表

接口

Vqe

HiFiVqe

TalkVqe

RecordVqe

TalkVqeV2

SS528V100

不支持

不支持

支持

支持

不支持

SS524V100

不支持

不支持

支持

支持

不支持

SS928V100

不支持

不支持

支持

支持

支持

SS626V100

不支持

不支持

支持

支持

不支持

UpVQE是负责对AI数据进行处理的调度逻辑。在上行AI通路中,UpVQE的处理流程如图1所示。

图 1 UpVQE处理流程图

DnVQE是负责对AO数据进行处理的调度逻辑。在AO下行通路中,DnVQE的处理流程如图2所示:

图 2 DnVQE处理流程图

须知:

  • 当AI通道模式设为OT_AI_CHN_MODE_NORMAL时,在AI内部的处理线程中完成VQE处理;当AI通道模式设为OT_AI_CHN_MODE_FAST时,在ss_mpi_ai_get_frame接口内部完成VQE处理。

  • 当AI通道模式设为OT_AI_CHN_MODE_FAST且AI-AENC/AO的数据传输方式为系统绑定方式时,使能AI的任何VQE功能均不起作用。

  • 当AI-AO的数据传输方式为系统绑定方式时,使能AO的VQE功能不起作用。

  • 当AI通道模式设为OT_AI_CHN_MODE_FAST且AI-AENC/AO的数据传输方式为非系统绑定方式时,使能AI上行通路的VQE功能后,VQE功能在ss_mpi_ai_get_frame接口内部进行处理,用户可以通过该MPI接口获取VQE处理后的AI音频帧,然后发送给AENC/AO,以建立AI-AENC或AI-AO的数据传输。

  • 当AI通道模式设为OT_AI_CHN_MODE_FAST时,使能AI上行通路的VQE功能后,建议不要在调用ss_mpi_ai_get_frame获取该AI通道的数据之后再将同一个AI通道绑定到AENC通道,否则会导致VQE处理异常。

  • 当AI通道模式设为OT_AI_CHN_MODE_NORMAL时,支持同一个AI通道绑定多个AENC通道,也支持在AI绑定AENC通道后再调用ss_mpi_ai_get_frame获取同一个AI通道的数据。

  • 当AI通道模式需要设为OT_AI_CHN_MODE_FAST及需要使能AI上行通路的VQE功能时,建议AI设备的帧长不要设置为太小的值,否则在调用ss_mpi_ai_get_frame接口获取前几帧数据会导致出现VQE处理异常的情况。

  • VQE支持对采样率为8kHz,11.025kHz,12kHz,16kHz,22.05kHz,24kHz,32kHz,44.1kHz,48kHz的数据做处理;不支持对采样率:64kHz, 96kHz的数据做处理。

AEC

AEC为回声抵消(Acoustic Echo Cancellation)模块,主要工作在需要进行去除回声的场景下:如_录像机_对讲,远端语音数据在AO设备上播放,此时在本地通过MIC采集语音数据,它支持消除录制的语音数据中的AO设备播放的声音(回声)。

图 3 回声抵消示意图

与其他功能模块只需要Sin数据不同,AEC模块需要Sin(Signal In)和Rin(Reference In)两路数据来进行算法处理,最终得到处理后的sou(Signal Out)数据。其中,Sin为加入了回声的近端输入,Rin为参考帧(回声)数据。成功启用回声抵消需要具备一定条件:AI和AO的通道数必须保持一致。 talk vqe模式下仅支持单声道模式,工作采样率为8kHz、16kHz,talkv2 vqe模式下仅支持立体声模式,工作采样率为16kHz,且MIC采集语音数据的AI帧长和远程语音播放的AO配置帧长必须相同。以上条件AI和AO都必须满足。

ANR

ANR为语音降噪(Audio Noise Reduction)模块,主要工作在需要去除外界噪声,保留语音输入的场景下。

与RNR算法比起来,ANR更讲究噪声处理的干净程度。ANR会滤除一些环境声音,主要保留语音数据,并会带来一定的细节丢失。所以ANR算法更适用于NVR和_录像机_场景。在这两个场景下,我们更希望能够着重保留人声,滤除其他噪声。

须知: 语音降噪功能仅支持8kHz,16kHz采样率,不支持立体声。

RNR

RNR为录音噪声消除(Record Noise Reduction)模块,主要工作在需要去除环境噪声,但保留小信号输入的场景下。

与ANR算法比起来,RNR更讲究细节输入(小信号)的保留度,RNR会在降噪的同时保留小信号的输入,所以降噪力度会低一点,但能更多的保留现场声音,真实还原场景,适用于运动DV场景。

须知: 录音噪声消除功能如下:

  • 工作采样率 在VQE接口中使用支持8kHz、16kHz、48kHz采样率 在HiFiVQE接口中使用仅支持48kHz采样率 在RecordVQE接口中使用支持16kHz、48kHz采样率

  • 在RecordVQE接口支持单声道和立体声,其他接口仅支持单声道。

DRC

DRC为动态压缩控制(Dynamic Range Control)模块,负责控制输出电平,将输出增益控制在一个范围,主要工作在需要保证声音不至于过大或过小的场景下。

DRC与AGC作用相似,但算法实现及调节力度不同。其配合RNR使用在运动DV场景,与AEC/ANR互斥。

须知: 动态压缩控制功能如下:

  • 工作采样率 在HiFiVQE接口中使用支持48kHz采样率 在RecordVQE接口中使用支持16kHz、48kHz采样率 在TalkVQEV2接口中使用支持16kHz采样率

  • RecordVQE接口支持单声道和立体声,TalkVQEV2接口仅支持立体声,其他接口仅支持单声道。

PEQ

PEQ为参量均衡器(Parameter Equalizer)模块,主要对音频数据进行均衡处理,以调节音频数据中各频段声音的增益。

PEQ与EQ均为均衡处理器,但是PEQ调节方式更灵活,适用于运动DV场景。

须知: 参量均衡器功能仅支持48kHz采样率,不支持立体声。

HDR

HDR为高动态范围(High Dynamic Range)模块,主要用于Codec输入音量控制,通过动态调节Codec增益控制Codec音量在合理范围内,保证声音不至于过大或过小。

须知: 高动态范围功能如下:

  • 工作采样率 在VQE接口中使用时支持8kHz、16kHz、48kHz采样率 在HiFiVQE接口中使用仅支持48kHz采样率 在RecordVQE接口中使用时16kHz,48kHz采样率

  • RecordVQE接口支持单声道和立体声,其他接口仅支持单声道。

HPF

HPF为高通滤波(high-pass filte)模块,主要负责去除低频噪声。

低频噪声来源经常为硬件噪声或工频噪声,表现为轰轰轰类不舒适的声音。我们可以通过使用频谱分析单板在安静环境下录制的码流,来确定是否需要加入该模块。如果低频噪声不是非常明显,并且客户需要保留低频部分的音源,则不建议加入该模块。推荐配置参数为OT_AUDIO_HPF_FREQ_120或OT_AUDIO_HPF_FREQ_150。

须知: 高通滤波功能如下:

  • 工作采样率 在VQE接口中使用时支持8kHz、16kHz、48kHz采样率 在HiFiVQE接口中使用仅支持48kHz采样率 在TalkVQE接口中使用仅支持8kHz、16kHz采样率 在RecordVQE接口中使用时16kHz,48kHz采样率

  • RecordVQE接口支持单声道和立体声,其他接口仅支持单声道。 建议在使用VQE功能时,一直开启高通滤波功能。

AGC

AGC为自动增益控制(Auto Gain Control)模块,主要负责增益控制输出电平,在声音输入音量有大小变化时,能将输出音量控制在比较一致的范围内,主要工作在需要保证声音不至于过大或过小的场景下。

AGC更多起到的作用是放大输入源的声音,以保证音源过小时,经过算法处理后的声音依然很大。AI通路如果使能了AGC功能,那么将不再能够通过调节AI增益来控制输出声音大小。

须知: 自动增益功能如下:

  • 工作采样率 在VQE、TalkVQE接口中使用支持8kHz,16kHz采样率 在RecordVQE接口中使用支持16kHz,48kHz采样率 在TalkVqeV2接口中使用支持16kHz采样率

  • RecordVQE接口支持单声道和立体声,TalkVQEV2接口仅支持立体声,其他接口仅支持单声道。

EQ

EQ模块为均衡处理器(Equalizer)模块,主要对音频数据进行均衡处理,以调节音频数据中各频段声音的增益。

须知:

  • 均衡处理器在VQE、TalkVQE接口中使用时支持,16kHz采样率,在RecordVQE接口中使用时支持16kHz,48kHz采样率,在TalkVQEV2接口中使用时支持16kHz采样率;RecordVQE接口支持单声道和立体声,TalkVQEV2接口仅支持立体声,其他接口仅支持单声道。

  • 均衡器在TalkVqe、RecordVqe接口中使用的前提是,自动增益功能开启;在TalkVQEV2接口中没有此限制。

GAIN

GAIN模块是音量调节模块,主要用于调节AGC开启后的音量大小。

AGC负责对语音的音量进行动态增益控制,算法能够处理的Sin语音电平范围为0dB至-40dB,处理完毕后的语音电平最大值为-2dB,并且在语音最大增益方面做到了30dB的增益,这使得sout的语音电平能够做到-2dB至-10dB,同时也使得通过调整AI增益来调整sout的音量成了一个很困难的事情,因此GAIN模块在VQE处理流程中位于AGC模块后端(如图1所示),以实现AI上行通路的音量调节。

RES

RES模块为重采样(Resampler)模块。当AI上行或AO下行通路中开启VQE各功能模块时,在处理前后各存在一次重采样(如图1图2所示),第一次的作用是将输入采样率下的音频数据转换成功能模块所支持的工作采样率(8kHz/16kHz/48kHz),第二次则将工作采样率下的数据转换成输出采样率。

NR

NR为降噪(Noise Reduction)模块,主要工作在需要去除外界噪声,保留语音输入的场景下。

与ANR算法相比较,NR可支持双麦降噪。NR会滤除一些环境声音,主要保留语音数据,并会带来一定的细节丢失。所以NR算法更适用于NVR和_录像机_场景。在这两个场景下,我们更希望能够着重保留人声,滤除其他噪声。

须知: 降噪功能仅支持16kHz采样率,仅支持立体声。

PNR

PNR为二次降噪(Post Noise Reduction)模块,主要工作在需要去除外界噪声,保留语音输入的场景下。

PNR与NR的作用一样,区别在于其在信号处理的最后阶段进行二次降噪处理。

须知: 二次降噪功能仅支持16kHz采样率,仅支持立体声。

LIMITER

LIMITER为抗削波(Limiter)模块,主要用于控制输出信号电平,防止削波。

须知: 抗削波功能仅支持16kHz采样率,仅支持立体声。

DEREVERB

DEREVERB为去混响(dereverb)模块,主要用于消除混响。

须知: 去混响功能仅支持16kHz采样率,仅支持立体声。

FMP

FMP为并行处理(Frequency Merge Process)模块,主要用于频域融合。

须知: 并行处理功能仅支持16kHz采样率,仅支持立体声。

WNR

WNR为降风噪(Wind Noise Reduction)模块,主要用于消除户外风噪。

须知: 降风噪功能仅支持16kHz采样率,仅支持立体声。

HS

HS为抗啸叫(Howling Suppression)模块,主要用于啸叫抑制。

须知: 抗啸叫功能仅支持16kHz采样率,仅支持立体声。

音频编码和解码

音频编解码流程

SDK音频的编码类型G711、G726、ADPCM_DVI4、ADPCM_ORG_DVI4、ADPCM_IMA均使用CPU软件编解码。所有的解码功能都基于独立封装的音频解码库,核心解码器工作在用户态,使用CPU软件解码。SDK支持通过SYS模块的绑定接口,将一个AI通道绑定到AENC通道,实现录音编码功能;也可以将一个ADEC通道绑定到AO通道,实现解码播放功能。

音频编解码协议

SDK支持的音频编解码协议说明如表1所示。

表 1 音频编解码协议说明

协议

采样率

帧长(采样点)

码率(kbps)

压缩率

CPU消耗

描述

G711

8kHz

80/160/240/320/480

64

2

1 MHz

优点:语音质量最好;CPU消耗小;支持广泛,协议免费。

缺点:压缩效率低。

G.711提供A律与µ律压缩编码,适用于综合业务网和大多数数字电话链路。北美与日本通常采用µ律编码,欧洲和其他地区大都采用A律编码。

G726

8kHz

80/160/240/320/480

16、24、32、40(注:G726编码是一种有损压缩方法,码率比较小时,压缩比和量化误差较大,可能会影响声音质量)

8~3.2

5 MHz

优点:算法简单;语音质量高,多次转换后语音质量有保证,能够在低码率上达到网络等级的话音质量。

缺点:压缩效率较低。

G726_16KBPS与MEDIA_G726_16KBPS两种编码器区别在于编码输出的打包格式。G726_16KBPS适用于网络传输,按“小端”方向进行打包;MEDIA_G726_16KBPS适用于ASF存储,按“大端”方向进行打包。请参考RFC3551.pdf。

ADPCM

8kHz

80/160/240/320/480或81/161/241/321/481

32

4

2 MHz

优点:算法简单;语音质量高,多次转换后语音质量有保证,能够在低码率上达到网络等级的话音质量。

缺点:压缩效率较低。ADPCM_IMA4、ADPCM_ORG_DVI4和 ADPCM_DVI是ADPCM编码算法的三种封包格式。IMA封包格式以第一个采样点作为预测值,DVI封包格式以上一帧作为预测值。即IMA编码每帧需要多输入一个采样点,输入采样点个数为81/161/241/321/481。DVI编码每帧输入采样点个数为80/160/240/320/480。

须知:

  • “cpu消耗”的结果值基于ARM9 288MHz环境,2 MHz表示解码分别占有2M CPU。

  • G726编码是一种有损压缩方法,码率比较小时,压缩比和量化误差较大,可能会影响声音质量。

  • 由于ADPCM_ORG_DVI4没有传输预测值,这样在网络丢包时,可能会引起异常。因此在音频码流网络传输应用中,不推荐使用该协议编码。

  • 当编码或解码协议选择LPCM时,音频编码和解码模块可以录制和播放LPCM格式的原始音频文件。

  • 表中列出来的编码协议,仅支持对单个声道的音频帧进行编码,如果送给编码通道的是立体声音频帧,则只会对左声道数据进行编码,编码出来的码流只带左声道数据。

  • 表中列出来的编解码协议对应函数使用时,编解码协议句柄由用户分配,用户需保证初始化、编解码时使用同一句柄,避免出错。

语音帧结构

使用语音编解码库进行G711、G726、ADPCM格式的编码,编码后的码流遵循以下表格中描述的帧结构,即在每帧码流数据的净荷数据之前填充有4个字节的帧头;使用语音编解码库进行以上格式的解码时,需要读取相应的帧头信息。

表 1 语音帧结构

参数位置(单位:td_s16)

参数比特位说明

参数含义

0

[15:8]

数据帧类型标志位。

01:语音帧;

其他:保留。

[7:0]

保留。

1

[15:8]

帧循环计数器:0~255。

[7:0]

数据净荷长度(单位:td_s16)。

2

[15:0]

净荷数据。

3

[15:0]

净荷数据。

……

[15:0]

净荷数据。

2+n-1

[15:0]

净荷数据。

2+n

[15:0]

净荷数据。

音频接口与设备的对应关系

芯片集成的AIO内部分两类:只支持音频输入的AIP和只支持音频输出的AOP,相应的AIO规格详见对应芯片的用户指南。

  • SS528V100/SS524V100的AIO中AIP/AOP与AI、AO关系如图1所示。

  • SS928V100的AIO中AIP/AOP与AI、AO关系如图2所示。

  • SS626V100的AIO中AIP/AOP与AI、AO关系如图3所示。

AIO接口中只支持音频输出的AOP0可以配置是否共用帧同步时钟和位流时钟给AIP0使用。共用时,AI设备0和AO设备0的帧同步时钟与位流时钟必须相同,即工作模式必须一致,采样频率也必须一致,并且位流时钟按二者中的较高频率进行配置。

图 1 SS528V100/SS524V100 AIO中AIP/AOP与AI、AO关系示意图

图 2 SS928V100 AIO中AIP/AOP与AI、AO关系示意图

图 3 SS626V100 AIO中AIP/AOP与AI、AO关系示意图

说明: AIP0与AOP0同时对接同一个Codec,可用于语音对讲。

音频的输入输出设备号范围

音频输入输出设备号范围如表1所示。

表 1 音频输入输出设备号

解决方案

音频输入设备ID

音频输出设备ID

SS528V100

[0, 1]

[0, 1]

SS524V100

[0, 1]

[0, 1]

SS928V100

[0]

[0, 1]

SS626V100

[0]

[0, 2]

音频的输入输出设备的通道数范围

音频输入输出设备通道数范围如表1所示。

表 1 音频输入输出设备通道数

解决方案

音频输入设备通道数范围

音频输出设备通道数范围

SS528V100

[0, OT_AI_MAX_CHN_NUM)

[0, OT_AO_MAX_CHN_NUM)

SS524V100

[0, OT_AI_MAX_CHN_NUM)

[0, OT_AO_MAX_CHN_NUM)

SS928V100

[0, OT_AI_MAX_CHN_NUM)

[0, OT_AO_MAX_CHN_NUM)

SS626V100

[0, OT_AI_MAX_CHN_NUM)

[0, OT_AO_MAX_CHN_NUM)

内置Audio Codec

概述

SS625V100/SS928V100/SS626V100提供一个内置的Audio Codec(其中,SS625V100采用V770,SS928V100/SS626V100采用RemixV100),用于对接AIP0/AOP0实现声音的播放和录制。AIP0/AOP0接口可以选择对接内置的Audio Codec或外接的Audio Codec,进行声音的播放及录制。因为内置Audio Codec不能发送同步时钟,所以AIP0/AOP0接口对接内置Codec时只能配置为I2S时序的主模式,用户仍需要正确配置AIP0/AOP0和内置Audio Codec对接的时序才可接收或发送音频数据。

说明:

  • SS528V100/SS524V100无内置Audio Codec。

  • SS625V100只支持左声道ADC,不支持右声道ADC。

重要概念

内置Audio Codec在单端模式下,会有6dB的衰减,需要增加6dB的模拟部分增益,差分模式没有该限制。

内置Audio Codec分为模拟部分和数字部分。模拟部分可以通过模拟混音(MICPGA)选择由麦克风输入或LINEIN输入,模拟混音支持增益调节。数字部分有ADC和DAC,完成模拟信号和数字信号之间的转换,并且可分别调节音量。用户在进行音量调节时,可综合模拟部分和数字部分的音量调节,建议优先调节模拟部分音量。

内置Audio Codec的DAC支持软静音和软撤销静音。软静音控制数字音频数据被逐渐衰减到0,软撤销静音控制数字音频数据逐渐增大到配置的增益值,改变的速率由mute_rate控制。当软静音使能时,数字音频数据将会逐渐静音为0;当软静音禁用时,数字音频数据恢复为配置的增益值。

内置Audio Codec的工作时钟由AIP0/AOP0提供,并由工作时钟分别产生模拟部分和数字部分的时钟,再由数字部分的时钟产生ADC的时钟和DAC的时钟。如果默认配置下声音不正常,可以配置数字部分时钟和模拟部分时钟反向,或DAC时钟和ADC时钟反向。内置Audio Codec配置默认采样精度为16bit。

另外内置Audio Codec支持去加重滤波、pop音抑制和高通滤波,并默认开启这些功能。

ioctl函数

内置Audio Codec的用户态接口以ioctl形式体现,其形式如下:

int ioctl (int fd,
    unsigned long cmd,
    ……
);

该函数是Linux标准接口,具备可变参数特性。但在Audio Codec中,实际只需要3个参数。因此,其语法形式等同于:

int ioctl (int fd,
    unsigned long cmd,
    CMD_DATA_TYPE *cmddata);

其中,CMD_DATA_TYPE随参数cmd的变化而变化。这3个参数的详细描述如表1所示。

表 1 ioctl函数的3个参数

参数名称

描述

输入/输出

fd

内置Audio Codec设备文件描述符,是调用open函数打开内置Audio Codec设备文件之后的返回值。

输入

cmd

主要的cmd(命令控制字)如下:

  • OT_ACODEC_SOFT_RESET_CTRL:将内置Codec恢复为默认设置
  • OT_ACODEC_SET_I2S1_FS:设置I2S1接口采样率
  • OT_ACODEC_SET_INPUT_VOLUME:输入总音量控制
  • OT_ACODEC_GET_INPUT_VOLUME:获取输入总音量
  • OT_ACODEC_SET_OUTPUT_VOLUME:输出总音量控制
  • OT_ACODEC_GET_OUTPUT_VOLUME:获取输出总音量
  • OT_ACODEC_SET_MIXER_MIC:输入方式选择
  • OT_ACODEC_SET_GAIN_MICL:左声道输入的模拟增益控制
  • OT_ACODEC_SET_GAIN_MICR:右声道输入的模拟增益控制
  • OT_ACODEC_SET_DACL_VOLUME:左声道输出音量控制
  • OT_ACODEC_SET_DACR_VOLUME:右声道输出音量控制
  • OT_ACODEC_SET_ADCL_VOLUME:左声道输入音量控制
  • OT_ACODEC_SET_ADCR_VOLUME:右声道输入音量控制
  • OT_ACODEC_SET_MICL_MUTE:左声道输入静音控制
  • OT_ACODEC_SET_MICR_MUTE:右声道输入静音控制
  • OT_ACODEC_SET_DACL_MUTE:左声道输出静音控制
  • OT_ACODEC_SET_DACR_MUTE:右声道输出静音控制
  • OT_ACODEC_DAC_SOFT_MUTE:输出软静音控制
  • OT_ACODEC_DAC_SOFT_UNMUTE:输出软撤销静音控制
  • OT_ACODEC_ENABLE_BOOSTL:左声道boost模拟增益控制
  • OT_ACODEC_ENABLE_BOOSTR:右声道boost模拟增益控制
  • OT_ACODEC_GET_GAIN_MICL:获取模拟左声道输入的增益
  • OT_ACODEC_GET_GAIN_MICR:获取模拟右声道输入的增益
  • OT_ACODEC_GET_DACL_VOLUME:获取左声道输出的音量控制
  • OT_ACODEC_GET_DACR_VOLUME:获取右声道输出的音量控制
  • OT_ACODEC_GET_ADCL_VOLUME:获取左声道输入的音量控制
  • OT_ACODEC_GET_ADCR_VOLUME:获取右声道输入的音量控制
  • OT_ACODEC_SET_PD_DACL:左声道输出的下电控制
  • OT_ACODEC_SET_PD_DACR:右声道输出的下电控制
  • OT_ACODEC_SET_PD_ADCL:左声道输入的下电控制
  • OT_ACODEC_SET_PD_ADCR:右声道输入的下电控制
  • OT_ACODEC_SET_PD_LINEINL:左声道LINEIN输入的下电控制
  • OT_ACODEC_SET_PD_LINEINR:右声道LINEIN输入的下电控制
  • OT_ACODEC_SELECT_DAC_CLK:设置DAC的时钟沿同沿或反沿
  • OT_ACODEC_SELECT_ADC_CLK:设置ADC的时钟沿同沿或反沿
  • OT_ACODEC_SELECT_ANA_MCLK:设置模拟部分和数字部分的时钟沿同沿或反沿
  • OT_ACODEC_DACL_SELECT_TRACK:设置DACL选择左声道或右声道
  • OT_ACODEC_DACR_SELECT_TRACK:设置DACR选择左声道或右声道
  • OT_ACODEC_ADCL_SELECT_TRACK:设置ADCL选择左声道或右声道
  • OT_ACODEC_ADCR_SELECT_TRACK:设置ADCR选择左声道或右声道
  • OT_ACODEC_SET_DAC_DE_EMPHASIS:DAC的去加重滤波控制
  • OT_ACODEC_SET_ADC_HP_FILTER:ADC的高通滤波控制
  • OT_ACODEC_DAC_SOFT_MUTE_RATE:DAC软静音速率控制
  • OT_ACODEC_SET_I2S1_DATA_WIDTH:I2S1数据接口位宽

输入

cmddata

各cmd对应的数据指针

输入/输出

音量调节原理

原始音频信号以模拟信号形式进入Audio Codec,数字信号的幅值可通过左右声道通路的PGA、BOOST、ADC三个模块依次进行调节。其中,PGA、BOOST提供模拟增益调节,ADC提供数字音量调节,所涉及的ioctl函数如图1所示。

图 1 输入音量调节示意图

表 1 输入音量设置的相关ioctl函数

模块

涉及的ioctl函数

PGA

  • OT_ACODEC_SET_INPUT_VOLUME
  • OT_ACODEC_SET_GAIN_MICL
  • OT_ACODEC_SET_GAIN_MICR

BOOST

  • OT_ACODEC_SET_INPUT_VOLUME
  • OT_ACODEC_ENABLE_BOOSTL
  • OT_ACODEC_ENABLE_BOOSTR

ADC

  • OT_ACODEC_SET_INPUT_VOLUME
  • OT_ACODEC_SET_ADCL_VOLUME
  • OT_ACODEC_SET_ADCR_VOLUME

API参考

音频API接口依赖ss_mpi_sys_init和ss_mpi_sys_exit的顺序调用,不支持异步调用ss_mpi_sys_init和ss_mpi_sys_exit。

  • 用户在初始化时,需要先调用ss_mpi_sys_init,再调用音频相关的接口(ss_mpi_audio_register_vqe_mod接口除外)初始化;

  • 在去初始化时,需要先调用音频相关接口去初始化,再调用ss_mpi_sys_exit。

音频基础属性

音频基础属性(AUDIO)主要实现音频系统的基础属性配置功能。

该模块提供以下MPI:

  • ss_mpi_audio_set_mod_param:设置Audio模块参数属性。

  • ss_mpi_audio_get_mod_param:获取Audio模块参数属性。

  • ss_mpi_audio_register_vqe_mod:注册声音质量增强及重采样模块。

ss_mpi_audio_set_mod_param

【描述】

设置Audio模块参数属性。

【语法】

td_s32 ss_mpi_audio_set_mod_param(const ot_audio_mod_param *mod_param);

【参数】

参数名称

描述

输入/输出

mod_param

AUDIO模块参数属性指针。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

音频模块参数支持配置AIAO的时钟源属性。

  • 时钟源

    SS528V100/SS928V100/SS626V100音频支持2个时钟源:基础时钟源(SPLL)和备用时钟源。

    基础时钟源(SPLL)会带来更好的音频电性能。但是,当默认时钟源(SPLL)被其他模块(如MIPI)使用时,此时需要切换到备用时钟源。

    • SS528V100默认使用备用时钟源;

    • SS928V100/SS626V100默认使用基础时钟源。

  • 该接口为整个音频系统的基础接口,该接口的调用必须在其他模块(AI/AO/ACODEC/AENC/ADEC)的接口之前。

  • 仅SS528V100/SS928V100/SS626V100支持该接口。

【举例】

下面的代码实现设置AUDIO模块参数属性。

td_s32 ret; 
ot_audio_mod_param mod_param;
 
mod_param.clk_select = OT_AUDIO_CLKSEL_BASE;
 
/* set audio mode parameter. */
ret = ss_mpi_audio_set_mod_param(&mod_param);
if (ret != TD_SUCCESS) {
       printf("set audio mode parameter fail: ERRPARAM(%d)\n", mod_param.clk_select);
         return ret;
}

ss_mpi_audio_get_mod_param

【描述】

获取AUDIO模块参数属性。

【语法】

td_s32 ss_mpi_audio_get_mod_param(ot_audio_mod_param *mod_param);

【参数】

参数名称

描述

输入/输出

mod_param

AUDIO模块参数属性指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 获取的属性为前一次配置的属性。

  • 如果从来没有配置过属性,则返回默认属性。

【举例】

td_s32 ret;
ot_audio_mod_param mod_param;
 
ret = ss_mpi_audio_get_mod_param(&mod_param);
if (ret != TD_SUCCESS) {
    printf("get audio mode parameter fail\n");
    return ret;
}

ss_mpi_audio_register_vqe_mod

【描述】

注册声音质量增强及重采样模块。

【语法】

td_s32 ss_mpi_audio_register_vqe_mod(const ot_audio_vqe_register *vqe_register);

【参数】

参数名称

描述

输入/输出

vqe_register

声音质量增强及重采样模块注册结构体指针。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h、ss_vqe_register.h

  • 库文件:libss_mpi.a、libss_upvqe.a、libss_dnvqe.a、libvqe_rnr.a、libvqe_hpf.a、libvqe_gain.a、libvqe_eq.a、libvqe_anr.a、libvqe_agc.a、libvqe_aec.a、 libvqe_hdr.a、libvqe_record.a、libvqe_peq.a、libvqe_drc.a、libvqe_res.a

【注意】

该接口仅支持注册声音质量增强及重采样模块的静态库,可根据实际应用场景选用所需的功能模块。

  • 用户通过传入声音质量增强及重采样模块注册结构体,向音频系统注册选定的模块,其中选定模块的注册句柄不能为空,未选定模块的注册句柄须置空。

  • 对于注册句柄,用户可调用各模块的句柄获取接口进行获取。

  • 该接口为整个音频系统的基础接口,该接口的调用必须在ss_mpi_sys_init接口之前。

  • 当存在同一模块的静态库已注册且动态库已放置在/usr/lib/目录的情况下,默认优先使用已注册的静态库。

  • 该接口只允许成功调用一次,不支持重复注册。

【举例】

下面的代码实现注册声音质量增强及重采样模块。

td_s32 ret; 
ot_audio_vqe_register vqe_register = {0};
 
vqe_register.resample_mod_cfg.handle = ss_vqe_resample_get_handle();
vqe_register.hpf_mod_cfg.handle = ss_vqe_hpf_get_handle();
vqe_register.hdr_mod_cfg.handle = ss_vqe_hdr_get_handle();
vqe_register.gain_mod_cfg.handle = ss_vqe_gain_get_handle();
 
vqe_register.record_mod_cfg.handle = ss_vqe_record_get_handle();
 
vqe_register.peq_mod_cfg.handle = ss_vqe_peq_get_handle();
vqe_register.drc_mod_cfg.handle = ss_vqe_drc_get_handle();
vqe_register.rnr_mod_cfg.handle = ss_vqe_rnr_get_handle();
 
vqe_register.aec_mod_cfg.handle = ss_vqe_aec_get_handle();
vqe_register.agc_mod_cfg.handle = ss_vqe_agc_get_handle();
vqe_register.anr_mod_cfg.handle = ss_vqe_anr_get_handle();
vqe_register.eq_mod_cfg.handle = ss_vqe_eq_get_handle();
 
/* register vqe module. */
ret = ss_mpi_audio_register_vqe_mod(&vqe_register);
if (ret != TD_SUCCESS) {
       printf("register vqe module fail, ret = %d\n", ret);
       return ret;
}

音频输入

音频输入(AI)主要实现配置及启用音频输入设备、获取音频帧数据等功能。

该功能模块提供以下MPI:

  • ss_mpi_ai_set_pub_attr:设置AI设备属性。

  • ss_mpi_ai_get_pub_attr:获取AI设备属性。

  • ss_mpi_ai_enable:启用AI设备。

  • ss_mpi_ai_disable:禁用AI设备。

  • ss_mpi_ai_enable_chn:启用AI通道。

  • ss_mpi_ai_disable_chn:禁用AI通道。

  • ss_mpi_ai_get_frame:获取音频帧。

  • ss_mpi_ai_release_frame:释放音频帧。

  • ss_mpi_ai_set_chn_param:设置AI通道参数。

  • ss_mpi_ai_get_chn_param:获取AI通道参数。

  • ss_mpi_ai_enable_resample:启用AI重采样。

  • ss_mpi_ai_disable_resample:禁用AI重采样。

  • ss_mpi_ai_set_talk_vqe_attr:设置AI的声音质量增强功能(Talk)相关属性。

  • ss_mpi_ai_get_talk_vqe_attr:获取AI的声音质量增强功能(Talk)相关属性。

  • ss_mpi_ai_set_record_vqe_attr:设置AI的声音质量增强功能(Record)相关属性。

  • ss_mpi_ai_get_record_vqe_attr:获取AI的声音质量增强功能(Record)相关属性。

  • ss_mpi_ai_set_talk_vqe_v2_attr:设置AI的声音质量增强功能(Talk V2)相关属性。

  • ss_mpi_ai_get_talk_vqe_v2_attr:获取AI的声音质量增强功能(Talk V2)相关属性。

  • ss_mpi_ai_enable_vqe:使能AI的声音质量增强功能。

  • ss_mpi_ai_disable_vqe:禁用AI的声音质量增强功能。

  • ss_mpi_ai_set_track_mode:设置声道模式。

  • ss_mpi_ai_get_track_mode:获取声道模式。

  • ss_mpi_ai_get_fd:获取AI通道对应设备文件句柄。

  • ss_mpi_ai_clr_pub_attr:清除AI设备属性。

  • ss_mpi_ai_save_file:开启音频输入保存文件功能。

  • ss_mpi_ai_query_file_status:查询音频输入通道是否处于存文件的状态。

  • ss_mpi_ai_enable_aec_ref_frame:在AEC不打开的情况下也使用户能获取到AEC参考帧。

  • ss_mpi_ai_disable_aec_ref_frame:在AEC不打开的情况下禁止获取AEC参考帧。

  • ss_mpi_ai_set_chn_attr:设置AI通道属性。

  • ss_mpi_ai_get_chn_attr:获取AI通道属性。

ss_mpi_ai_set_pub_attr

【描述】

设置AI设备属性。

【语法】

td_s32 ss_mpi_ai_set_pub_attr(ot_audio_dev ai_dev, const ot_aio_attr *attr);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

attr

AI设备属性指针。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

音频输入设备的属性决定了输入数据的格式,输入设备属性包括工作模式、采样率、采样精度、buffer大小、每帧的采样点数、扩展标志、时钟选择和通道数目。这些属性应与对接Codec配置的时序一致,即能成功对接。

  • 工作模式

    音频输入输出目前支持I2S主模式、I2S从模式、标准PCM主模式、标准PCM从模式、自定义PCM主模式以及自定义PCM从模式。

    由于时序的问题,AI设备在从模式下,建议用户先配置好对接的Codec,再配置AI设备;而在主模式下,建议用户先配置好AI设备,再配置对接的Codec。

  • 采样率

    采样率指一秒中内的采样点数,采样率越高表明失真度越小,处理的数据量也就随之增加。一般来说语音使用8kHz采样率,音频使用32kHz或以上的采样率;设置时请确认对接的Audio Codec是否支持所要设定的采样率。

  • 采样精度

    采样精度指某个通道的采样点数据宽度,同时决定整个设备的通道分布。采样精度可以设置为8bit、16bit或24bit,实际应用中采样精度还受Audio Codec限制。

  • buffer大小

    ot_aio_attr中的frame_num项用于配置AI中用于接收音频数据的缓存的音频帧帧数,建议配置为5以上,否则可能出现采集丢帧等异常。

    SDK内部会创建(frame_num + 1)* 2个VB缓存块,用于储存AI的原始音频帧及回声抵消所需的音频帧,在不需要开启回声抵消的情况下可设置frame_num为所需最大缓存音频帧数的一半。此外,实际应用中frame_num还受限于公共缓存池的可用缓存块数量。

  • usr_frame_depth大小

    ot_ai_chn_param的usr_frame_depth项需保证大于等于5,小于等于ot_aio_attr的frame_num项。

  • 每帧的采样点数

    当音频采样率较高时,建议相应地增加每帧的采样点数目。如要将这些采集到的音频数据送编码,则应保证每帧的持续时长不少于10ms(例如16kHz的采样频率下每帧的采样点数至少应设置为160,如果声音有断断续续,可以适当增加每帧的采样点数,参数设置与具体芯片的性能有关),否则解码后声音可能有异常。

  • 通道数目

    通道数目指当前输入设备的AI功能的通道数目,需与对接的Audio Codec的配置保持一致;支持1路、2路。

  • 扩展标志对AI设备无效。

  • 时钟选择

    • AI必须和AD配合起来才能正常工作,用户必须清楚AD采集的数据分布和通道的关系才能从正确的通道取得数据。AI设备为主模式时,决定AI设备输出时钟的关键配置项是采样率、采样精度以及通道数目,采样精度乘以通道数目即为AI设备时序一次采样的位宽。

    • AIO接口中AI设备与AO设备是各自独立的,AI设备0和AO设备0的帧同步时钟与位流时钟是否共用可以通过clk_share来配置。当clk_share配置为1时,表示AI设备0和AO设备0的帧同步时钟配置与位流时钟配置是共用的,此时要保证AI设备0和AO设备0的帧同步时钟与位流时钟是一致的,当clk_share配置为0时,表示AI设备0和AO设备0的帧同步时钟与位流时钟是由不同的源提供的。当clk_share为1时,AI设备0和AO设备0的帧同步时钟与位流时钟必须相同,即工作模式必须一致,并且采样频率也必须一致,另外AI设备0和AO设备0共用的位流时钟按二者中的较高频率进行配置。

    • 对接内置Codec时,AI设备0和AO设备0的帧同步时钟与位流时钟需要共用,clk_share需要配置为1。

    • AI、AO对接不同设备时需要根据i2s_type配置不同的clk_share,另外在某些场景下配置clk_share无效,驱动内部会自动配置时钟选择。

    • 在SS524V100中,对AI设备0配置clk_share参数无效,驱动内部默认设置为AI设备0共用AO设备0的帧同步时钟与位流时钟。

    • SS928V100的clk_share对应关系如表1所示。

      表 1 SS928V100的clk_share对应关系

      输入设备ID

      输入设备I2S类型

      输出设备ID

      输出设备I2S类型

      clk_share设置

      输入设备使用的时钟

      输出设备使用的时钟

      0

      OT_AIO_I2STYPE_INNERCODEC

      0

      OT_AIO_I2STYPE_INNERCODEC

      必须为1,只支持主模式

      CRG8

      CRG8

      0

      OT_AIO_I2STYPE_INNERCODEC

      0

      OT_AIO_I2STYPE_EXTERN

      必须为1,只支持主模式

      CRG8

      CRG8

      0

      OT_AIO_I2STYPE_EXTERN

      0

      OT_AIO_I2STYPE_INNERCODEC

      输入主模式时必须为1,从模式时必须为0

      主模式为CRG8,从模式为CRG0

      CRG8

      0

      OT_AIO_I2STYPE_EXTERN

      0

      OT_AIO_I2STYPE_EXTERN

      必须为1

      CRG8

      CRG8

    • SS626V100的clk_share对应关系如表2所示。

      表 2 SS626V100的clk_share对应关系

      输入设备ID

      输入设备I2S类型

      输出设备ID

      输出设备I2S类型

      clk_share设置

      输入设备使用的时钟

      输出设备使用的时钟

      0

      OT_AIO_I2STYPE_INNERCODEC

      0

      OT_AIO_I2STYPE_INNERCODEC

      配置无效,驱动固定为1,只支持主模式

      CRG8

      CRG8

      0

      OT_AIO_I2STYPE_INNERCODEC

      0

      OT_AIO_I2STYPE_EXTERN

      配置无效,驱动固定为1,只支持主模式

      CRG8

      CRG8

      0

      OT_AIO_I2STYPE_EXTERN

      0

      OT_AIO_I2STYPE_INNERCODEC

      配置无效,驱动固定为1,只支持主模式

      CRG8

      CRG8

      0

      OT_AIO_I2STYPE_EXTERN

      0

      OT_AIO_I2STYPE_EXTERN

      配置无效,驱动固定为1

      CRG8

      CRG8

    • SS524V100的clk_share对应关系如表3所示。

      表 3 SS524V100的clk_share对应关系

      输入设备ID

      输入设备I2S类型

      输出设备ID

      输出设备I2S类型

      clk_share设置

      输入设备使用的时钟

      输出设备使用的时钟

      0

      OT_AIO_I2STYPE_EXTERN

      0

      OT_AIO_I2STYPE_EXTERN

      配置无效,驱动固定为1

      CRG8

      CRG8

      1

      OT_AIO_I2STYPE_EXTERN

      1

      OT_AIO_I2STYPE_INNERHDMI

      必须为0

      CRG1

      CRG9

    • SS625V100的clk_share对应关系如表4所示。

      表 4 SS625V100的clk_share对应关系

      输入设备ID

      输入设备I2S类型

      输出设备ID

      输出设备I2S类型

      clk_share设置

      输入设备使用的时钟

      输出设备使用的时钟

      0

      OT_AIO_I2STYPE_INNERCODEC

      0

      OT_AIO_I2STYPE_INNERCODEC

      必须为1,只支持主模式

      CRG8

      CRG8

      0

      OT_AIO_I2STYPE_INNERCODEC

      0

      OT_AIO_I2STYPE_EXTERN

      必须为1,只支持主模式

      CRG8

      CRG8

      0

      OT_AIO_I2STYPE_EXTERN

      0

      OT_AIO_I2STYPE_INNERCODEC

      必须为1,只支持主模式

      CRG8

      CRG8

      0

      OT_AIO_I2STYPE_EXTERN

      0

      OT_AIO_I2STYPE_EXTERN

      必须为1

      CRG8

      CRG8

      1

      OT_AIO_I2STYPE_EXTERN

      1

      OT_AIO_I2STYPE_INNERHDMI

      必须为0

      CRG1

      CRG9

    • SS528V100的clk_share对应关系如表5所示。

      表 5 SS528V100的clk_share对应关系

      输入设备ID

      输入设备I2S类型

      输出设备ID

      输出设备I2S类型

      clk_share设置

      输入设备使用的时钟

      输出设备使用的时钟

      0

      OT_AIO_I2STYPE_EXTERN

      0

      OT_AIO_I2STYPE_EXTERN

      必须为1

      CRG8

      CRG8

      1

      OT_AIO_I2STYPE_EXTERN

      1

      OT_AIO_I2STYPE_INNERHDMI

      必须为0

      CRG1

      CRG9

【举例】

下面的代码实现设置AI设备属性及启用AI设备。

td_s32 ret;
ot_aio_attr attr;
ot_audio_dev ai_dev = 0;
 
attr.bit_width = OT_AUDIO_BIT_WIDTH_16;
attr.sample_rate = OT_AUDIO_SAMPLE_RATE_8000;
attr.snd_mode = OT_AUDIO_SOUND_MODE_MONO;
attr.work_mode = OT_AIO_MODE_I2S_SLAVE;
attr.expand_flag = 0;
attr.frame_num = 5;
attr.point_num_per_frame = 160;
attr.chn_cnt = 2;
attr.clk_share = 1;
 
/* set public attribute of AI device*/
ret = ss_mpi_ai_set_pub_attr(ai_dev, &attr);
if (ret != TD_SUCCESS) {
    printf("set ai %d attr err:0x%x\n", ai_dev, ret);
    return ret;
}
/* enable AI device */
ret = ss_mpi_ai_enable(ai_dev);
if (ret != TD_SUCCESS) {
    printf("enable ai dev %d err:0x%x\n", ai_dev, ret);
    return ret;
}

ss_mpi_ai_get_pub_attr

【描述】

获取AI设备属性。

【语法】

td_s32 ss_mpi_ai_get_pub_attr(ot_audio_dev ai_dev, ot_aio_attr *attr);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

attr

AI设备属性指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 获取的属性为前一次配置的属性。

  • 如果从来没有配置过属性,则返回失败。

【举例】

td_s32 ret;
ot_audio_dev ai_dev = 0;
ot_aio_attr attr;
 
ret = ss_mpi_ai_get_pub_attr(ai_dev, &attr);
if (TD_SUCCESS != ret) {
    printf("get ai %d attr err:0x%x\n", ai_dev, ret);
    return ret;
}

ss_mpi_ai_enable

【描述】

启用AI设备。

【语法】

td_s32 ss_mpi_ai_enable(ot_audio_dev ai_dev);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 必须在启用前配置AI设备属性,否则返回属性未配置错误。

  • 如果AI设备已经处于启用状态,则直接返回成功。

【举例】

请参见ss_mpi_ai_set_pub_attr的举例。

ss_mpi_ai_disable

【描述】

禁用AI设备。

【语法】

td_s32 ss_mpi_ai_disable (ot_audio_dev ai_dev);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 如果AI设备已经处于禁用状态,则直接返回成功。

  • 禁用AI设备前必须先禁用该设备下已启用的所有AI通道。

  • 要求在禁用AI设备之前,先禁用与之关联、使用AI的音频数据的AENC通道和AO设备,否则可能导致该接口调用失败。

【举例】

td_s32 ret;
ot_audio_dev ai_dev = 0;
 
ret = ss_mpi_ai_disable(ai_dev);
if (TD_SUCCESS != ret) {
         printf("disable ai %d err:0x%x\n", ai_dev);
         return ret;
}

ss_mpi_ai_enable_chn

【描述】

启用AI通道。

【语法】

td_s32 ss_mpi_ai_enable_chn(ot_audio_dev ai_dev, ot_ai_chn ai_chn);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

支持的通道范围由AI设备属性中的最大通道个数chn_cnt与声道模式snd_mode决定,详见ot_audio_snd_mode定义的描述。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

启用AI通道前,必须先启用其所属的AI设备,否则返回设备未启动的错误码。

【举例】

无。

ss_mpi_ai_disable_chn

【描述】

禁用AI通道。

【语法】

td_s32 ss_mpi_ai_disable_chn(ot_audio_dev ai_dev, ot_ai_chn ai_chn);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

无。

【举例】

无。

ss_mpi_ai_get_frame

【描述】

获取音频帧。

【语法】

td_s32 ss_mpi_ai_get_frame(ot_audio_dev ai_dev, ot_ai_chn ai_chn, ot_audio_frame *frame, ot_aec_frame *aec_frame, td_s32 milli_sec);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

支持的通道范围由AI设备属性中的最大通道个数chn_cnt与声道模式snd_mode决定。

输入

frame

音频帧结构体指针。

输出

aec_frame

回声抵消参考帧结构体指针。

输出

milli_sec

获取数据的超时时间

-1表示阻塞模式,无数据时一直等待;

0表示非阻塞模式,无数据时则报错返回;

>0表示阻塞milli_sec毫秒,超时则报错返回。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 如果AI的回声抵消功能已使能,aec_frame不能是空指针;如果AI的回声抵消功能没有使能,aec_frame可以置为空。

  • AI模块会缓存音频帧数据,用于用户态获取。缓存的深度通过ss_mpi_ai_set_chn_param接口设定,默认为0。

  • milli_sec的值必须大于等于-1,等于-1时采用阻塞模式获取数据,等于0时采用非阻塞模式获取数据,大于0时,阻塞milli_sec毫秒后,没有数据则返回超时并报错。

  • 获取音频帧数据前,必须先使能对应的AI通道。

  • VQE使能的情况下,AI通道启用后,前面几次调用此接口获取数据可能会失败。此时,建议采用阻塞模式(milli_sec等于-1)获取数据,可避免此接口调用失败。

【举例】

无。

ss_mpi_ai_release_frame

【描述】

释放音频帧。

【语法】

td_s32 ss_mpi_ai_release_frame(ot_audio_dev ai_dev, ot_ai_chn ai_chn, const ot_audio_frame * frame, const ot_aec_frame *aec_frame);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

支持的通道范围由AI设备属性中的最大通道个数chn_cnt与声道模式snd_mode决定。

输入

frame

音频帧结构体指针。

输入

aec_frame

回声抵消参考帧结构体指针。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

如果不需要释放回声抵消参考帧,aec_frame置为NULL即可。

【举例】

无。

ss_mpi_ai_set_chn_param

【描述】

设置AI通道参数。

【语法】

td_s32 ss_mpi_ai_set_chn_param(ot_audio_dev ai_dev, ot_ai_chn ai_chn, const ot_ai_chn_param *chn_param);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

支持的通道范围由AI设备属性中的最大通道个数chn_cnt与声道模式snd_mode决定。

输入

chn_param

音频通道参数。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 通道参数目前只有一个成员变量,用于设置用户获取音频帧的缓存深度,默认深度为0。该成员变量的值不能大于30。

  • 建议先调用ss_mpi_ai_get_chn_param接口获取默认配置,再调用本接口修改配置,以便于后续扩展。

【举例】

无。

ss_mpi_ai_get_chn_param

【描述】

获取AI通道参数。

【语法】

td_s32 ss_mpi_ai_get_chn_param(ot_audio_dev ai_dev, ot_ai_chn ai_chn, ot_ai_chn_param *chn_param);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

支持的通道范围由AI设备属性中的最大通道个数chn_cnt与声道模式snd_mode决定。

输入

chn_param

音频通道参数。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

无。

【举例】

无。

ss_mpi_ai_enable_resample

【描述】

启用AI重采样。

【语法】

td_s32 ss_mpi_ai_enable_resample(ot_audio_dev ai_dev, ot_ai_chn ai_chn, ot_audio_sample_rate out_sample_rate);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

支持的通道范围由AI设备属性中的最大通道个数chn_cnt决定。

输入

out_sample_rate

音频重采样的输出采样率。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_upvqe.a、libvqe_res.so

【注意】

  • 在启用AI通道之后,调用此接口启用重采样功能。

  • 允许重复启用重采样功能,但必须保证后配置的属性与之前配置的属性一样。

  • 在禁用AI通道之后,如果重新启用AI通道,并使用重采样功能,需调用此接口重新启用重采样。

【举例】

以AI从32K到8K的重采样为例,配置如下:

/* dev attr of ai */
ot_audio_sample_rate out_sample_rate;
ot_aio_attr aio_attr;
aio_attr.chn_cnt = 2;
aio_attr.bit_width = OT_AUDIO_BIT_WIDTH_16;
aio_attr.sample_rate = OT_AUDIO_SAMPLE_RATE_32000;
aio_attr.snd_mode = OT_AUDIO_SOUND_MODE_MONO;
aio_attr.expand_flag = 1;
aio_attr.frame_num = 30;
aio_attr.point_num_per_frame = 320*4;
out_sample_rate = OT_AUDIO_SAMPLE_RATE_8000;
ret = ss_mpi_ai_enable_resample(ai_dev, ai_chn, out_sample_rate);
if (TD_SUCCESS != ret) {
    printf("func(%s) line(%d): failed, ret:0x%x\n", __FUNCTION__, __LINE__, ret);
    return ret;
}

ss_mpi_ai_disable_resample

【描述】

禁用AI重采样。

【语法】

td_s32 ss_mpi_ai_disable_resample(ot_audio_dev ai_dev, ot_ai_chn ai_chn);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_upvqe.a、libvqe_res.so

【注意】

  • 不再使用AI重采样功能的话,应该调用此接口将其禁用。

  • 要求在调用此接口之前,先禁用使用该AI设备相应通道音频数据的AENC通道和AO通道,否则可能导致该接口调用失败。

ss_mpi_ai_set_talk_vqe_attr

【描述】

设置AI的声音质量增强功能(Talk)相关属性。

【语法】

td_s32 ss_mpi_ai_set_talk_vqe_attr(ot_audio_dev ai_dev, ot_ai_chn ai_chn, ot_audio_dev ao_dev, ot_ao_chn ao_chn, const ot_ai_talk_vqe_cfg *vqe_cfg);

【参数】

参数名称

描述

输入/输出

ai_dev

音频输入设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

取值范围:请参见表1

输入

ao_dev

用于回声抵消的AO设备号。

取值范围:请参见表1

输入

ao_chn

用于回声抵消的AO通道号。

取值范围:请参见表1

输入

vqe_cfg

音频输入声音质量增强配置结构体指针

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_upvqe.a、libvqe_common.so、libvqe_rnr.so、libvqe_hpf.so、libvqe_gain.so、libvqe_eq.so、libvqe_anr.so、libvqe_agc.so libvqe_aec.so、libvqe_hdr.so

【注意】

  • 启用声音质量增强功能前必须先设置相对应AI通道的声音质量增强功能相关属性。

  • 设置AI的声音质量增强功能相关属性前,必须先使能对应的AI通道。

  • 相同AI通道的声音质量增强功能不支持动态设置属性,重新设置AI通道的声音质量增强功能相关属性时,需要先关闭AI通道的声音质量功能,再设置AI通道的声音质量增强功能相关属性。

  • 在设置声音质量增强功能属性时,可通过配置相应的声音质量增强功能属性来选择使能其中的部分功能。

  • TalkVQE主要在_录像机_场景下使用。

【举例】

无。

ss_mpi_ai_get_talk_vqe_attr

【描述】

获取AI的声音质量增强功能(Talk)相关属性。

【语法】

td_s32 ss_mpi_ai_get_talk_vqe_attr(ot_audio_dev ai_dev, ot_ai_chn ai_chn, ot_ai_talk_vqe_cfg *vqe_cfg);

【参数】

参数名称

描述

输入/输出

ai_dev

音频输入设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

取值范围:请参见表1

输入

vqe_cfg

音频输入声音质量增强配置结构体指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_upvqe.a、libvqe_common.so、libvqe_rnr.so、libvqe_hpf.so、libvqe_gain.so、libvqe_eq.so、libvqe_anr.so、libvqe_agc.so、 libvqe_aec.so、libvqe_hdr.so

【注意】

获取声音质量增强功能相关属性前必须先设置相对应AI通道的声音质量增强功能相关属性。

【举例】

无。

ss_mpi_ai_set_record_vqe_attr

【描述】

设置AI的声音质量增强功能(Record)相关属性。

【语法】

td_s32 ss_mpi_ai_set_record_vqe_attr(ot_audio_dev ai_dev, ot_ai_chn ai_chn, const ot_ai_record_vqe_cfg *vqe_cfg);

【参数】

参数名称

描述

输入/输出

ai_dev

音频输入设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

取值范围:请参见表1

输入

vqe_cfg

音频输入声音质量增强配置结构体指针。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_upvqe.a、libvqe_record.so

【注意】

  • 启用声音质量增强功能前必须先设置相对应AI通道的声音质量增强功能相关属性。

  • 设置AI的声音质量增强功能相关属性前,必须先使能对应的AI通道。

  • 相同AI通道的声音质量增强功能不支持动态设置属性,重新设置AI通道的声音质量增强功能相关属性时,需要先关闭AI通道的声音质量功能,再设置AI通道的声音质量增强功能相关属性。

  • 在设置声音质量增强功能属性时,可通过配置相应的声音质量增强功能属性来选择使能其中的部分功能。

  • RecordVQE仅在运动DV场景下使用。在双MIC方案中使用RecordVQE,将AI设备属性配置成立体声模式,可以达到良好的去噪效果。

【举例】

无。

ss_mpi_ai_get_record_vqe_attr

【描述】

获取AI的声音质量增强功能(Record)相关属性。

【语法】

td_s32 ss_mpi_ai_get_record_vqe_attr(ot_audio_dev ai_dev, ot_ai_chn ai_chn, ot_ai_record_vqe_cfg *vqe_cfg);

【参数】

参数名称

描述

输入/输出

ai_dev

音频输入设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

取值范围:请参见表1

输入

vqe_cfg

音频输入声音质量增强配置结构体指针

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a libss_upvqe.a libvqe_record.so

【注意】

获取声音质量增强功能相关属性前必须先设置相对应AI通道的声音质量增强功能相关属性。

【举例】

无。

ss_mpi_ai_set_talk_vqe_v2_attr

【描述】

设置AI的声音质量增强功能(Talk V2)相关属性。

【语法】

td_s32 ss_mpi_ai_set_talk_vqe_v2_attr(ot_audio_dev ai_dev, ot_ai_chn ai_chn, ot_audio_dev ao_dev, ot_ao_chn ao_chn, const ot_ai_talk_vqe_v2_cfg *vqe_cfg);

【参数】

参数名称

描述

输入/输出

ai_dev

音频输入设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

ot_ai_chn请见“系统控制”章节。

取值范围:请参见表1

输入

ao_dev

用于回声抵消的AO设备号,作为保留参数,暂不支持。ot_audio_dev请见“系统控制”章节。

取值范围:请参见表1

输入

ao_chn

用于回声抵消的AO通道号,作为保留参数,暂不支持。

ot_ao_chn请见“系统控制”章节。

取值范围:请参见表1

输入

vqe_cfg

音频输入声音质量增强配置结构体指针。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a libss_upvqe.a、libvqe_talkv2.so、libvqe_wnr.so

【注意】

  • 启用声音质量增强功能前必须先设置相对应AI通道的声音质量增强功能相关属性。

  • 设置AI的声音质量增强功能相关属性前,必须先使能对应的AI通道。

  • 相同AI通道的声音质量增强功能不支持动态设置属性,重新设置AI通道的声音质量增强功能相关属性时,需要先关闭AI通道的声音质量功能,再设置AI通道的声音质量增强功能相关属性。

  • 在设置声音质量增强功能属性时,可通过配置相应的声音质量增强功能属性来选择使能其中的部分功能。

  • TalkVQEV2主要在_录像机_场景下使用。

【举例】

无。

ss_mpi_ai_get_talk_vqe_v2_attr

【描述】

获取AI的声音质量增强功能(Talk V2)相关属性。

【语法】

td_s32 ss_mpi_ai_get_talk_vqe_v2_attr(ot_audio_dev ai_dev, ot_ai_chn ai_chn, ot_ai_talk_vqe_v2_cfg *vqe_cfg);

【参数】

参数名称

描述

输入/输出

ai_dev

音频输入设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

取值范围:请参见表1

输入

vqe_cfg

音频输入声音质量增强配置结构体指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a libss_upvqe.a、libvqe_talkv2.so、libvqe_wnr.so

【注意】

获取声音质量增强功能相关属性前必须先设置相对应AI通道的声音质量增强功能相关属性。

【举例】

无。

ss_mpi_ai_enable_vqe

【描述】

使能AI的声音质量增强功能。

【语法】

td_s32 ss_mpi_ai_enable_vqe(ot_audio_dev ai_dev, ot_ai_chn ai_chn);

【参数】

参数名称

描述

输入/输出

ai_dev

音频输入设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_upvqe.a、libvqe_common.so、libvqe_rnr.so、libvqe_hpf.so、libvqe_gain.so、libvqe_eq.so、libvqe_anr.so、libvqe_agc.so、libvqe_aec.so、libvqe_hdr.so、libvqe_peq.so、libvqe_drc.so

【注意】

  • 启用声音质量增强功能前必须先启用相对应的AI通道。

  • 多次使能相同AI通道的声音质量增强功能时,返回成功。

  • 禁用AI通道后,如果重新启用AI通道,并使用声音质量增强功能,需调用此接口重新启用声音质量增强功能。

【举例】

无。

ss_mpi_ai_disable_vqe

【描述】

禁用AI的声音质量增强功能。

【语法】

td_s32 ss_mpi_ai_disable_vqe(ot_audio_dev ai_dev, ot_ai_chn ai_chn);

【参数】

参数名称

描述

输入/输出

ai_dev

音频输入设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_upvqe.a、libvqe_common.so、libvqe_rnr.so、libvqe_hpf.so、libvqe_gain.so、libvqe_eq.so、libvqe_anr.so、libvqe_agc.so、libvqe_aec.so、libvqe_hdr.so、libvqe_peq.so、libvqe_drc.so

【注意】

  • 不再使用AI声音质量增强功能时,应该调用此接口将其禁用。

  • 多次禁用相同AI通道的声音质量增强功能,返回成功。

【举例】

无。

ss_mpi_ai_set_track_mode

【描述】

设置AI声道模式。

【语法】

td_s32 ss_mpi_ai_set_track_mode(ot_audio_dev ai_dev, ot_audio_track_mode track_mode);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

track_mode

音频输入声道模式。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 在AI设备成功启用后再调用此接口。

  • AI设备工作在I2S模式时,支持设置声道模式,PCM模式下不支持。

【举例】

td_s32 ret;
ot_audio_dev ai_dev = 0;
ot_audio_track_mode track_mode = OT_AUDIO_TRACK_NORMAL;
ot_audio_track_mode temp;
ret = ss_mpi_ai_set_track_mode(ai_dev, track_mode);
if (TD_SUCCESS != ret) {
    printf("Ai set track mode failure! ai_dev: %d, track_mode: %d, ret: 0x%x.\n", ai_dev, track_mode, ret);
    return ret;
}
ret = ss_mpi_ai_get_track_mode(ai_dev, &temp);
if (TD_SUCCESS != ret) {
    printf("Ai get track mode failure! ai_dev: %d, ret: 0x%x.\n", ai_dev, ret);
    return ret;
}

ss_mpi_ai_get_track_mode

【描述】

获取AI声道模式。

【语法】

td_s32 ss_mpi_ai_get_track_mode(ot_audio_dev ai_dev, ot_audio_track_mode *track_mode);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

track_mode

音频输入声道模式指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 在AI设备成功启用后再调用此接口。

  • AI设备工作在I2S模式时,支持获取声道模式,PCM模式下不支持。

【举例】

无。

ss_mpi_ai_get_fd

【描述】

获取音频输入通道号对应的设备文件句柄。

【语法】

td_s32 ss_mpi_ai_get_fd(ot_audio_dev ai_dev, ot_ai_chn ai_chn);

【参数】

参数名称

描述

输入/输出

ai_dev

AI设备号。

取值范围:请参见表1

输入

ai_chn

AI通道号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

正数值

有效返回值。

非正数值

无效返回值。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

无。

【举例】

td_s32 ai_fd;
td_s32 ret;
ot_audio_dev ai_dev = 0;
ot_ai_chn ai_chn = 0;
 
ai_fd = ss_mpi_ai_get_fd(ai_dev, ai_chn);
if(ai_fd <= 0) {
    return TD_FAILURE;
}

ss_mpi_ai_clr_pub_attr

【描述】

清空Pub属性。

【语法】

td_s32 ss_mpi_ai_clr_pub_attr (ot_audio_dev ai_dev);

【参数】

参数名称

描述

输入/输出

ai_dev

AI设备号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

正数值

有效返回值。

非正数值

无效返回值。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 清除设备属性前,需要先停止设备。

  • 当AO设备共用AI设备时钟,且两者设备均未使能时,AO设备属性需要强行切换(修改后属性不满足共时钟要求:sample_rate相同,工作模式相同),建议切换前先使用该接口清除与AI的内部耦合关系。

【相关主题】

无。

ss_mpi_ai_save_file

【描述】

开启音频输入保存文件功能。

【语法】

td_s32 ss_mpi_ai_save_file(ot_audio_dev ai_dev, ot_ai_chn ai_chn, const ot_audio_save_file_info *save_file_info);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

取值范围:请参见表1

输入

save_file_info

音频保存文件属性结构体指针。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 此接口用于dump AI中VQE处理前后的文件,没有使能VQE功能时,使用该接口dump AI数据无效。

  • 在AI通道VQE功能成功启用后再调用此接口。

  • 当AI通道模式设为OT_AI_CHN_MODE_FAST且处于AI-AENC/AI-AO系统绑定模式下,使用该接口dump AI数据无效。

  • 在指定目录下创建三个待写入的文件后再调用此接口,否则会报错。文件名的全称由AI设备号、AI通道号、AI设备的采样率、开启重采样之后的输出采样率(仅对Sou.pcm文件起作用)和用户定义的音频文件名组合而成,其命名格式为:Sin.pcm的完整文件名为“sin_ai_dev%d_chn%d_%dk_%s.pcm”,Rin.pcm的完整文件名为“rin_ai_dev%d_chn%d_%dk_%s.pcm”,Sou.pcm的完整文件名为“sou_ai_dev%d_chn%d_%dk_%s.pcm”。文件命名示例如下:

文件简称

AI设备号

AI通道号

AI设备的采样率

是否开启重采样

重采样之后的输出采样率

用户定义的音频文件保存名称

完整文件名

Sin.pcm

1

2

44100

NA

NA

default

sin_ai_dev1_chn2_44k_default.pcm

Rin.pcm

1

2

16000

NA

NA

default

rin_ai_dev1_chn2_16k_default.pcm

Sou.pcm

1

2

32000

NO

NA

default

sou_ai_dev1_chn2_32k_default.pcm

YES

11025

default

sou_ai_dev1_chn2_11k_default.pcm

  • 此接口调用后会在指定目录下的三个指定文件写入音频数据。Sin.pcm为VQE处理前的输入帧,Rin.pcm为VQE处理前的回声抵消参考帧,Sou.pcm为VQE处理后的输出帧。

  • 实际保存文件的大小以帧长为单位,当帧长乘以获取的帧数不小于指定文件大小时,才会停止保存数据。

【相关主题】

无。

ss_mpi_ai_query_file_status

【描述】

查询音频输入通道是否处于存文件的状态。

【语法】

td_s32 ss_mpi_ai_query_file_status(ot_audio_dev ai_dev, ot_ai_chn ai_chn, ot_audio_file_status *file_status);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

取值范围:请参见表1

输入

file_status

状态属性结构体指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

此接口用于查询音频输入通道是否处于存文件的状态,当用户调用ss_mpi_ai_save_file存储文件后,可调用此接口查询存储的文件是否达到了指定的大小,如果file_status的saving为TD_TRUE,说明还没有达到指定大小,为TD_FALSE则已经达到指定大小。

【相关主题】

无。

ss_mpi_ai_enable_aec_ref_frame

【描述】

在AEC不打开的情况下也使用户能获取到AEC参考帧。

【语法】

td_s32 ss_mpi_ai_enable_aec_ref_frame(ot_audio_dev ai_dev, ot_ai_chn ai_chn, ot_audio_dev ao_dev, ot_ao_chn ao_chn);

【参数】

参数名称

描述

输入/输出

ai_dev

AI设备号。

取值范围:请参见表1

输入

ai_chn

AI通道号。

支持的通道范围由AI设备属性中的最大通道个数chn_cnt决定。

输入

ao_dev

用于获取AEC参考帧的AO设备号。

取值范围:请参见表1

输入

ao_chn

用于获取AEC参考帧的AO通道号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 此接口仅用于在AEC功能关闭的情况下使能获取AEC参考帧,AEC参考帧通过接口ss_mpi_ai_get_frame返回,供用户在上层自己做AEC处理。

  • 如果在AEC功能打开的情况下调用此接口,则返回错误码OT_ERR_AI_NOT_SUPPORT。

  • 必须在AI通道使能的情况下才能调用此接口。

  • 不支持立体声。

【相关主题】

无。

ss_mpi_ai_disable_aec_ref_frame

【描述】

在AEC不打开的情况下禁止获取AEC参考帧。

【语法】

td_s32 ss_mpi_ai_disable_aec_ref_frame(ot_audio_dev ai_dev, ot_ai_chn ai_chn);

【参数】

参数名称

描述

输入/输出

ai_dev

AI设备号。

取值范围:请参见表1

输入

ai_chn

AI通道号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

重复调用本接口返回成功。

【举例】

无。

【相关主题】

无。

ss_mpi_ai_set_chn_attr

【描述】

设置AI通道属性。

【语法】

td_s32 ss_mpi_ai_set_chn_attr(ot_audio_dev ai_dev, ot_ai_chn ai_chn, const ot_ai_chn_attr *chn_attr);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

支持的通道范围由AI设备属性中的最大通道个数chn_cnt与声道模式snd_mode决定。

输入

chn_attr

音频通道属性。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 通道参数目前只有一个成员变量,用于设置通道的工作模式,默认工作模式为OT_AI_CHN_MODE_NORMAL。

  • 建议先调用ss_mpi_ai_get_chn_attr接口获取默认配置,再调用本接口修改配置,以便于后续扩展。

  • 在对获取相邻音频帧间的耗时要求均匀或者需要低延时获取音频帧的场景,可考虑将工作模式设置为OT_AI_CHN_MODE_FAST,值得注意的是该模式下AI-AENC、AI-AO系统绑定方式不支持VQE。

  • 该接口须在启用相对应的AI通道前调用。

【举例】

无。

ss_mpi_ai_get_chn_attr

【描述】

获取AI通道属性。

【语法】

td_s32 ss_mpi_ai_get_chn_attr(ot_audio_dev ai_dev, ot_ai_chn ai_chn, ot_ai_chn_attr *chn_attr);

【参数】

参数名称

描述

输入/输出

ai_dev

音频设备号。

取值范围:请参见表1

输入

ai_chn

音频输入通道号。

支持的通道范围由AI设备属性中的最大通道个数chn_cnt与声道模式snd_mode决定。

输入

chn_attr

音频通道属性。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_comm_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

无。

【举例】

无。

音频输出

音频输出(AO)主要实现启用音频输出设备、发送音频帧到输出通道等功能。

该功能模块提供以下MPI:

  • ss_mpi_ao_set_pub_attr:设置AO设备属性。

  • ss_mpi_ao_get_pub_attr:获取AO设备属性。

  • ss_mpi_ao_enable:启用AO设备。

  • ss_mpi_ao_disable:禁用AO设备。

  • ss_mpi_ao_enable_chn:启用AO通道。

  • ss_mpi_ao_disable_chn:禁用AO通道。

  • ss_mpi_ao_send_frame:发送AO音频帧

  • ss_mpi_ao_enable_resample:启用AO重采样。

  • ss_mpi_ao_disable_resample:禁用AO重采样。

  • ss_mpi_ao_pause_chn:暂停AO通道。

  • ss_mpi_ao_resume_chn:恢复AO通道。

  • ss_mpi_ao_clr_chn_buf:清除AO通道中当前的音频数据缓存。

  • ss_mpi_ao_query_chn_stat:查询AO通道中当前的音频数据缓存状态。

  • ss_mpi_ao_set_track_mode:设置AO设备声道模式。

  • ss_mpi_ao_get_track_mode:获取AO设备声道模式。

  • ss_mpi_ao_set_volume:设置AO设备音量大小。

  • ss_mpi_ao_get_volume:获取AO设备音量大小。

  • ss_mpi_ao_set_mute:设置AO设备静音状态。

  • ss_mpi_ao_get_mute:获取AO设备静音状态。

  • ss_mpi_ao_get_fd:获取AO通道对应的设备文件句柄。

  • ss_mpi_ao_clr_pub_attr:清除AO设备属性。

  • ss_mpi_ao_set_vqe_attr:设置AO的声音质量增强功能相关属性。

  • ss_mpi_ao_get_vqe_attr:获取AO的声音质量增强功能相关属性。

  • ss_mpi_ao_enable_vqe:使能AO的声音质量增强功能。

  • ss_mpi_ao_disable_vqe:禁用AO的声音质量增强功能。

  • ss_mpi_ao_get_chn_delay:获取AO通道中当前的音频延时大小。

  • ss_mpi_ao_save_file:开启音频输出保存文件功能。

  • ss_mpi_ao_query_file_status:查询音频输出通道是否处于存文件的状态。

ss_mpi_ao_set_pub_attr

【描述】

设置AO设备属性。

【语法】

td_s32 ss_mpi_ao_set_pub_attr(ot_audio_dev ao_dev, const ot_aio_attr *attr);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

attr

音频输出设备属性。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 在设置属性之前需要保证AO处于禁用状态,如果处于启用状态则需要首先禁用AO设备。

  • AO必须和DA配合起来才能正常工作,用户必须清楚DA发送的数据分布和通道的关系才能从正确的通道发送数据。

  • 对接外置Codec时,由于时序的问题,在AO设备从模式下,建议用户先配置好对接的Codec,再配置AO设备;而在AO设备主模式下,建议用户先配置好AO设备,再配置对接的Codec。对接内置Codec时,都需要先配置内置Codec,再配置AO设备。

  • 对接内置Codec时,AI设备0和AO设备0的帧同步时钟与位流时钟需要共用,clk_share需要配置为1。

  • AO设备主模式时,决定AO设备输出时钟的关键配置项是采样率、采样精度以及通道数目,采样精度乘以通道数目即为AO设备时序一次采样的位宽。

  • 扩展标志对AO设备无效。

  • 在使用I2S时序多线发送模式时,通道数需要设置为8。

  • AO设备属性结构体中其他项请参见AI模块中相关接口的描述。

【举例】

td_s32 ret;
ot_aio_attr attr;
ot_audio_dev ao_dev = 0;
 
attr.bit_width = OT_AUDIO_BIT_WIDTH_16;
attr.sample_rate = OT_AUDIO_SAMPLE_RATE_8000;
attr.snd_mode = OT_AUDIO_SOUND_MODE_MONO;
attr.work_mode = OT_AIO_MODE_I2S_SLAVE;
attr.expand_flag = 0;
attr.frame_num = 5;
attr.point_num_per_frame = 160;
attr.chn_cnt = 2;
attr.clk_share = 0;
 
/* set ao public attr*/
ret = ss_mpi_ao_set_pub_attr(ao_dev, &attr);
if(TD_SUCCESS != ret) {
    printf("set ao %d attr err:0x%x\n", ao_dev, ret);
    return ret;
}
/* enable ao device*/
ret = ss_mpi_ao_enable(ao_dev);
if(TD_SUCCESS != ret) {
    printf("enable ao dev %d err:0x%x\n", ao_dev, ret);
    return ret;
}

ss_mpi_ao_get_pub_attr

【描述】

获取AO设备属性。

【语法】

td_s32 ss_mpi_ao_get_pub_attr(ot_audio_dev ao_dev, ot_aio_attr *attr);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

attr

音频输出设备属性指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 获取的属性为前一次配置的属性。

  • 如果从未配置过属性,则返回属性未配置的错误。

【举例】

td_s32 ret;
ot_audio_dev ao_dev = 0;
ot_aio_attr attr;
 
/* first enable ao device*/
ret = ss_mpi_ao_get_pub_attr(ao_dev, &attr);
if(TD_SUCCESS != ret) {
    printf("get ao %d attr err:0x%x\n", ao_dev, ret);
    return ret;
}

ss_mpi_ao_enable

【描述】

启用AO设备。

【语法】

td_s32 ss_mpi_ao_enable(ot_audio_dev ao_dev);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 要求在启用前配置AO设备属性,否则会返回属性未配置的错误。

  • 如果AO设备已经启用,则直接返回成功。

【举例】

请参见ss_mpi_ai_set_pub_attr的举例。

ss_mpi_ao_disable

【描述】

禁用AO设备。

【语法】

td_s32 ss_mpi_ao_disable(ot_audio_dev ao_dev);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 如果AO设备已经禁用,则直接返回成功。

  • 禁用AO设备前必须先禁用设备下所有AO通道。

【举例】

无。

ss_mpi_ao_enable_chn

【描述】

启用AO通道。

【语法】

td_s32 ss_mpi_ao_enable_chn(ot_audio_dev ao_dev, ot_ao_chn ao_chn);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

ao_chn

音频输出通道号。

支持的通道范围由AO设备属性中的最大通道个数chn_cnt与声道模式snd_mode决定。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

启用AO通道前,必须先启用其所属的AO设备,否则返回设备未启动的错误码。

【举例】

请参见ss_mpi_ai_set_pub_attr的举例。

ss_mpi_ao_disable_chn

【描述】

禁用AO通道。

【语法】

td_s32 ss_mpi_ao_disable_chn(ot_audio_dev ao_dev, ot_ao_chn ao_chn);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

ao_chn

音频输出通道号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

无。

【举例】

无。

ss_mpi_ao_send_frame

【描述】

发送AO音频帧。

【语法】

td_s32 ss_mpi_ao_send_frame(ot_audio_dev ao_dev, ot_ao_chn ao_chn, const ot_audio_frame *data, td_s32 milli_sec);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

ao_chn

音频输出通道号。

支持的通道范围由AO设备属性中的最大通道个数chn_cnt与声道模式snd_mode决定。

输入

data

音频帧结构体指针。

输入

milli_sec

发送数据的超时时间

-1表示阻塞模式;

0表示非阻塞模式;

>0表示阻塞milli_sec毫秒,超时则报错返回。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 该接口用于用户主动发送音频帧至AO输出,如果AO通道已经通过系统绑定(ss_mpi_sys_bind)接口与AI或ADEC绑定,不需要也不建议调此接口。

  • milli_sec的值必须大于等于-1,等于-1时采用阻塞模式发送数据,等于0时采用非阻塞模式发送数据,大于0时,阻塞milli_sec毫秒后,则返回超时并报错。

  • 调用该接口发送音频帧到AO输出时,必须先使能对应的AO通道。

ss_mpi_ao_enable_resample

【描述】

启用AO重采样。

【语法】

td_s32 ss_mpi_ao_enable_resample(ot_audio_dev ao_dev, ot_ao_chn ao_chn, ot_audio_sample_rate in_sample_rate);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

ao_chn

音频输出通道号。

支持的通道范围由AO设备属性中的最大通道个数chn_cnt决定。

输入

in_sample_rate

音频重采样的输入采样率。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_upvqe.a、libvqe_res.so

【注意】

  • 应该在启用AO通道之后,绑定AO通道之前,调用此接口启用重采样功能。

  • 允许重复启用重采样功能,但必须保证后配置的重采样输入采样率与之前配置的重采样输入采样率一样。

  • 在禁用AO通道后,如果重新启用AO通道,并使用重采样功能,需调用此接口重新启用重采样。

  • AO重采样的输入采样率必须与AO设备属性配置的采样率不相同。

【举例】

以ADEC到AO的解码回放8K到32K重采样为例,配置如下:

/* dev attr of ao */
ot_audio_sample_rate in_sample_rate;
aio_attr.chn_cnt = 2;
aio_attr.bit_width = OT_AUDIO_BIT_WIDTH_16;
aio_attr.sample_rate = OT_AUDIO_SAMPLE_RATE_32000;
aio_attr.snd_mode = OT_AUDIO_SOUND_MODE_MONO;
aio_attr.expand_flag = 1;
aio_attr.frame_num = 30;
aio_attr.point_num_per_frame = 320*4;
in_sample_rate = OT_AUDIO_SAMPLE_RATE_8000;
ret = ss_mpi_ao_enable_resample(ao_dev, ao_chn, in_sample_rate);
if (TD_SUCCESS != ret) {
    printf("func(%s) line(%d): failed, ret:0x%x\n", __FUNCTION__, __LINE__, ret);
    return ret;
}

ss_mpi_ao_disable_resample

【描述】

禁用AO重采样。

【语法】

td_s32 ss_mpi_ao_disable_resample(ot_audio_dev ao_dev, ot_ao_chn ao_chn);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

ao_chn

音频输出通道号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_upvqe.a、libvqe_res.so

【注意】

不再使用AO重采样功能的话,应该调用此接口将其禁用。

【举例】

无。

ss_mpi_ao_pause_chn

【描述】

暂停AO通道。

td_s32 ss_mpi_ao_pause_chn(ot_audio_dev ao_dev, ot_ao_chn ao_chn);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

ao_chn

音频输出通道号。

支持的通道范围由AO设备属性中的最大通道个数chn_cnt与声道模式snd_mode决定。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • AO通道暂停后,如果绑定的ADEC通道继续向此通道发送音频帧数据,发送的音频帧数据将会被阻塞;而如果绑定的AI通道继续向此通道发送音频帧数据,在通道缓冲未满的情况下则将音频帧放入缓冲区,在满的情况下则将音频帧丢弃。

  • 通过ss_mpi_ao_send_frame接口向AO通道发送音频帧数据时,不允许调用此接口暂停该AO通道。

  • AO通道为禁用状态时,不允许调用此接口暂停AO通道。

【举例】

无。

ss_mpi_ao_resume_chn

【描述】

恢复AO通道。

【语法】

td_s32 ss_mpi_ao_resume_chn(ot_audio_dev ao_dev, ot_ao_chn ao_chn);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

ao_chn

音频输出通道号。

支持的通道范围由AO设备属性中的最大通道个数chn_cnt与声道模式snd_mode决定。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • AO通道暂停后可以通过调用此接口重新恢复。

  • AO通道为暂停状态或使能状态下,调用此接口返回成功;否则调用将返回错误。

【举例】

无。

ss_mpi_ao_clr_chn_buf

【描述】

清除AO通道中当前的音频数据缓存。

【语法】

td_s32 ss_mpi_ao_clr_chn_buf(ot_audio_dev ao_dev, ot_ao_chn ao_chn);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

ao_chn

AO通道号。

支持的通道范围由AO设备属性中的最大通道个数chn_cnt与声道模式snd_mode决定。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 在AO通道成功启用后再调用此接口。

  • 为完全清除解码回放通路上所有缓存数据,此接口还应该与ss_mpi_adec_clr_chn_buf接口配合使用。

【举例】

无。

ss_mpi_ao_query_chn_stat

【描述】

查询AO通道中当前的音频数据缓存状态。

【语法】

td_s32 ss_mpi_ao_query_chn_status(ot_audio_dev ao_dev, ot_ao_chn ao_chn, ot_ao_chn_state *status);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

ao_chn

AO通道号。

支持的通道范围由AO设备属性中的最大通道个数chn_cnt与声道模式snd_mode决定。

输入

status

缓存状态结构体指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

在AO通道成功启用后再调用此接口。

【举例】

无。

ss_mpi_ao_set_track_mode

【描述】

设置AO设备声道模式。

【语法】

td_s32 ss_mpi_ao_set_track_mode(ot_audio_dev ao_dev, ot_audio_track_mode track_mode);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

track_mode

音频设备声道模式。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 在AO设备成功启用后再调用此接口。

  • AO设备工作在I2S模式时,支持设置声道模式,PCM模式下不支持。

【举例】

td_s32 ret;
ot_audio_dev ao_dev = 0;
ot_audio_track_mode track_mode = AUDIO_TRACK_NORMAL;
ot_audio_track_mode temp;
ret = ss_mpi_ao_set_track_mode(ao_dev, track_mode);
if (TD_SUCCESS != ret) {
    printf("Ao set track mode failure! ao_dev: %d, track_mode: %d, ret: 0x%x.\n", ao_dev, track_mode, ret);
    return ret;
 }
 ret = ss_mpi_ao_get_track_mode(ao_dev, &temp);
 if (TD_SUCCESS != ret) {
    printf("Ao get track mode failure! ao_dev: %d, ret: 0x%x.\n", ao_dev, ret);
    return ret;
}

ss_mpi_ao_get_track_mode

【描述】

获取AO设备声道模式。

【语法】

td_s32 ss_mpi_ao_get_track_mode(ot_audio_dev ao_dev, ot_audio_track_mode *track_mode);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

track_mode

音频设备声道模式指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 在AO设备成功启用后再调用此接口。

  • AO设备工作在I2S模式时,支持获取声道模式,PCM模式下不支持。

【举例】

无。

ss_mpi_ao_set_volume

【描述】

设置AO设备音量大小。

【语法】

td_s32 ss_mpi_ao_set_volume(ot_audio_dev ao_dev, td_s32 volume_db);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

volume_db

音频设备音量大小(以dB为单位)。

取值范围:[-121, 6]

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

在AO设备成功启用后再调用此接口。

【举例】

无。

ss_mpi_ao_get_volume

【描述】

获取AO设备音量大小。

【语法】

td_s32 ss_mpi_ao_get_volume(ot_audio_dev ao_dev, td_s32 *volume_db);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

volume_db

音频设备音量大小指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

在AO设备成功启用后再调用此接口。

【举例】

无。

ss_mpi_ao_set_mute

【描述】

设置AO设备静音状态。

【语法】

td_s32 ss_mpi_ao_set_mute(ot_audio_dev ao_dev, td_bool enable, const ot_audio_fade *fade);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

enable

音频设备是否启用静音。

TD_TRUE:启用静音功能;

TD_FALSE:关闭静音功能。

输入

fade

淡入淡出结构体指针。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 在AO设备成功启用后再调用此接口。

  • 调用此接口时,用户可以选择是否使用淡入淡出功能,如果不使用淡入淡出则将结构体指针赋为空即可。

【举例】

无。

ss_mpi_ao_get_mute

【描述】

获取AO设备静音状态。

【语法】

td_s32 ss_mpi_ao_get_mute(ot_audio_dev ao_dev, td_bool *enable, ot_audio_fade *fade);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

enable

音频设备静音状态指针。

输出

fade

淡入淡出结构体指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 在AO设备成功启用后再调用此接口。

  • 调用该接口时,参数enable和fade任意一个可以为空,但不能同时为空,否则会报错。

【举例】

无。

ss_mpi_ao_get_fd

【描述】

获取音频输出通道号对应的设备文件句柄。

【语法】

td_s32 ss_mpi_ao_get_fd(ot_audio_dev ao_dev, ot_ao_chn ao_chn);

【参数】

参数名称

描述

输入/输出

ao_dev

AO设备号。

取值范围:请参见表1

输入

ao_chn

AO通道号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

正数值

有效返回值。

非正数值

无效返回值。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

无。

【举例】

td_s32 ao_fd;
td_s32 ret;
ot_audio_dev ao_dev = 0;
ot_ao_chn ao_chn = 0;
 
/* first enable ao device */
ao_fd = ss_mpi_ao_get_fd(ao_dev, ao_chn);
if (ao_fd <= 0) {
    return TD_FAILURE;
}

ss_mpi_ao_clr_pub_attr

【描述】

清除AO设备属性。

【语法】

td_s32 ss_mpi_ao_clr_pub_attr(ot_audio_dev ao_dev);

【参数】

参数名称

描述

输入/输出

ao_dev

AO设备号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

正数值

有效返回值。

非正数值

无效返回值。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 清除设备属性前,需要先停止设备。

  • 当AI设备共用AO设备时钟,且两者设备均未使能时,AI设备属性需要强行切换(修改后属性不满足共时钟要求:sample_rate相同,工作模式相同),建议切换前先使用该接口清除与AO的内部耦合关系。

【相关主题】

无。

ss_mpi_ao_set_vqe_attr

【描述】

设置AO的声音质量增强功能相关属性。

【语法】

td_s32 ss_mpi_ao_set_vqe_attr(ot_audio_dev ao_dev, ot_ao_chn ao_chn, const ot_ao_vqe_cfg *vqe_cfg);

【参数】

参数名称

描述

输入/输出

ao_dev

音频输出设备号。

取值范围:请参见表1

输入

ao_chn

音频输出通道号。

取值范围:请参见表1

输入

vqe_cfg

音频输出声音质量增强配置结构体指针

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_dnvqe.a、libvqe_common.so、libvqe_hpf.so、libvqe_eq.so、libvqe_anr.so libvqe_agc.so

【注意】

  • 启用声音质量增强功能前必须先设置相对应AO通道的声音质量增强功能相关属性。

  • 设置AO的声音质量增强功能相关属性前,必须先使能对应的AO通道。

  • 相同AO通道的声音质量增强功能不支持动态设置属性,重新设置AO通道的声音质量增强功能相关属性时,需要先关闭AO通道的声音质量功能,再设置AO通道的声音质量增强功能相关属性。

  • 在设置声音质量增强功能属性时,可通过配置相应的声音质量增强功能属性来选择使能其中的部分功能。

【举例】

无。

ss_mpi_ao_get_vqe_attr

【描述】

获取AO的声音质量增强功能相关属性。

【语法】

td_s32 ss_mpi_ao_get_vqe_attr(ot_audio_dev ao_dev, ot_ao_chn ao_chn, ot_ao_vqe_cfg *vqe_cfg);

【参数】

参数名称

描述

输入/输出

ao_dev

音频输出设备号。

取值范围:请参见表1

输入

ao_chn

音频输出通道号。

取值范围:请参见表1

输入

vqe_cfg

音频输出声音质量增强配置结构体指针

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_dnvqe.a、libvqe_common.so、libvqe_hpf.so、libvqe_eq.so、libvqe_anr.so、libvqe_agc.so

【注意】

获取声音质量增强功能相关属性前必须先设置相对应AO通道的声音质量增强功能相关属性。

【举例】

无。

ss_mpi_ao_enable_vqe

【描述】

使能AO的声音质量增强功能。

【语法】

td_s32 ss_mpi_ao_enable_vqe(ot_audio_dev ao_dev, ot_ao_chn ao_chn);

【参数】

参数名称

描述

输入/输出

ao_dev

音频输出设备号。

取值范围:请参见表1

输入

ao_chn

音频输出通道号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_dnvqe.a、libvqe_common.so、libvqe_hpf.so、libvqe_eq.so、libvqe_anr.so、libvqe_agc.so

【注意】

  • 启用声音质量增强功能前必须先启用相对应的AO通道。

  • 多次使能相同AO通道的声音质量增强功能时,返回成功。

  • 禁用AO通道后,如果重新启用AO通道,并使用声音质量增强功能,需调用此接口重新启用声音质量增强功能。

【举例】

无。

ss_mpi_ao_disable_vqe

【描述】

禁用AO的声音质量增强功能。

【语法】

td_s32 ss_mpi_ao_disable_vqe(ot_audio_dev ao_dev, ot_ao_chn ao_chn);

【参数】

参数名称

描述

输入/输出

ao_dev

音频输出设备号。

取值范围:请参见表1

输入

ao_chn

音频输出通道号。

取值范围:请参见表1

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_dnvqe.a、libvqe_common.so、libvqe_hpf.so、libvqe_eq.so、libvqe_anr.so、libvqe_agc.so

【注意】

  • 不再使用AO声音质量增强功能时,应该调用此接口将其禁用。

  • 多次禁用相同AO通道的声音质量增强功能,返回成功。

【举例】

无。

ss_mpi_ao_get_chn_delay

【描述】

获取AO通道中当前的音频延时大小。

【语法】

td_s32 ss_mpi_ao_get_chn_delay(ot_audio_dev ao_dev, ot_ao_chn ao_chn, td_u32 *milli_sec)

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

ao_chn

AO通道号。

支持的通道范围由AO设备属性中的最大通道个数chn_cnt与声道模式snd_mode决定。

输入

milli_sec

音频延时的指针。音频延时大小以毫秒为单位。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

在AO通道成功启用后再调用此接口。

【举例】

无。

ss_mpi_ao_save_file

【描述】

开启音频输出保存文件功能。

【语法】

td_s32 ss_mpi_ao_save_file(ot_audio_dev ao_dev, ot_ao_chn ao_chn, const ot_audio_save_file_info *save_file_info);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

ao_chn

音频输出通道号。

取值范围:请参见表1

输入

save_file_info

音频保存文件属性结构体指针。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 没有使能VQE功能时或者是AI-AO系统绑定模式下,使用该接口dump AO数据无效。调用后会在指定目录下写出两个指定大小文件。Sin.pcm为VQE处理前的输入帧,Sou.pcm为VQE处理后的输出帧。

  • 在AO通道VQE功能成功启用后再调用此接口。

  • 在指定目录下创建两个待写入的文件后再调用此接口,否则会报错。文件名的全称由AO设备号、AO通道号、AO设备的采样率、重采样之前的输入采样率(仅对Sin.pcm文件起作用)和用户定义的音频文件名组合而成,其命名格式为:Sin.pcm的完整文件名为“sin_ao_dev%d_chn%d_%dk_%s.pcm”, Sou.pcm的完整文件名为“sou_ao_dev%d_chn%d_%dk_%s.pcm”。文件命名示例如下:

文件简称

AO设备号

AO通道号

AO设备的采样率

是否开启重采样

重采样之前的输入采样率

用户定义的音频文件保存名称

完整文件名

Sin.pcm

1

1

44100

NO

NA

default

sin_ao_dev1_chn1_44k_default.pcm

YES

11025

default

sin_ao_dev1_chn1_11k_default.pcm

Sou.pcm

1

0

32000

NO

NA

default

sou_ao_dev1_chn0_32k_default.pcm

【相关主题】

无。

ss_mpi_ao_query_file_status

【描述】

查询音频输出通道是否处于存文件的状态。

【语法】

td_s32 ss_mpi_ao_query_file_status(ot_audio_dev ao_dev, ot_ao_chn ao_chn, ot_audio_file_status *file_status);

【参数】

参数名称

描述

输入/输出

ao_dev

音频设备号。

取值范围:请参见表1

输入

ao_chn

音频输出通道号。

取值范围:请参见表1

输入

file_status

状态属性结构体指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 此接口用于查询音频输出通道是否处于存文件的状态,当用户调用ss_mpi_ao_save_file存储文件后,可调用此接口查询存储的文件是否达到了指定的大小。

  • 如果file_status的saving为TD_TRUE,则还没有达到指定大小。如果file_status的saving为TD_FALSE,则已经达到指定大小。

【相关主题】

无。

音频编码

音频编码主要实现创建编码通道、发送音频帧编码及获取编码码流等功能。

该功能模块提供以下MPI:

  • ss_mpi_aenc_create_chn:创建音频编码通道。

  • ss_mpi_aenc_destroy_chn:销毁音频编码通道。

  • ss_mpi_aenc_send_frame:发送音频编码音频帧

  • ss_mpi_aenc_get_stream:获取音频编码码流。

  • ss_mpi_aenc_release_stream:释放音频编码码流。

  • ss_mpi_aenc_get_fd:获取音频编码通道号对应的设备文件句柄.

  • ss_mpi_aenc_register_encoder:注册编码器。

  • ss_mpi_aenc_unregister_encoder:注销编码器。

  • ss_mpi_aenc_get_stream_buf_info:获取音频码流buffer相关信息。

  • ss_mpi_aenc_set_mute:设置音频编码通道静音状态。

  • ss_mpi_aenc_get_mute:获取音频编码通道静音状态。

  • ss_mpi_aenc_clr_chn_buf:清除音频编码通道中当前的音频数据缓存。

ss_mpi_aenc_create_chn

【描述】

创建音频编码通道。

【语法】

td_s32 ss_mpi_aenc_create_chn(ot_aenc_chn aenc_chn, const ot_aenc_chn_attr *attr);

【参数】

参数名称

描述

输入/输出

aenc_chn

通道号。

取值范围:0, OT_AENC_MAX_CHN_NUM)。

输入

attr

音频编码通道属性指针。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ot_common_aenc.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_voice_engine.a、libss_upvqe.a

【注意】

  • 协议类型指定该通道的编码协议,目前支持G711、G726、ADPCM,具体内容如[表1所示。

  • 表1中列举的编解码协议只支持16bit线性PCM音频数据处理,如果输入的是8bit采样精度的数据,AENC内部会将其扩展为16bit;建议配置AI设备公共属性时将扩展标志置为1,使得AI数据由8bit自动扩展到16bit。

  • 语音帧结构如表1所示。

  • 音频编码的部分属性需要与输入的音频数据属性相匹配,例如采样率、帧长(每帧采样点数目)等。

  • buffer大小以帧为单位,取值范围是[2, OT_MAX_AUDIO_FRAME_NUM],建议配置为10以上,过小的buffer配置可能导致丢帧等异常。

  • 在通道闲置时才能使用此接口,如果通道已经被创建,则返回通道已经创建的错误。

【举例】

td_s32 ret;         
ot_aenc_chn_attr aenc_attr;
ot_adec_attr_adpcm adpcm_aenc;
ot_audio_dev ai_dev = 0;
ot_ai_chn ai_chn = 0;
ot_aenc_chn aenc_chn = 0;
ot_audio_frame audio_frame;
ot_audio_stream audio_stream;
ot_mpp_chn src_chn, dest_chn;
 
aenc_attr.type = OT_PT_ADPCMA;/* ADPCM */
aenc_attr.buf_size = 8;
aenc_attr.value = &adpcm_aenc;
adpcm_aenc.adpcm_type = OT_ADPCM_TYPE_DVI4;
         
/* create aenc chn*/
ret = ss_mpi_aenc_create_chn(aenc_chn, &aenc_attr);
if (TD_SUCCESS != ret) {
    printf("create aenc chn %d err:0x%x\n", aenc_chn,ret);
    return ret;
}
 
/* bind AENC to AI channel  */
src_chn.mod_id  = OT_ID_AI;
src_chn.dev_id  = ai_dev;
src_chn.chn_id  = ai_chn;
        
dest_chn.mod_id = OT_ID_AENC;
dest_chn.dev_id = 0;
dest_chn.chn_id = aenc_chn;
ret = ss_mpi_sys_bind(&src_chn, &dest_chn);
if (ret != TD_SUCCESS) {
    return ret;
}
 
/* get stream from aenc chn */
ret = ss_mpi_aenc_get_stream(aenc_chn, &audio_stream);
if (TD_SUCCESS != ret) {
    printf("get stream from aenc chn %d fail \n", aenc_chn);
    return ret;
}
 
/* deal with audio stream */
 
/* release audio stream */
ret = ss_mpi_aenc_release_stream(aenc_chn, &audio_stream);
if (TD_SUCCESS != ret ) {
    return ret;
}
 
/* destroy aenc chn */
ret = ss_mpi_aenc_destroy_chn(aenc_chn);
if (TD_SUCCESS != ret) {
    return ret;
}

ss_mpi_aenc_destroy_chn

【描述】

销毁音频编码通道。

【语法】

td_s32 ss_mpi_aenc_destroy_chn(ot_aenc_chn aenc_chn);

【参数】

参数名称

描述

输入/输出

aenc_chn

通道号。

取值范围:[0, OT_AENC_MAX_CHN_NUM)。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ot_common_aenc.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_voice_engine.a、libss_upvqe.a

【注意】

  • 通道未创建的情况下调用此接口会返回成功。

  • 如果正在获取/释放码流或者发送帧时销毁该通道,则会返回失败,用户同步处理时需要注意。

【举例】

请参见ss_mpi_aenc_create_chn的举例。

【相关主题】

ss_mpi_aenc_send_frame

【描述】

发送音频编码音频帧。

【语法】

td_s32 ss_mpi_aenc_send_frame(ot_aenc_chn aenc_chn, const ot_audio_frame *frame, const ot_aec_frame *aec_frame);

【参数】

参数名称

描述

输入/输出

aenc_chn

通道号。

取值范围:[0, OT_AENC_MAX_CHN_NUM)

输入

frame

音频帧结构体指针。

输入

aec_frame

回声抵消参考帧结构体指针。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ot_common_aenc.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_upvqe.a

【注意】

  • 如果不需要回声抵消,aec_frame可置为NULL。

  • 音频编码发送码流是非阻塞接口,如果音频码流缓存满,则直接返回失败。

  • 该接口用于用户主动发送音频帧进行编码,如果AENC通道已经通过系统绑定(ss_mpi_sys_bind)接口与AI绑定,不需要也不建议调此接口。

  • 调用该接口发送音频编码音频帧时,必须先创建对应的编码通道。

【举例】

无。

【相关主题】

无。

ss_mpi_aenc_get_stream

【描述】

获取编码后码流。

【语法】

td_s32 ss_mpi_aenc_get_stream(ot_aenc_chn aenc_chn, ot_audio_stream *stream, td_s32 milli_sec);

【参数】

参数名称

描述

输入/输出

aenc_chn

通道号。

取值范围:[0, OT_AENC_MAX_CHN_NUM)。

输入

stream

获取的音频码流。

输出

milli_sec

获取数据的超时时间

-1表示阻塞模式,无数据时一直等待;

0表示非阻塞模式,无数据时则报错返回;

>0表示阻塞milli_sec毫秒,超时则报错返回。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ot_common_aenc.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 必须创建通道后才可能获取码流,否则直接返回失败,如果在获取码流过程中销毁通道则会立刻返回失败。

  • milli_sec的值必须大于等于-1,等于-1时采用阻塞模式获取数据,等于0时采用非阻塞模式获取数据,大于0时,阻塞milli_sec毫秒后,没有数据则返回超时并报错。

  • 直接获取AI原始音频数据的方法

    创建一路AENC通道,编码协议类型设置为OT_PT_LPCM,绑定AI通道后,从此AENC通道获取的音频数据即AI原始数据。

【举例】

请参见ss_mpi_aenc_create_chn的举例。

【相关主题】

ss_mpi_aenc_release_stream

【描述】

释放从音频编码通道获取的码流。

【语法】

td_s32 ss_mpi_aenc_release_stream(ot_aenc_chn aenc_chn, const ot_audio_stream *stream);

【参数】

参数名称

描述

输入/输出

aenc_chn

通道号。

取值范围:[0, OT_AENC_MAX_CHN_NUM)

输入

stream

获取的码流指针。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ot_common_aenc.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_voice_engine.a

【注意】

  • 码流最好能够在使用完之后立即释放,如果不及时释放,会导致编码过程阻塞。

  • 释放的码流必须是从该通道获取的码流,不得对码流信息结构体进行任何修改,否则会导致码流不能释放,使此码流buffer丢失,甚至导致程序异常。

  • 释放码流时必须保证通道已经被创建,否则直接返回失败,如果在释放码流过程中销毁通道则会立刻返回失败。

【举例】

请参见ss_mpi_aenc_create_chn的举例。

【相关主题】

ss_mpi_aenc_get_fd

【描述】

获取音频编码通道号对应的设备文件句柄。

【语法】

td_s32 ss_mpi_aenc_get_fd(ot_aenc_chn aenc_chn);

【参数】

参数名称

描述

输入/输出

aenc_chn

AENC通道号。

取值范围:0, OT_AENC_MAX_CHN_NUM)

输入

【返回值】

返回值

描述

正数值

有效返回值。

非正数值

无效返回值。

【需求】

  • 头文件:ot_common_aio.h、ot_common_aenc.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

无。

ss_mpi_aenc_register_encoder

【描述】

注册编码器。

【语法】

td_s32 ss_mpi_aenc_register_encoder(td_s32 *handle, const ot_aenc_encoder *encoder);

【参数】

参数名称

描述

输入/输出

handle

注册句柄。

输出

encoder

编码器属性结构体。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aenc.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 用户通过传入编码器属性结构体,向AENC模块注册一个编码器,并返回注册句柄,用户可以最后通过注册句柄来注销该编码器。

  • AENC模块最大可注册20个编码器,且自身已注册LPCM、G711.a、G711.u、G726、ADPCM五个编码器。

  • 同一种编码协议不允许重复注册编码器,例如假如已注册G726编码器,不允许另外再注册一个G726编码器。

【举例】

无。

ss_mpi_aenc_unregister_encoder

【描述】

注销编码器。

【语法】

td_s32 ss_mpi_aenc_unregister_encoder(td_s32 handle);

【参数】

参数名称

描述

输入/输出

handle

注册句柄(注册编码器时获得的句柄)。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aenc.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 通常不需要注销编码器。

  • 注销编码器前,需要先销毁通过该编码器创建的所有编码通道,未销毁或者销毁过程中调用此接口将返回报错。

【举例】

无。

ss_mpi_aenc_get_stream_buf_info

【描述】

获取音频码流buffer相关信息。

【语法】

td_s32 ss_mpi_aenc_get_stream_buf_info(ot_aenc_chn aenc_chn, ot_phys_addr_t *phys_addr, td_u32 *size);

【参数】

参数名称

描述

输入/输出

aenc_chn

音频编码通道号。

取值范围:[0, OT_AENC_MAX_CHN_NUM)

输入

phys_addr

音频码流buffer的物理地址。

输出

size

音频码流buffer的长度,以byte为单位。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aenc.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

无。

【相关主题】

无。

ss_mpi_aenc_set_mute

【描述】

设置音频编码通道静音状态。

【语法】

td_s32 ss_mpi_aenc_set_mute(ot_aenc_chn aenc_chn, td_bool enable);

【参数】

参数名称

描述

输入/输出

aenc_chn

音频编码通道号。

取值范围:[0, OT_AENC_MAX_CHN_NUM)

输入

enable

音频编码通道是否启用静音。

TD_TRUE:启用静音功能;

TD_FALSE:关闭静音功能。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aenc.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

无。

【相关主题】

无。

ss_mpi_aenc_get_mute

【描述】

获取音频编码通道静音状态。

【语法】

td_s32 ss_mpi_aenc_get_mute(ot_aenc_chn ae_chn, td_bool *enable);

【参数】

参数名称

描述

输入/输出

ae_chn

音频编码通道号。

取值范围:[0, OT_AENC_MAX_CHN_NUM)

输入

enable

音频编码通道静音状态指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aenc.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

无。

【相关主题】

无。

ss_mpi_aenc_clr_chn_buf

【描述】

清除音频编码通道中当前的音频数据缓存。

【语法】

td_s32 ss_mpi_aenc_clr_chn_buf(ot_aenc_chn aenc_chn);

【参数】

参数名称

描述

输入/输出

aenc_chn

通道号。

取值范围:[0, OT_AENC_MAX_CHN_NUM)

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aenc.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 要求编码通道已经被创建,如果通道未被创建则返回通道不存在错误码。

  • 使用该接口会同时清除未编码的音频帧和已编码的音频流缓存。

【相关主题】

无。

音频解码

音频解码主要实现创建解码通道、发送音频码流解码及获取解码后音频帧等功能。

该功能模块提供以下MPI:

  • [ss_mpi_adec_create_chn:创建音频解码通道。

  • ss_mpi_adec_destroy_chn:销毁音频解码通道。

  • ss_mpi_adec_send_stream:发送音频码流到音频解码通道。

  • ss_mpi_adec_clr_chn_buf:清除ADEC通道中当前的音频数据缓存。

  • ss_mpi_adec_register_decoder:注册解码器

  • ss_mpi_adec_unregister_decoder:注销解码器。

  • ss_mpi_adec_get_frame:获取音频解码帧数据。

  • ss_mpi_adec_release_frame:释放音频解码帧数据。

  • ss_mpi_adec_send_end_of_stream:向解码器发送码流结束标识符,并清除码流buffer。

  • ss_mpi_adec_query_chn_status:查询ADEC通道中当前的音频数据缓存状态。

  • ss_mpi_adec_get_frame_info:获取音频解码帧信息。

  • ss_mpi_adec_set_chn_param:设置音频解码通道参数。

  • ss_mpi_adec_get_chn_param:获取音频解码通道参数。

ss_mpi_adec_create_chn

【描述】

创建音频解码通道。

【语法】

td_s32 ss_mpi_adec_create_chn(ot_adec_chn adec_chn, const ot_adec_chn_attr *attr);

【参数】

参数名称

描述

输入/输出

adec_chn

通道号。

取值范围:[0, OT_ADEC_MAX_CHN_NUM)

输入

attr

通道属性指针。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ot_common_adec.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_voice_engine.a

【注意】

  • 协议类型指定了该通道的解码协议,目前支持G711、G726、ADPCM。

  • 音频解码的部分属性需要与输出设备属性相匹配,例如采样率、帧长(每帧采样点数目)等。

  • buffer大小以帧为单位,取值范围是[2, OT_MAX_AUDIO_FRAME_NUM],建议配置为10以上,过小的buffer配置可能导致丢帧等异常。

  • 在通道未创建前(或销毁后)才能使用此接口,如果通道已经被创建,则返回通道已经创建。

【举例】

td_s32 ret;
ot_adec_chn_attr adec_attr;
ot_adec_attr_adpcm adpcm_attr;
ot_adec_chn ad_chn = 0;
ot_audio_stream audio_stream;
ot_audio_dev ao_dev = 0;
ot_ao_chn ao_chn = 0;
ot_mpp_chn src_chn;
ot_mpp_chn dest_chn;
 
adec_attr.type = OT_PT_ADPCMA;
adec_attr.buf_size = 8;
adec_attr.mode = OT_ADEC_MODE_STREAM;
adec_attr.value = &adpcm_attr;
adpcm_attr.adpcm_type = OT_ADPCM_TYPE_DVI4;
 
/* create adec chn*/
ret = ss_mpi_adec_create_chn(ad_chn, &adec_attr);
if (ret) {
    printf("create adec chn %d err:0x%x\n", ad_chn, ret);
    return ret;
}
 
/* bind ADEC to AO channel*/
src_chn.mod_id = OT_ID_ADEC;
src_chn.dev_id = 0;
src_chn.chn_id = ad_chn ;
dest_chn.mod_id  = OT_ID_AO;
dest_chn.dev_id = ao_dev;
dest_chn.chn_id = ao_chn;
 
ret = ss_mpi_sys_bind(&src_chn, &dest_chn);
if (ret) {
    printf(“bind adec chn %d to ao(%d, %d) error:0x%x\n”, ad_chn, ao_dev, ao_chn, ret);
    return ret;
}
 
/* get audio stream from network or file*/
 
/* send audio stream to adec chn */
ret = ss_mpi_adec_send_stream(ad_chn, &audio_stream);
if (ret) {
    printf("send stream to adec fail\n");
    return ret;
}
/* destroy adec chn */
ret = ss_mpi_adec_destroy_chn(ad_chn);
if (TD_SUCCESS != ret) {
    return ret;
}

ss_mpi_adec_destroy_chn

【描述】

销毁音频解码通道。

【语法】

td_s32 ss_mpi_adec_destroy_chn(ot_adec_chn adec_chn);

【参数】

参数名称

描述

输入/输出

adec_chn

通道号。

取值范围:0, OT_ADEC_MAX_CHN_NUM)。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ot_common_adec.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_voice_engine.a

【注意】

  • 通道未创建的情况下调用此接口会返回成功。

  • 如果正在获取/释放码流或者发送帧,销毁该通道则这些操作都会立即返回失败。

【举例】

请参见[ss_mpi_adec_create_chn的举例。

【相关主题】

无。

ss_mpi_adec_send_stream

【描述】

向音频解码通道发送码流。

【语法】

td_s32 ss_mpi_adec_send_stream(ot_adec_chn adec_chn, const ot_audio_stream *stream, td_bool block);

【参数】

参数名称

描述

输入/输出

adec_chn

通道号。

取值范围:0, OT_ADEC_MAX_CHN_NUM)

输入

stream

音频码流。

输入

block

阻塞标识。

TD_TRUE:阻塞。

TD_FALSE:非阻塞。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ot_common_adec.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a、libss_voice_engine.a

【注意】

  • 创建解码通道时可以指定解码方式为pack方式或stream方式。

    • pack方式用于确定码流包为一帧的情况下,比如从AENC直接获取的码流,从文件读取确切知道一帧边界(语音编码码流长度固定,很容易确定边界)的码流,效率较高。

    • stream方式用于不确定码流包为一帧的情况下,效率较低,且可能会有延迟。

  • LPCM解码只支持pack方式;其他音频格式的解码两种方式都支持。

  • 发送数据时必须保证通道已经被创建,否则直接返回失败,如果在送数据过程中销毁通道则会立刻返回失败。

  • 支持阻塞或非阻塞方式发送码流。

  • 当阻塞方式发送码流时,如果用于缓存解码后的音频帧的Buffer满,则此接口调用会被阻塞,直至解码后的音频帧数据被取走,或ADEC通道被销毁。

  • 确保发送给ADEC通道的码流数据的正确性,否则可能引起解码器异常退出。

【举例】

请参见[ss_mpi_adec_create_chn的举例。

【相关主题】

无。

ss_mpi_adec_clr_chn_buf

【描述】

清除ADEC通道中当前的音频数据缓存。

【语法】

td_s32 ss_mpi_adec_clr_chn_buf(ot_adec_chn adec_chn);

【参数】

参数名称

描述

输入/输出

adec_chn

通道号。

取值范围:[0, OT_ADEC_MAX_CHN_NUM)。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_aio.h、ot_common_adec.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 要求解码通道已经被创建,如果通道未被创建则返回通道不存在错误码。

  • 使用本接口时,不建议使用stream方式解码。使用stream方式解码进行清除缓存操作时,用户需要确保清除完缓存后,发送给解码器的数据必须是完整的一帧码流,否则可能导致解码器不能正常工作。

  • 无论是否使用stream方式解码,都要确保送数据解码的操作和清除缓存的操作之间的同步。

【举例】

无。

【相关主题】

无。

ss_mpi_adec_register_decoder

【描述】

注册解码器。

【语法】

td_s32 ss_mpi_adec_register_decoder(td_s32 *handle, const ot_adec_decoder *decoder);

【参数】

参数名称

描述

输入/输出

handle

注册句柄。

输出

decoder

解码器属性结构体。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_adec.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 用户通过传入解码器属性结构体,向ADEC模块注册一个解码器,并返回注册句柄,用户可以最后通过注册句柄来注销该解码器。

  • ADEC模块最大可注册20个解码器,且自身已注册LPCM、G711a、G711u、G726、ADPCM五个解码器。

  • 同一种解码协议不允许重复注册解码器,例如假如已注册G726解码器,不允许另外再注册一个G726解码器。

【举例】

无。

【相关主题】

ss_mpi_adec_unregister_decoder

【描述】

注销解码器。

【语法】

td_s32 ss_mpi_adec_unregister_decoder(td_s32 handle);

【参数】

参数名称

描述

输入/输出

handle

注册句柄(注册解码器时获得的句柄)。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_adec.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 通常不需要注销解码器。

  • 注销解码器前,需要先销毁通过该解码器创建的所有解码通道,未销毁或者销毁过程中调用此接口将返回报错。

【举例】

【相关主题】

ss_mpi_adec_get_frame

【描述】

获取音频解码帧数据。

【语法】

td_s32 ss_mpi_adec_get_frame(ot_adec_chn adec_chn, ot_audio_frame_info *frame_info, td_bool block);

【参数】

参数名称

描述

输入/输出

adec_chn

音频解码通道。

输入

frame_info

音频帧数据结构体。

输出

block

是否以阻塞方式获取。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_adec.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 必须在ADEC通道创建之后调用。

  • 使用本接口获取解码帧数据时,建议发送码流时按帧发送。

  • 使用本接口获取音频帧数据时,如果发送码流按流发送,请务必保证获取解码帧数据的及时性,否则会有异常。

  • 使用本接口获取音频数据时,请解除ADEC与AO的绑定关系,否则获取到的帧是不连续的。

【举例】

无。

【相关主题】

无。

ss_mpi_adec_release_frame

【描述】

释放获取到的音频解码帧数据。

【语法】

td_s32 ss_mpi_adec_release_frame(ot_adec_chn adec_chn, const ot_audio_frame_info *frame_info);

【参数】

参数名称

描述

输入/输出

adec_chn

音频解码通道。

输入

frame_info

音频帧数据结构体。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_adec.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 必须在ADEC通道创建之后调用。

  • 本接口必须与接口ss_mpi_adec_get_frame配合使用。

【举例】

无。

【相关主题】

无。

ss_mpi_adec_send_end_of_stream

【描述】

向解码器发送码流结束标识符,并清除码流buffer。

【语法】

td_s32 ss_mpi_adec_send_end_of_stream(ot_adec_chn adec_chn, td_bool instant);

【参数】

参数名称

描述

输入/输出

adec_chn

解码通道号。

输入

instant

是否立即清除解码器内部的缓存数据

TD_FALSE:延时清除。不会立即清除解码器内部的缓存数据,解码会继续进行,直到剩余buffer不足一帧数据时进行清除操作。

TD_TRUE:立即清除解码器内部缓存数据。

输入

【返回值】

返回值

描述

0

清除码流buffer成功。

非0

返回清除码流buffer失败的错误码。

【需求】

  • 头文件:ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

【举例】

ss_mpi_adec_query_chn_status

【描述】

查询ADEC通道中当前的音频数据缓存状态。

【语法】

td_s32 ss_mpi_adec_query_chn_status(ot_adec_chn adec_chn, ot_adec_chn_state *buf_status);

【参数】

参数名称

描述

输入/输出

adec_chn

ADEC通道号。

输入

status

缓存状态结构体指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_adec.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 在ADEC通道成功启用后再调用此接口。

  • 查询解码码流结束状态时,此接口还应该与ss_mpi_adec_send_end_of_stream接口配合使用,否则查询到的码流结束状态可能会不正确。

【举例】

ss_mpi_adec_get_frame_info

【描述】

获取音频解码帧信息。

【语法】

td_s32 ss_mpi_adec_get_frame_info(ot_adec_chn adec_chn, td_void *decode_frame_info);

【参数】

参数名称

描述

输入/输出

adec_chn

音频解码通道。

输入

decode_frame_info

音频解码帧信息指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_adec.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

  • 必须在ADEC通道创建之后调用。

  • decode_frame_info须由调用者保证地址和长度有效,否则会出现访问异常。

  • 对于使用LPCM、G711a、G711u、G726、ADPCM内置解码器的解码通道,调用本接口无效,默认返回成功。

  • 对于使用外置解码器的解码通道,本接口内部会调用外置解码器中获取音频帧信息的函数指针并返回结果,详细内容请参见《音频组件API参考》。

【举例】

ss_mpi_adec_set_chn_param

【描述】

设置音频解码通道参数。

【语法】

td_s32 ss_mpi_adec_set_chn_param(ot_adec_chn adec_chn, const ot_adec_chn_param *chn_param);

【参数】

参数名称

描述

输入/输出

adec_chn

音频解码通道。

输入

chn_param

通道参数

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_adec.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

必须在ADEC通道创建之后调用。

【举例】

ss_mpi_adec_get_chn_param

【描述】

获取音频解码通道参数。

【语法】

td_s32 ss_mpi_adec_get_chn_param(ot_adec_chn adec_chn, ot_adec_chn_param *chn_param);

【参数】

参数名称

描述

输入/输出

adec_chn

音频解码通道。

输入

chn_param

通道参数

输入

【返回值】

返回值

描述

0

成功。

非0

失败,其值为错误码。

【需求】

  • 头文件:ot_common_adec.h、ss_mpi_audio.h

  • 库文件:libss_mpi.a

【注意】

必须在ADEC通道创建之后调用。

【举例】

内置Audio Codec

内置Audio Codec主要通过ioctl提供对硬件设备的操作。在提供的ioctl的cmd中,有些cmd用户可以不需要调用,直接使用模块加载时的默认配置即可。ioctl调用实现的是对内置Audio Codec寄存器的读写。

内置Audio Codec标准功能cmd

  • OT_ACODEC_SOFT_RESET_CTRL:将Codec恢复为默认设置。

  • OT_ACODEC_SET_I2S1_FS:设置I2S1接口采样率。

  • OT_ACODEC_SET_INPUT_VOLUME:输入总音量控制。

  • OT_ACODEC_GET_INPUT_VOLUME:获取输入总音量。

  • OT_ACODEC_SET_OUTPUT_VOLUME:输出总音量控制。

  • OT_ACODEC_GET_OUTPUT_VOLUME:获取输出总音量。

  • OT_ACODEC_SET_MIXER_MIC:输入声道选择。

  • OT_ACODEC_SET_GAIN_MICL:左声道输入的模拟增益控制。

  • OT_ACODEC_SET_GAIN_MICR:右声道输入的模拟增益控制。

  • OT_ACODEC_SET_DACL_VOLUME:左声道输出音量控制。

  • OT_ACODEC_SET_DACR_VOLUME:右声道输出音量控制。

  • OT_ACODEC_SET_ADCL_VOLUME:左声道输入音量控制。

  • OT_ACODEC_SET_ADCR_VOLUME:右声道输入音量控制。

  • OT_ACODEC_SET_MICL_MUTE:左声道输入静音控制。

  • OT_ACODEC_SET_MICR_MUTE:右声道输入静音控制。

  • OT_ACODEC_SET_DACL_MUTE:左声道输出静音控制。

  • OT_ACODEC_SET_DACR_MUTE:右声道输出静音控制。

  • OT_ACODEC_DAC_SOFT_MUTE:输出软静音控制。

  • OT_ACODEC_DAC_SOFT_UNMUTE:输出软撤销静音控制。

  • OT_ACODEC_ENABLE_BOOSTL:左声道boost模拟增益控制。

  • OT_ACODEC_ENABLE_BOOSTR:右声道boost模拟增益控制。

  • OT_ACODEC_GET_GAIN_MICL:获取模拟左声道输入的增益。

  • OT_ACODEC_GET_GAIN_MICR:获取模拟右声道输入的增益。

  • OT_ACODEC_GET_DACL_VOLUME:获取左声道输出的音量控制。

  • OT_ACODEC_GET_DACR_VOLUME:获取右声道输出的音量控制。

  • OT_ACODEC_GET_ADCL_VOLUME:获取左声道输入的音量控制。

  • OT_ACODEC_GET_ADCR_VOLUME:获取右声道输入的音量控制。

  • OT_ACODEC_SET_PD_DACL:左声道输出的下电控制。

  • OT_ACODEC_SET_PD_DACR:右声道输出的下电控制。

  • OT_ACODEC_SET_PD_ADCL:左声道输入的下电控制。

  • OT_ACODEC_SET_PD_ADCR:右声道输入的下电控制。

  • OT_ACODEC_SET_PD_LINEINL:左声道LINEIN输入的下电控制。

  • OT_ACODEC_SET_PD_LINEINR:右声道LINEIN输入的下电控制。

OT_ACODEC_SOFT_RESET_CTRL

【描述】

将Codec恢复为默认设置。

【语法】

int ioctl (int fd, OT_ACODEC_SOFT_RESET_CTRL);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SOFT_RESET_CTRL

ioctl号

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

在AI/AO设备都禁用时再调用该接口。

【举例】

if (ioctl(acodec_fd, OT_ACODEC_SOFT_RESET_CTRL)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_I2S1_FS

【描述】

设置I2S1接口采样率。

【语法】

int ioctl (int fd, OT_ACODEC_SET_I2S1_FS, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_I2S1_FS

ioctl号

输入

arg

无符号整型指针

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

【举例】

ot_acodec_fs i2s_fs_sel;
i2s_fs_sel = OT_ACODEC_FS_48000;
if (ioctl(acodec_fd, OT_ACODEC_SET_I2S1_FS, &i2s_fs_sel)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_INPUT_VOLUME

【描述】

输入总音量控制。此接口依据优先调整模拟增益的原则,把用户期望设置的总增益分解成模拟增益和数字增益,分别配置到模拟增益控制寄存器和数字增益控制寄存器。

【语法】

int ioctl (int fd, OT_ACODEC_SET_INPUT_VOLUME, int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_INPUT_VOLUME

ioctl号

输入

arg

有符号整型指针

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

  • SS625V100输入音量范围为[-78, 80],包括模拟增益和数字增益,赋值越大,音量越大。赋值为80时,音量最大,为80dB,赋值为-78时,音量最小,为静音。调节时左右声道一起生效。建议调节范围限制为[0, 50]中的偶数值,此范围只调节模拟增益,这样引入的噪声最小,能够更好的保证声音质量。

  • SS928V100/SS626V100输入音量范围为[-78, 86],包括模拟增益和数字增益,赋值越大,音量越大。赋值为86时,音量最大,为86dB,赋值为-78时,音量最小,为静音。调节时左右声道一起生效。建议调节范围限制为[0, 36]中3的整数倍值,此范围只调节模拟增益,这样引入的噪声最小,能够更好的保证声音质量。

【举例】

int volume;
volume = 20;
if (ioctl(acodec_fd, OT_ACODEC_SET_INPUT_VOLUME, &volume)) {
    printf("ioctl err!\n");
}

OT_ACODEC_GET_INPUT_VOLUME

【描述】

获取输入总音量。

【语法】

int ioctl (int fd, OT_ACODEC_GET_INPUT_VOLUME, int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_GET_INPUT_VOLUME

ioctl号

输入

arg

有符号整型指针

输出

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

该接口须与OT_ACODEC_SET_INPUT_VOLUME接口搭配使用,不支持获取通过其它音量设置接口配置之后的音量。

【举例】

int volume;
if (ioctl(acodec_fd, OT_ACODEC_GET_INPUT_VOLUME, &volume)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_OUTPUT_VOLUME

【描述】

输出总音量控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_OUTPUT_VOLUME, int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_OUTPUT_VOLUME

ioctl号

输入

arg

有符号整型指针

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

输出音量范围为[-121, 6],赋值越大,音量越大。赋值为6时,音量最大,为6dB,赋值为-121时,音量最小,为静音。调节时左右声道一起生效。此接口调整的为数字增益,建议不要赋值太大,以免引入噪声。

【举例】

int volume;
volume = 0;
if (ioctl(acodec_fd, OT_ACODEC_SET_OUTPUT_VOLUME, &volume)) {
    printf("ioctl err!\n");
}

OT_ACODEC_GET_OUTPUT_VOLUME

【描述】

获取输出总音量。

【语法】

int ioctl (int fd, OT_ACODEC_GET_OUTPUT_VOLUME, int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_GET_OUTPUT_VOLUME

ioctl号

输入

arg

有符号整型指针

输出

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

int volume;
if (ioctl(acodec_fd,  OT_ACODEC_GET_OUTPUT_VOLUME, &volume)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_MIXER_MIC

【描述】

输入方式选择。

【语法】

int ioctl (int fd, OT_ACODEC_SET_MIXER_MIC, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_MIXER_MIC

ioctl号

输入

arg

无符号整型指针

参数指向的值范围:[0, 2],默认选择IN1单端输入。

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

SS625V100/SS928V100/SS626V100的arg取值范围[1, 2],默认选择IN1单端输入。

【解决方案差异】

解决方案

描述

SS625V100

分为IN1单端输入、IN_D差分输入。

【举例】

ot_acodec_mixer mixer_mic_ctrl;
mixer_mic_ctrl = OT_ACODEC_MIXER_IN0;
if (ioctl(acodec_fd, OT_ACODEC_SET_MIXER_MIC, &mixer_mic_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_GAIN_MICL

【描述】

左声道输入的模拟增益控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_GAIN_MICL, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_GAIN_MICL

ioctl号

输入

arg

无符号整型指针

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

  • 在使用无源音频信号输入时,需适当的增大模拟增益。

  • SS625V100的模拟增益范围为[0, 15],其中0到15按2db递增,0对应0db,15对应最大增益30db。

  • SS928V100/SS626V100的模拟增益范围为[0, 12],其中0到12按3db递增,0对应0db,12对应最大增益36db。

【举例】

unsigned int gain_mac;
gain_mic = 0xa;
if (ioctl(acodec_fd, OT_ACODEC_SET_GAIN_MICL, &gain_mic)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_GAIN_MICR

【描述】

右声道输入的模拟增益控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_GAIN_MICR, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_GAIN_MICR

ioctl号

输入

arg

无符号整型指针

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

  • 在使用无源音频信号输入时,需适当的增大模拟增益。

  • SS625V100的模拟增益范围为[0, 15],其中0到15按2db递增,0对应0db,15对应最大增益30db。

  • SS928V100/SS626V100的模拟增益范围为[0, 12],其中0到12按3db递增,0对应0db,12对应最大增益36db。

【举例】

unsigned int gain_mic;
gain_mic = 0x0;
if (ioctl(acodec_fd, OT_ACODEC_GET_GAIN_MICR, &gain_mic)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_DACL_VOLUME

【描述】

左声道输出音量控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_DACL_VOLUME, ot_acodec_volume_ctrl *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_DACL_VOLUME

ioctl号

输入

arg

ot_acodec_volume_ctrl结构体指针

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

左声道输出音量范围:[0, 127],赋值越大,音量越小。赋值为0时,音量最大,为6db,赋值为127时,音量最小,为静音。

【举例】

ot_acodec_volume_ctrl volume_ctrl;
volume_ctrl.volume_ctrl_mute = 0x0;
volume_ctrl.volume_ctrl = 0x06;
if (ioctl(acodec_fd, OT_ACODEC_SET_DACL_VOLUME, &volume_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_DACR_VOLUME

【描述】

右声道输出音量控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_DACR_VOLUME, ot_acodec_volume_ctrl *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_DACL_VOLUME

ioctl号

输入

arg

ot_acodec_volume_ctrl结构体指针

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

右声道输出音量范围:[0, 127],赋值越大,音量越小。赋值为0时,音量最大,为6db,赋值为127时,音量最小,为静音。

【举例】

ot_acodec_volume_ctrl volume_ctrl;
volume_ctrl.volume_ctrl_mute = 0x0;
volume_ctrl.volume_ctrl = 0x06;
if (ioctl(acodec_fd, OT_ACODEC_SET_DACR_VOLUME, &volume_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_ADCL_VOLUME

【描述】

左声道输入音量控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_ADCL_VOLUME, ot_acodec_volume_ctrl *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_ADCL_VOLUME

ioctl号

输入

arg

ot_acodec_volume_ctrl结构体指针

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

左声道输入音量范围:[0, 127],赋值越大,音量越小。赋值为0时,音量最大,为30db,赋值为127时,音量最小,为-97db。

【举例】

ot_acodec_volume_ctrl volume_ctrl;
volume_ctrl.volume_ctrl_mute = 0x0;
volume_ctrl.volume_ctrl = 0x06;
if (ioctl(acodec_fd, OT_ACODEC_SET_ADCL_VOLUME, &volume_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_ADCR_VOLUME

【描述】

右声道输入音量控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_ADCR_VOLUME, ot_acodec_volume_ctrl *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_ADCR_VOLUME

ioctl号

输入

arg

ot_acodec_volume_ctrl结构体指针

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

右声道输入音量范围:[0, 127],赋值越大,音量越小。赋值为0时,音量最大,为30db,赋值为127时,音量最小,为-97db。

【举例】

ot_acodec_volume_ctrl volume_ctrl;
volume_ctrl.volume_ctrl_mute = 0x0;
volume_ctrl.volume_ctrl = 0x06;
if (ioctl(acodec_fd, OT_ACODEC_SET_ADCR_VOLUME, &volume_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_MICL_MUTE

【描述】

左声道输入静音控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_MICL_MUTE, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_MICL_MUTE

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int mute_ctrl;
mute_ctrl = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_SET_MICL_MUTE, &mute_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_MICR_MUTE

【描述】

右声道输入静音控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_MICR_MUTE, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_MICR_MUTE

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int mute_ctrl;
mute_ctrl = 0x1;
if (ioctl(acodec_fd, ACODEC_SET_MICR_MUTE, &mute_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_DACL_MUTE

【描述】

左声道输出静音控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_DACL_MUTE, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_DACL_MUTE

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int mute_ctrl;
mute_ctrl = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_SET_DACL_MUTE, &mute_ctrl)) 
{
    printf("ioctl err!\n");
}

OT_ACODEC_SET_DACR_MUTE

【描述】

右声道输出静音控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_DACR_MUTE, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_DACR_MUTE

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int  mute_ctrl;
mute_ctrl = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_SET_DACR_MUTE, &mute_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_DAC_SOFT_MUTE

【描述】

输出软静音控制。

【语法】

int ioctl (int fd, OT_ACODEC_DAC_SOFT_MUTE,unsigned int  *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_DAC_SOFT_MUTE

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int  soft_mute_ctrl;
soft_mute_ctrl = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_DAC_SOFT_MUTE, &soft_mute_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_DAC_SOFT_UNMUTE

【描述】

输出软撤销静音控制。

【语法】

int ioctl (int fd, OT_ACODEC_DAC_SOFT_UNMUTE,unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_DAC_SOFT_UNMUTE

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int  soft_mute_ctrl;
soft_nute_ctrl = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_DAC_SOFT_UNMUTE, &soft_mute_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_ENABLE_BOOSTL

【描述】

左声道boost模拟增益控制。

【语法】

int ioctl (int fd, OT_ACODEC_ENABLE_BOOSTL,unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_ENABLE_BOOSTL

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1],取0时模拟增益增加0db,取1时模拟增益增加20db

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int  enable_boostl;
enable_boostl = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_ENABLE_BOOSTL, &enable_boostl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_ENABLE_BOOSTR

【描述】

右声道boost模拟增益控制。

【语法】

int ioctl (int fd, OT_ACODEC_ENABLE_BOOSTR,unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_ ENABLE_BOOSTR

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1],取0时模拟增益增加0db,取1时模拟增益增加20db

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int  enable_boostr;
enable_boostr = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_ENABLE_BOOSTR, &enable_boostr)) {
    printf("ioctl err!\n");
}

OT_ACODEC_GET_GAIN_MICL

【描述】

获取模拟左声道输入的增益。

【语法】

int ioctl (int fd, OT_ACODEC_GET_GAIN_MICL, unsigned int  *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_GET_GAIN_MICL

ioctl号

输入

arg

无符号整型指针

输出

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int gain_mic;
if (ioctl(acodec_fd, OT_ACODEC_GET_GAIN_MICL, &gain_mic)) {
    printf("ioctl err!\n");
}

OT_ACODEC_GET_GAIN_MICR

【描述】

获取模拟右声道输入的增益。

【语法】

int ioctl (int fd, OT_ACODEC_GET_GAIN_MICR, unsigned int  *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_GET_GAIN_MICR

ioctl号

输入

arg

无符号整型指针

输出

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int gain_mic;
if (ioctl(acodec_fd, OT_ACODEC_GET_GAIN_MICR, &gain_mic)) {
    printf("ioctl err!\n");
}

OT_ACODEC_GET_DACL_VOLUME

【描述】

获取左声道输出的音量控制。

【语法】

int ioctl (int fd, OT_ACODEC_GET_DACL_VOLUME, ot_acodec_volume_ctrl *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_GET_DACL_VOLUME

ioctl号

输入

arg

ot_acodec_volume_ctrl结构体指针

输出

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

ot_acodec_volume_ctrl volume_ctrl;
if (ioctl(acodec_fd, OT_ACODEC_GET_DACL_VOLUME, &volume_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_GET_DACR_VOLUME

【描述】

获取右声道输出的音量控制。

【语法】

int ioctl (int fd, OT_ACODEC_GET_DACR_VOLUME, ot_acodec_volume_ctrl *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_GET_DACL_VOLUME

ioctl号

输入

arg

ot_acodec_volume_ctrl结构体指针

输出

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

ot_acodec_volume_ctrl volume_ctrl;
if (ioctl(acodec_fd, OT_ACODEC_GET_DACR_VOLUME, &volume_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_GET_ADCL_VOLUME

【描述】

获取左声道输入的音量控制。

【语法】

int ioctl (int fd, OT_ACODEC_GET_ADCL_VOLUME, ot_acodec_volume_ctrl *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_GET_ADCL_VOLUME

ioctl号

输入

arg

ot_acodec_volume_ctrl结构体指针

输出

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

ot_acodec_volume_ctrl volume_ctrl;
if (ioctl(acodec_fd, OT_ACODEC_GET_ADCL_VOLUME, &volume_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_GET_ADCR_VOLUME

【描述】

获取右声道输入的音量控制。

【语法】

int ioctl (int fd, OT_ACODEC_GET ADCR_VOLUME,ot_acodec_volume_ctrl *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_GET_ADCR_VOLUME

ioctl号

输入

arg

ot_acodec_volume_ctrl结构体指针

输出

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

ot_acodec_volume_ctrl volume_ctrl;
if (ioctl(acodec_fd, OT_ACODEC_GET_ADCR_VOLUME, &volume_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_PD_DACL

【描述】

左声道输出的下电控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_PD_DACL,unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_PD_DACL

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

不使用DAC时,可以调用此接口,将DACL下电。

【举例】

unsigned int pd_ctrl;
pd_ctrl = 0x01;
if (ioctl(acodec_fd, OT_ACODEC_SET_PD_DACL, &pd_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_PD_DACR

【描述】

右声道输出的下电控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_PD_DACR, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_PD_DACR

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

不使用DAC时,可以调用此接口,将DACR下电。

【举例】

unsigned int pd_ctrl;
pd_ctrl = 0x01
if (ioctl(acodec_fd, OT_ACODEC_SET_PD_DACR, &pd_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_PD_ADCL

【描述】

左声道输入的下电控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_PD_ADCL, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_PD_ADCL

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

不使用ADC时,可以调用此接口,将ADCL下电。

【举例】

unsigned int pd_ctrl;
pd_ctrl = 0x01;
if (ioctl(acodec_fd, OT_ACODEC_SET_PD_ADCL, &pd_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_PD_ADCR

【描述】

右声道输入的下电控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_PD_ADCR, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_PD_ADCR

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

不使用ADC时,可以调用此接口,将ADCR下电。

【举例】

unsigned int pd_ctrl;
pd_ctl = 0x01;
if (ioctl(acodec_fd, OT_ACODEC_SET_PD_ADCR, &pd_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_PD_LINEINL

【描述】

左声道LINEIN输入的下电控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_PD_LINEINL, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_PD_LINEINL

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

不使用LINEIN输入时,可以调用此接口,将LINEINL下电。

【举例】

unsigned int lineinl_pd_ctrl;
lineinl_pd_ctl = 0x01;
if (ioctl(acodec_fd, OT_ACODEC_SET_PD_LINEINL, &lineinl_pd_ctrl)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_PD_LINEINR

【描述】

右声道LINEIN输入的下电控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_PD_LINEINR, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_PD_LINEINR

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

不使用LINEIN输入时,可以调用此接口,将LINEINR下电。

【举例】

unsigned int lineinr_pd_ctrl;
lineinr_pd_ctl = 0x01;
if (ioctl(acodec_fd, OT_ACODEC_SET_PD_LINEINR, &lineinr_pd_ctrl)) {
    printf("ioctl err!\n");
}

扩展功能cmd

  • OT_ACODEC_SELECT_DAC_CLK:设置DAC的时钟沿同沿或反沿。

  • OT_ACODEC_SELECT_ADC_CLK:设置ADC的时钟沿同沿或反沿。

  • OT_ACODEC_SELECT_ANA_MCLK:设置模拟部分和数字部分的时钟沿同沿或反沿。

  • OT_ACODEC_DACL_SELECT_TRACK:设置DACL选择左声道或右声道。

  • OT_ACODEC_DACR_SELECT_TRACK:设置DACR选择左声道或右声道。

  • OT_ACODEC_ADCL_SELECT_TRACK:设置ADCL选择左声道或右声道。

  • OT_ACODEC_ADCR_SELECT_TRACK:设置ADCR选择左声道或右声道。

  • OT_ACODEC_SET_DAC_DE_EMPHASIS:DAC的去加重滤波控制。

  • OT_ACODEC_SET_ADC_HP_FILTER:ADC的高通滤波控制。

  • OT_ACODEC_DAC_SOFT_MUTE_RATE:DAC软静音速率控制。

  • OT_ACODEC_SET_I2S1_DATA_WIDTH:I2S1数据接口位宽。

OT_ACODEC_SELECT_DAC_CLK

【描述】

设置DAC的时钟沿同沿或反沿。

【语法】

int ioctl (int fd, OT_ACODEC_SELECT_DAC_CLK, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SELECT_DAC_CLK

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int clk_select;
clk_select = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_SELECT_DAC_CLK, &clk_select)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SELECT_ADC_CLK

【描述】

设置ADC的时钟沿同沿或反沿。

【语法】

int ioctl (int fd, OT_ACODEC_SELECT_ADC_CLK, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SELECT_ADC_CLK

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int clk_select;
clk_select = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_SELECT_ADC_CLK, &clk_select)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SELECT_ANA_MCLK

【描述】

设置模拟部分和数字部分的时钟沿同沿或反沿。

【语法】

int ioctl (int fd, OT_ACODEC_SELECT_ANA_MCLK, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SELECT_ANA_MCLK

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int clk_select;
clk_select = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_SELECT_ANA_MCLK, &clk_select)) {
    printf("ioctl err!\n");
}

OT_ACODEC_DACL_SELECT_TRACK

【描述】

设置DACL选择左声道或右声道。

【语法】

int ioctl (int fd, OT_ACODEC_DACL_SELECT_TRACK, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_DACL_SELECT_TRACK

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]。0代表左声道,1代表右声道

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int track_select;
track_select = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_DACL_SELECT_TRACK, &track_select)) {
    printf("ioctl err!\n");
}

OT_ACODEC_DACR_SELECT_TRACK

【描述】

设置DACR选择左声道或右声道。

【语法】

int ioctl (int fd, OT_ACODEC_DACR_SELECT_TRACK, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_DACR_SELECT_TRACK

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]。0代表左声道,1代表右声道

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int track_select;
track_select = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_DACR_SELECT_TRACK, &track_select) {
    printf("ioctl err!\n");
}

OT_ACODEC_ADCL_SELECT_TRACK

【描述】

设置ADCL选择左声道或右声道。

【语法】

int ioctl (int fd, OT_ACODEC_ADCL_SELECT_TRACK, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_ADCL_SELECT_TRACK

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]。0代表左声道,1代表右声道

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

  • 该接口的作用是控制原始左声道数据的输出音轨设置。当没有调用该接口时,默认选择0,即最终以左声道输出。

  • 相比OT_ACODEC_ADCR_SELECT_TRACK,OT_ACODEC_ADCL_SELECT_TRACK的优先级更高。

  • 当OT_ACODEC_ADCL_SELECT_TRACK的入参与OT_ACODEC_ADCR_SELECT_TRACK一致时,最终输出的数据仅入参中指定的声道有效,且其数据来源为原始左声道。例如OT_ACODEC_ADCL_SELECT_TRACK和OT_ACODEC_ADCR_SELECT_TRACK同时选择了1,则最终输出的数据仅右声道有效,且其数据来源于原来的左声道。

【举例】

unsigned int track_select;
track_select = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_ADCL_SELECT_TRACK, &track_select)) {
    printf("ioctl err!\n");
}

OT_ACODEC_ADCR_SELECT_TRACK

【描述】

设置ADCR选择左声道或右声道。

【语法】

int ioctl (int fd, OT_ACODEC_ADCR_SELECT_TRACK, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_ADCR_SELECT_TRACK

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]。0代表左声道,1代表右声道

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

  • 该接口的作用是控制原始右声道数据的输出音轨设置。当没有调用该接口时,默认选择1,即最终以右声道输出。

  • 相比OT_ACODEC_ADCL_SELECT_TRACK,OT_ACODEC_ADCR_SELECT_TRACK的优先级较低。

  • 当OT_ACODEC_ADCL_SELECT_TRACK的入参与OT_ACODEC_ADCR_SELECT_TRACK一致时,最终输出的数据仅入参中指定的声道有效,且其数据来源为原始左声道。例如OT_ACODEC_ADCL_SELECT_TRACK和OT_ACODEC_ADCR_SELECT_TRACK同时选择了0,则最终输出的数据仅左声道有效,且其数据来源于原来的左声道。

【举例】

unsigned int track_select;
track_select = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_ADCR_SELECT_TRACK, &track_select)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_DAC_DE_EMPHASIS

【描述】

DAC的去加重滤波控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_DAC_DE_EMPHASIS, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_DAC_DE_EMPHASIS

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 3]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int dac_deemphasis;
dac_deemphasis = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_SET_DAC_DE_EMPHASIS, &dac_deemphasis)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_ADC_HP_FILTER

【描述】

ADC的高通滤波控制。

【语法】

int ioctl (int fd, OT_ACODEC_SET_ADC_HP_FILTER, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_ADC_HP_FILTER

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 1]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int adc_hpf;
adc_hpf = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_SET_ADC_HP_FILTER, &adc_hpf)) {
    printf("ioctl err!\n");
}

OT_ACODEC_DAC_SOFT_MUTE_RATE

【描述】

DAC软静音速率控制。

【语法】

int ioctl (int fd, OT_ACODEC_DAC_SOFT_MUTE_RATE, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_DAC_SOFT_MUTE_RATE

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 3]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int soft_mute_rate;
soft_mute_rate = 0x1;
if (ioctl(acodec_fd, OT_ACODEC_DAC_SOFT_MUTE_RATE, &soft_mute_rate)) {
    printf("ioctl err!\n");
}

OT_ACODEC_SET_I2S1_DATA_WIDTH

【描述】

I2S1数据接口位宽。

【语法】

int ioctl (int fd, OT_ACODEC_SET_I2S1_DATA_WIDTH, unsigned int *arg);

【参数】

参数名称

描述

输入/输出

fd

Audio Codec设备文件描述符

输入

OT_ACODEC_SET_I2S1_DATA_WIDTH

ioctl号

输入

arg

无符号整型指针

参数指向的值范围[0, 3]

输入

【返回值】

返回值

描述

0

成功

非0

失败

【需求】

头文件:ss_acodec.h

【注意】

无。

【举例】

unsigned int i2s_data_width;
i2s_data_width = 0x0;
if (ioctl(acodec_fd, OT_ACODEC_SET_I2S1_DATA_WIDTH, &i2s_data_width)) {
    printf("ioctl err!\n");
}

Resample

Resampler模块提供单独的重采样处理。当客户需要在上层对数据重采样时,可以使用该模块。

该功能模块提供以下MPI:

  • ss_resample_create:创建一个重采样模块。

  • ss_resample_process:重采样模块数据处理。

  • ss_resample_destroy:销毁重采样模块。

  • ss_resample_get_max_output_num:计算重采样最大输出数据。

ss_resample_create

【描述】

创建一个重采样模块。

【语法】

td_void *ss_resample_create(td_s32 in_rate, td_s32 out_rate, td_s32 chn_num);

【参数】

参数名称

描述

输入/输出

in_rate

输入采样率。

取值范围:8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000。

输入

out_rate

输出采样率。

取值范围:8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000。

输入

chn_num

处理声道数。

取值范围:1, 2

输入

【返回值】

返回值

描述

TD_NULL

失败。

非TD_NULL

成功,返回创建句柄。

【需求】

  • 头文件:ss_resample.h

  • 库文件:libvqe_res.so

【注意】

输入采样率和输出采样率需保证不一致。

【举例】

td_s16 in_buf[80];
td_s16* out_buf = TD_NULL;
td_void* res = TD_NULL;
res = ss_resample_create(8000, 48000, 1);
out_buf = malloc(ss_resample_get_max_output_num(res, 80) * sizeof(td_s16));

/* Write buf to in_buf and process resample */
ss_resample_process(res, in_buf , 80, out_buf);

/* Destroy Resample. */
ss_resample_destroy(res);
free(out_buf);

ss_resample_process

【描述】

处理一帧重采样数据。

【语法】

td_s32 ss_resample_process(td_void *instance, const td_s16 *in_buf, td_s32 in_samples, td_s16 *out_buf);

【参数】

参数名称

描述

输入/输出

instance

重采样模块句柄。

输入

in_buf

输入数据buf指针。

输入

in_samples

输入数据采样点数。

取值范围:[0, 2048]

输入

out_buf

输出数据buf指针。

输入/输出

【返回值】

返回值

描述

负值或零

失败,返回错误码或零

正值

成功,返回每条声道输出采样点数。

【需求】

  • 头文件:ss_resample.h

  • 库文件:libvqe_res.so

【注意】

  • 最大输入采样点数需小于2048。

  • 当重采样的输入采样率等于输出采样率的2倍时,要求输入采样点数为2的倍数,否则会导致重采样出错。

  • 当重采样输入采样率为输出采样率的4倍时,要求输入采样点数为4的倍数,否则会导致重采样出错。

  • 当重采样输入采样率为输出采样率的6倍时,要求输入采样点数为6的倍数,否则会导致重采样出错。

  • 当重采样的输出采样率不等于输入采样率的2倍、4倍、6倍,且声道模式为立体声时,要求输入采样点数为2的倍数,否则会导致重采样出错。

【举例】

参考ss_resample_create

ss_resample_destroy

【描述】

销毁一个重采样模块实例。

【语法】

td_void ss_resample_destroy(td_void *instance);

【参数】

参数名称

描述

输入/输出

inst

重采样模块句柄。

输入

【返回值】

【需求】

  • 头文件:ss_resample.h

  • 库文件:libvqe_res.so

【注意】

【举例】

参考ss_resample_create

ss_resample_get_max_output_num

【描述】

获取最大输出采样点数(每一声道)。

【语法】

td_s32 ss_resample_get_max_output_num(td_void *instance, td_s32 in_samples);

【参数】

参数名称

描述

输入/输出

instance

重采样模块句柄。

输入

in_samples

每一声道输入采样点数。

输入

【返回值】

返回值

描述

负值

失败,返回错误码。

非负值

成功,返回每条声道输出采样点数。

【需求】

  • 头文件:ss_resample.h

  • 库文件:libvqe_res.so

【注意】

  • 每一声道输入采样点数需小于最大输入采样点数(2048)。

  • 当重采样为上采样且声道模式为立体声时,要求输入采样点数为偶数,否则会导致获取最大输出采样点数出错。

  • 当重采样为下采样、输入采样率为输出采样率的2倍或4倍或6倍、声道模式为立体声时,要求输入采样点数为偶数,否则会导致获取最大输出采样点数出错。

【举例】

参考ss_resample_create