音频调试

参考文档

https://www.alsa-project.org/wiki/ASoC
https://www.alsa-project.org/wiki/DAPM#Control_Types

https://blog.csdn.net/azloong/article/details/6536855
https://blog.csdn.net/lifei092/article/details/80990813
https://www.cnblogs.com/lamblabs/p/8566693.html
https://blog.csdn.net/u010164190/category_9494783.html
https://blog.csdn.net/kris_fei/category_6987006_2.html

https://www.kernel.org/doc/html/v4.18/sound/soc/dpcm.html
https://blog.csdn.net/DroidPhone/article/details/12793293
https://blog.csdn.net/sepnic/category_778492.html
https://www.cnblogs.com/linhaostudy/category/1145404.html
https://www.ibm.com/developerworks/cn/linux/l-cn-libmadmp3player/index.html

https://blog.csdn.net/weixin_42285618/article/details/107499379?utm_medium=distribute.pc_relevant.none-task-blog-title-14&spm=1001.2101.3001.4242
https://blog.csdn.net/u011330638/article/details/81107312

https://www.cnblogs.com/talkaudiodev/p/8506133.html 音频重采样

amr音频编码器介绍
https://www.cnblogs.com/huaping-audio/archive/2008/09/18/1293508.html
https://blog.csdn.net/dxpqxb/article/details/52912899

https://blog.csdn.net/xianglingchuan/article/details/54092584 pcm和arm转化

https://blog.csdn.net/leixiaohua1020/article/details/18893769 大神博客

调试备注

1:PCM FYNC clock频率 就是 采样率 samplerate。

2:switch类型的widget注册时,其所属controls注册时,控件名字是widget name + control name。通过SND_SOC_DAPM_MIXER_NAMED_CTL宏注册的widget,其所属controls注册时,控件名字就是control name,通过SND_SOC_DAPM_MIXER宏注册widget,其所属controls注册时,控件名字是widget name + control name。

3:mux类型的widget注册时,只能定义一个control,其所属control注册时,控件名字是widget name。

4:定义枚举类型的控件,控件值不能是数字字符串。因为值是数字字符串的话,amix应用程序会按照数值类型控件处理而不是枚举类型控件处理。
例如:AUX PCM BClk { rate_128000=0, rate_256000=1, 512000=2, 1024000=3, 2048000=4, 4096000=5 }
adb shell amix 'AUX PCM BClk' rate_128000 ok
adb shell amix 'AUX PCM BClk' 512000 error

5: 通过dts pinctrl可以确认adsp AFE提供几个端口(几路bus),每个端口涉及的GPIO编号。
例如端口1可以配置成AUX PCM 格式,端口1也可以配置成primary MI2S格式。
端口2配置成SEC AUX PCM格式,端口2也可以配置成SEC M2C格式。

6:dts定义的pinctrl,pinctrl-names如果是default,其对应的pinctrl-x句柄会由pinctrl core执行设置pins状态。

7:codec DAI 时钟配置操作通常由machine driver的 snd_soc_dai_link.snd_soc_ops.hw_params调用。
  snd_soc_dai_driver.snd_soc_dai_ops.set_sysclk
 snd_soc_dai_driver.snd_soc_dai_ops.set_pll

8:高通平台把codec分为 internal codec 和 external codec,internal codec指的是PMIC internal codec,external codec指的是通过MI2S接口连接的codec,例如WCD系列、NAU系列等。

9:aplay,arec进程打开pcm stream时,在pcm_prepare函数执行失败可能原因?
错误日志:
cannot prepare channel: errno =-22
Arec:Failed in pcm_prepare

原因分析:pcm_prepare会触发驱动执行pcm prepare操作,prepare操作触发DAPM机制查找合法的完整路径,如果没有找到,就会返回失败。
解决方案:
在执行arec之前 执行 amix 'Voice_Tx Mixer AUX_PCM_TX_Voice' 1

结论:只有通过mixer kcontrols设置好完整路径后,才能通过aplay或arec打开pcm stream。

10:控制widget的电源寄存器通常情况下占一个bit,0关闭1打开电源。widget初始电源状态是通过读取寄存器获取的。当触发dapm机制,该widget在完整路径上时,此widget自动上电。

11:控件分为普通控件和 dapm 控件,dapm控件相应的path实例connected状态 是通过读取dapm控件寄存器值决定的。值0代表未连接,非0代表已连接。

12:一般情况下audio使用I2S硬件接口,voice使用PCM硬件接口,但是voice也可以使用I2S接口。平台侧DAI使用I2S或者PCM接口取决于 codec侧DAI 配置成I2S或PCM。在dai_link里定义的dai_fmt,在声卡系统初始化时候会使用dai_fmt分别设置cpu dai 和 codec dai。I2S接口和PCM接口在协议即时序上是不一样的。

13:cannot open device /dev/snd/pcmC0D2p, errno 16意味着PCM设备已经被其它进程打开。
errno -22意味音频通路没有设置,dapm机制 找不到完整路径。

14:AMR-NB is a narrowband speech codec, encoding speech in a band from about 300 Hz to 3400 Hz at rates between 4.75 kbps and 12.2 kbps
采样率表示一秒钟采用多少个样本,更重要的含义是决定了采样的频带范围。
The voice topology is a combination of PCM processing blocks in the Tx and Rx path

15:VoLTE→CS Voice 切换, Single Radio Voice Call Continuity (SRVCC)

16:音频处理软 件 Audacity

17:amix/mux kcontrols控件打开和关闭的初始状态,可以通过检查codec寄存器的初始值确认打开还是关闭。

18:ENUM枚举类型的kcontrol,可以设置字符串值,也可以设置整形值,整形值是字符串数组的index。

19:后端DAI LINK的codec name由codec的i2c 驱动name、I2C bus号、i2c slave addr构成。codec_name = “i2c->driver->name.i2c_bus-i2c->addr"。

20:定义的DAPM kcontrol如果在audio route路由表不使用,这个kcontrol不会向用户空间提供控制接口,也就是说amix命令无法查找到此kcontrol。

21:DAPM context上下文
DAPM context上下文可以理解成power domain,DAPM相关的路径扫描、widgets上下电等操作只局限在domain内。
asoc core把DAI实例、platform实例、包含codec DAI的codec实例以及驱动都抽象成 component实例和component驱动。
每个component实例都是一个DAPM context上下文。

22:通过SOC_DOUBLE_R_TLV类似的宏定义的都是双寄存器类型的kcontrol,此控件定义了两个寄存器,分别控制左右声道。amix命令必须对两个寄存器分别进行设置,例如:
amix 'LR Mic PAREN' 3 3。如果写成 amix 'LR Mic PAREN' 3命令,则设置不起作用。目前MDM9607高通平台的amix应用程序只支持 SNDRV_CTL_TLVT_DB_SCALE 类型的tlv,还不支持 SNDRV_CTL_TLVT_DB_RANGE 类型的 tlv。

23:BE DAI LINK有 ignoring suspend和PM down time两个标志,这两个标志支持BE工作在hostless mode,在hostless mode下,host CPU不传输PCM数据。
hostless mode支持host CPU进入sleep,然而DSP、MODEM DAI、BE DAI任然处于工作中。

24:BE DAI link可以把codec、codec dai、cpu dai设置为dummy device。dummy device意味着这些components不执行任何操作,components操作由外部的驱动模块控制。

25:在machine驱动,如果定义了snd_soc_dai_link.dai_fmt字段,asoc core在初始化期间就会调用codec dai驱动的set_fmt()回调函数。

26:语音通话上下行无声问题?
通常情况下,控制platform侧 voice path的两个控件SEC_MI2S_RX_Voice Mixer CSVoice和Voice_Tx Mixer SEC_MI2S_TX_Voice应该分别独立的
控制下行通路和上行通路,但是事实并非如此。只要有其中一个控件设置失败,上下行通路的配置都不会起作用,即造成上下行无声。volte call 也是如此。

posted @ 2022-05-29 16:18  bobfly1984  阅读(915)  评论(0编辑  收藏  举报