alsa音频调试
1.找不到配置项
在amixer controls
指令找不到Master Playback Volume
配置项,查阅资料可知
softval类型有些需要配置一次才能出现,执行指令
在etc/asound.conf
写如下内容
pcm.mtest {
type softvol
slave {
pcm default
}
control {
name "Master Playback Volume"
card 0
}
min_dB -20.0
max_dB 10.0
}
然后执行aplay -D mtest no_driver.wav
,然后该配置项即可出现
为了让下一次还能有这个配置项,使用指令alsactl store -f /etc/asound.state
将当前的配置项保存到指定文件上,在开机的时候将配置项恢复alsactl restore -f /etc/asound.state
。
2.调节音量大小
可以从amixer controls
查看可以配置音量大小的配置项,在测试的板子上,调节硬件音量的配置项为DAC HPMIX Volume
和DAC LINEOUT Volume
和Master Playback Volume
三个配置项,
单独调试某个配置项的话可以先用指令amixer contents
查看当前配置项可以配置的值和内容,然后使用指令
amixer cset numid=24 30 #设置numid=24的值为30 值的范围可以参考amixer contents上的内容
amixer cset numid=25 2 #设置numid=25的值为2
amixer set Master 100% #设置音量100%,也可以使用amixer cset numid=26 255
预设置好的音量配置可以通过alsactl
指定保存和恢复,下次开机使用。
3.混音
混音可以直接使用配置文件实现,在/etc/asound.conf
添加如下内容
pcm.dmix_vol {
type softvol
slave.pcm "dmix"
control {
name "Master Playback Volume"
card 0
}
min_dB -20.0
max_dB 10.0
}
然后播放的时候指定插件aplay -Dplug:dmix_vol test.wav
即可实现混音。
4.混音报错
1、混音在测试发现会提示异常
underrun!!! (at least 1092.128 ms long)
underrun!!! (at least 64.929 ms long)
underrun!!! (at least 149.432 ms long)
underrun!!! (at least 150.227 ms long)
underrun!!! (at least 235.303 ms long)
underrun!!! (at least 320.016 ms long)
underrun!!! (at least 1024.355 ms long)
underrun!!! (at least 727.061 ms long)
问题在于混音的时候,部分音频没有播放,缓冲区变空时,会遇到欠载,程序低负荷运行。
可以通过更改混音的配置改善这个报错,更改文件/usr/share/alsa/pcm/dmix.conf
slave {
pcm {
type hw
card $CARD
device $DEV
subdevice $SUBDEV
}
format $FORMAT
rate $RATE
period_size {
@func refer
name {
@func concat
strings [
"defaults.dmix."
{
@func card_driver
card $CARD
}
".period_size"
]
}
default 1024 #可以更改这个值改善underrun报错
}
period_time {
@func refer
name {
@func concat
strings [
"defaults.dmix."
{
@func card_driver
card $CARD
}
".period_time"
]
}
default -1
}
periods {
@func refer
name {
@func concat
strings [
"defaults.dmix."
{
@func card_driver
card $CARD
}
".periods"
]
}
default 16
}
}
2、混音时候提示timer问题
ALSA lib pcm_direct.c:1159:(snd1_pcm_direct_initialize_poll_fd) unable to open timer 'hw:CLASS=3,SCLASS=0,CARD=0,DEV=0,SUBDEV=0'
ALSA lib pcm_dmix.c:1106:(snd_pcm_dmix_open) unable to initialize poll_fd
Playback open error: -19,No such device
解决方法:内核需要开启配置项CONFIG_SND_PCM_TIMER
不足之处,敬请指出,谢谢~