首先我们得了解audio和voice除了采样率和通道数不同外,代码中的音频链路chain也是独立的,audio的链路是用于传输高品质音乐,所以里面不会有mic的连接,voice的链路需要处理声音,里面会有cvc,aec等声音处理模块,并且声音是单声道,而问题就是在这些声音处理模块。
新的ADK和旧的ADK都有一个诟病,就是做usb音频设备时,要么只能做48k采样率双声道的audio还不能用mic的声卡设备,或者是16k采样率单声道的voice带mic的声卡设备。以前的ADK是二选一,新的就弄了两个声卡。两个声卡是能满足用户既想听高品质音乐又能通话的需求,但这怪怪的,明明一个声卡能做的事,非要分两个声卡来做。暂不讨论这设计出于什么缘由,我们就自己动手改想要的功能好了。
cvc分上下行,下行就是输出到speaker的链路,其中有个cvc receiver的模块,这模块处理的采样率有8k,16k,新的芯片有支持到32k,就是没有48k,所以高通做法就是做两条音频链路,带cvc的链路就是用在voice,不带的就是audio。→_→ 但是两条不一样的链路也不一定要两个声卡呀~ 用到mic时用voice链路,不用到mic时用audio链路,代码根据mic的使用情况,自己切换音频链路,这不也挺流畅的吗(867x dongle代码就是用了这个逻辑,悄悄告诉你们ADK6.4的sink我也改成了这个逻辑,但是我不会出这部分博文啦,想要的就找我们)。另外一个方法就是,不要cvc receiver这个模块,因为即便是hfp中的voice也不怎么调到cvc receiver里面的参数,即使要调也就EQ、volume这些,这些我们用EQ和volume control模块也能实现。所以本编觉得,把cvc receiver拖出去砍了,不让这个瘟神限制采样率,下面就是介绍实现这种做法的逻辑,想要补丁的就直接跳到片尾下载。
默认代码中是有两个宏INCLUDE_USB_VOICE INCLUDE_USB_AUDIO,分别打开voice和audio声卡,因为audio没有用到mic,所以我们只打开voice,这样代码修改量较少,并只将下行(即usb到speaker)改成48k采样率和变成立体声就好了,这样就能实现48k