alsa音频调试

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 VolumeDAC LINEOUT VolumeMaster 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

不足之处,敬请指出,谢谢~


参考资料

unable to open timer + unable to initialize poll_fd

alsa project c library

ALSA unexpected buffer underrun

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值