Bui~ (此处省略1000字开场白) ̄▽ ̄
新的ADK和旧的ADK都有一个诟病,就是做usb音频设备时,要么只能做48k采样率双声道的audio还不能用mic的声卡设备,或者是16k采样率单声道的voice带mic的声卡设备。以前的ADK是二选一,新的就弄了两个声卡。两个声卡是能满足用户既想听高品质音乐又能通话的需求,但这怪怪的,明明一个声卡能做的事,非要分两个声卡来做╮(╯▽╰)╭。暂不讨论这设计出于什么缘由,我们就自己动手改想要的功能好了。
首先我们得了解audio和voice除了采样率和通道数不同外,代码中的音频链路chain也是独立的,audio的链路是用于传输高品质音乐,所以里面不会有mic的连接,voice的链路需要处理声音,里面会有cvc,aec等声音处理模块,并且声音是单声道,而问题就是在这些声音处理模块。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立体声音频下行和16k单声道音频上行的功能了。那么先动的是usb的声卡参数,因为我们是要把voice的speaker当audio用,那就直接把audio speaker的声卡参数复制给voice的。接着就是修改音频链路,这里面需要注意的是,这整个音频链路由三个chain连接而成,大概样子如下图
这三个chain会根据你的参数选择他们的子chain,例如USB RX和OUTPUT有单声道和立体声之分,CVC有单mic,双mic之分,还有采样率之分。我给的补丁,只是针对默认情况,如果有别的需求,还得看着参数依样画葫芦去改对应的chain。USB RX中stereo chain有个mixer的模块,→_→意思就是,双声道也给你搞成单声道,所以这模块要去掉,在CVC中肯定是把receiver的模块去掉。至于OUTPUT,因为他没有限定数据的模块,也不会限定声道,只要在代码中将原本设置的单声道设置成双声道就好了。最后就是在代码中将这些模块连接起来,把已经删除的模块删除掉对应的参数配置,具体代码就看补丁吧。
以上是本期博文的全部内容,如有疑问就别在博文下方评论留言了,有什么疑问或想了解的当面和我说(如果你知道我是谁的话ヽ( ̄▽ ̄)و),我会尽量安排上(o´ω`o)و。谢谢大家浏览,我们下期再见。
简单是长期努力的结果,而不是起点
评论
linhuan
4 个月前
RayAA
2023年4月3日
jin142703
2023年3月2日
Biu~
2023年2月15日
王工
2022年12月14日
王工
2022年12月14日
袁工
2022年6月25日
Biu~
2022年6月20日
chris
2022年6月17日
许建
2022年6月6日