最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】amixer: Control default open error: No such file or directory

工作和技术 crifan 6840浏览 0评论

【问题】

自己用buildroot编了一个新的rootfs,然后烧到板子里,都可以正常跑起来了,但是运行amixer的时候出错了:

amixer: Control default open error: No such file or directory

【解决过程】

1.查看了别的某个可以正常使用amixer的rootfs,然后和当前用的rootfs比较,发现当前的rootfs,缺少很多设备节点文件,所以,按照直观的自己的理解,用mknod加入了下面这些设备节点:

crw-r—– 1 root   root 116, 24 2010-02-25 11:18 pcmC0D0c
crw-r—– 1 root   root 116, 16 2010-02-25 11:18 pcmC0D0p
crw-r—– 1 root   root 116, 25 2010-02-25 11:18 pcmC0D1c
crw-r—– 1 root   root 116, 17 2010-02-25 11:18 pcmC0D1p
crw-r—– 1 root   root 116, 26 2010-02-25 11:18 pcmC0D2c
crw-r—– 1 root   root 116, 18 2010-02-25 11:18 pcmC0D2p

结果还是不行,又加了这个:

crw-r—– 1 root root 116, 0 2010-02-25 11:18 controlC0

仍然不行。

2.索性去

ftp://ftp.alsa-project.org/pub/

下载了alsa的相关源码:alsa-lib-1.0.9和alsa-utils-1.0.9

ftp://ftp.alsa-project.org/pub/utils/alsa-utils-1.0.9.tar.bz2
然后建了个source Insight工程,方便搜索源码,

找到了对应错误提示部分的源码:

alsa-utils-1.0.9amixeramixer.c:

static int info(void)
{

if ((err = snd_ctl_open(&handle, card, 0)) < 0) {
   error("Control device %s open error: %s", card, snd_strerror(err));
   return err;
}

}

很明显,其是去调用了snd_ctl_open:

alsa-lib-1.0.9srccontrolcontrol.c:

int snd_ctl_open(snd_ctl_t **ctlp, const char *name, int mode)
{
int err;
assert(ctlp && name);
err = snd_config_update();
if (err < 0)
   return err;
return snd_ctl_open_noupdate(ctlp, snd_config, name, mode);
}

然后跟踪代码看了下,发现太复杂,搞不清默认的设备节点的名字到底是啥。。。

3.最后,发现,原来那些需要的设备节点,都是在/dev/snd下面才可以,即按照下面建立那些对应设备节点,就可以了:

# mkdir /dev/snd
# cd /dev/snd
# ls -lh
crw-r–r–    1 root     root     116,   0 Dec 31 17:10 controlC0
crw-r–r–    1 root     root     116,   0 Dec 31 17:08 controlc0
crw-r–r–    1 root     root     116, 24 Dec 31 17:05 pcmC0D0c
crw-r–r–    1 root     root     116, 16 Dec 31 17:05 pcmC0D0p
crw-r–r–    1 root     root     116, 25 Dec 31 17:05 pcmC0D1c
crw-r–r–    1 root     root     116, 17 Dec 31 17:06 pcmC0D1p
crw-r–r–    1 root     root     116, 26 Dec 31 17:06 pcmC0D2c
crw-r–r–    1 root     root     116, 18 Dec 31 17:06 pcmC0D2p
crw-r–r–    1 root     root     116,   1 Dec 31 17:10 seq
crw-r–r–    1 root     root     116, 33 Dec 31 17:10 timer

再执行amixer,就可以正常执行了:

# amixer cset numid=1,iface=MIXER,name=’Master Volume’ 27
numid=1,iface=MIXER,name=’Master Volume’
; type=INTEGER,access=rw—R–,values=2,min=0,max=27,step=0
: values=27,27
| dBscale-min=-40.50dB,step=1.50dB,mute=0
# amixer cset numid=24,iface=MIXER,name=’Mixer DAC Mix Switch’ 1
numid=24,iface=MIXER,name=’Mixer DAC Mix Switch’
; type=BOOLEAN,access=rw——,values=1
: values=on
# amixer cset numid=20,iface=MIXER,name=’DAC Output Switch’ 1
numid=20,iface=MIXER,name=’DAC Output Switch’
; type=BOOLEAN,access=rw——,values=1
: values=on
# amixer cset numid=6,iface=MIXER,name=’PCM Switch’ 1
numid=6,iface=MIXER,name=’PCM Switch’
; type=BOOLEAN,access=rw——,values=1
: values=on
# amixer cset numid=5,iface=MIXER,name=’PCM Volume’ 27
numid=5,iface=MIXER,name=’PCM Volume’
; type=INTEGER,access=rw—R–,values=2,min=0,max=27,step=0
: values=27,27
| dBscale-min=-40.50dB,step=1.50dB,mute=0

也就是,之前最开始创建的那些节点虽然是对的,但是是/dev下面的,而不是/dev/snd下面的,所以不行。

【总结】

办法很简单,就是确定你需要哪些对应alsa的那些util,比如amixer等,所需要的对应的设备节点,自己创建好对应的设备节点即可。

至少此处,只需要建立如下节点即可:

# mkdir /dev/snd
# cd /dev/snd
# ls -lh
crw-r–r–    1 root     root     116,   0 Dec 31 17:10 controlC0
crw-r–r–    1 root     root     116,   0 Dec 31 17:08 controlc0
crw-r–r–    1 root     root     116, 24 Dec 31 17:05 pcmC0D0c
crw-r–r–    1 root     root     116, 16 Dec 31 17:05 pcmC0D0p
crw-r–r–    1 root     root     116, 25 Dec 31 17:05 pcmC0D1c
crw-r–r–    1 root     root     116, 17 Dec 31 17:06 pcmC0D1p
crw-r–r–    1 root     root     116, 26 Dec 31 17:06 pcmC0D2c
crw-r–r–    1 root     root     116, 18 Dec 31 17:06 pcmC0D2p
crw-r–r–    1 root     root     116,   1 Dec 31 17:10 seq
crw-r–r–    1 root     root     116, 33 Dec 31 17:10 timer

【提示】

如果想要buildroot中,自动生成上述对应的设备节点,那么就把如下内容:

#new ALSA Audio stuff
/dev/snd/controlC0 c 666 0 0 116 0   – – –
/dev/snd/seq     c 666 0 0 116 1   – – –
/dev/snd/pcmC0D0p   c 666 0 0 116 16 – – –
/dev/snd/pcmC0D1p   c 666 0 0 116 17 – – –
/dev/snd/pcmC0D2p   c 666 0 0 116 18 – – –
/dev/snd/pcmC0D0c   c 666 0 0 116 24 – – –
/dev/snd/pcmC0D1c   c 666 0 0 116 25 – – –
/dev/snd/pcmC0D2c   c 666 0 0 116 26 – – –
/dev/snd/timer    c 666 0 0 116 33 – – –

加入到targetgenericdevice_table.txt即可。

【引用】

1。alsamixer: function snd_ctl_open failed for default: No such file or directory

http://www.linuxquestions.org/questions/linux-newbie-8/alsamixer-function-snd_ctl_open-failed-for-default-no-such-file-or-directory-157454/

转载请注明:在路上 » 【已解决】amixer: Control default open error: No such file or directory

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
79 queries in 0.190 seconds, using 22.08MB memory