Chinaunix首页 | 论坛 | 博客
  • 博客访问: 599482
  • 博文数量: 95
  • 博客积分: 1573
  • 博客等级: 上尉
  • 技术积分: 1030
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-23 10:46
个人简介

hello world!

文章分类

全部博文(95)

文章存档

2014年(1)

2013年(44)

2012年(50)

分类: LINUX

2013-02-06 14:23:07

一、alsa与pulseaudio概念

alsa是声卡驱动,pulseaudio可以理解为一个建立在alsa之上的全局音频管理器。

老式的纯alsa存在许多问题,诸如声卡独占导致的同一时间只有一个程序可以有声音---就好比你在win下看电影时不能听到QQ的提示音,或者已有人发消息你的电影就没声音。还有就是程序的音频区分控制。比如你在DOTA的时候,你的女神给你发了个两分钟的短片来让你评一评,你显然不希望为了看这两分钟的视频而关掉DOTA,看完了又在打开。pulse在这种情况下就可以直接控制DOTA跟视频的音量大小。这个也是alsa之前所没能解决的,OSS可以,但问题也不少。
另外,用pulseaudio的好处就是你下次KDE和gnome共存的时候,可以不用担心因为二者以前使用不同的音频框架导致的用户体验不一致问题,更不需要去维护两套配置方案。

二、Linux Mic无声音解决方案

1、查看你的声卡芯片型号
在终端下:head -n 1 /proc/asound/card0/codec*
获得型号 Realtek ALC888

2、获得相关芯片组的模块名称

查看ALSA的配置文件,由于是压缩文本这里要用zless

#zless /usr/share/doc/alsa-base/driver/ALSA-Configuration.txt.gz
找到Module snd-hda-intel 这一行后,看描述找到自己的声卡芯片组(文档里显示由于snd-hda-intel的芯片组太多,需要到doc文档再查看详细清单,于是在 /usr/share/doc/alsa-base/driver/HD-Audio-Models.txt,我找到了我的ALC883/ALC888芯片的列表,下面有很多型号,这里我选择acer-aspire-4930g ,复制下来。
找到ALC883/ALC888芯 片的列表,下面有很多型号,这里选择acer-aspire-4930g ,复制下来。

3、编辑ALSA配置
在终端下:sudo gedit /etc/modprobe.d/alsa-base.conf
在文件最下面加上 options snd-hda-intel model=acer-aspire-4930g

4、保存,重启。
5、在声音首选项里选择相应的设备。

摘引: http://blog.csdn.net/laohuang1122/article/details/8245632

三、amixer使用

alsamixer是Linux 音频架构ALSA中的Alsa工具的其中一个,用于配置音频的各个参数。

alsamixer是基于文本下的图形界面的,可以通过键盘的上下键,左右键等,很方便地设置需要的音量,开关某个switch(开关)等等操作。

amixer,是alsamixer的文本模式,即命令行模式,需要用amixer命令的形式去配置你的声卡的各个选项。

对于amixer的使用,你首先需要搞懂你要设置的参数是哪些,然后才可能去了解,如何去配置对应的值,整体来说,相对alsamixer来说,是有点繁琐,下面简要介绍其具体用法:

1.先看看amixer支持哪些命令,大概有哪些功能

amixer --help
Usage: amixer [command]

Available options:
-h,--help       this help
-c,--card N     select the card
-D,--device N   select the device, default 'default'
-d,--debug      debug mode
-n,--nocheck    do not perform range checking
-v,--version    print version of this program
-q,--quiet      be quiet
-i,--inactive   show also inactive controls
-a,--abstract L select abstraction level (none or basic)
-s,--stdin      Read and execute commands from stdin sequentially

Available commands:
scontrols       show all mixer simple controls
scontents       show contents of all mixer simple controls (default command)
sset sID P      set contents for one mixer simple control
sget sID        get contents for one mixer simple control
controls        show all controls for given card
contents        show contents of all controls for given card
cset cID P      set control contents for one control
cget cID        get control contents for one control

2.再看看当前你的音频系统(不同的音频驱动对应不同的内容和操作接口)提供了那些供你使用的接口去操作

关于驱动里面已经提供了多少接口可以去操作,可以用命令:

amixer contents

查看,比如:

amixer controls
numid=3,iface=MIXER,name='Master Mode Switch'
numid=29,iface=MIXER,name='Master Mux'
numid=4,iface=MIXER,name='Master Quality Switch'
numid=2,iface=MIXER,name='Master Switch'
numid=1,iface=MIXER,name='Master Volume'
numid=7,iface=MIXER,name='PCM Mode Switch'
numid=6,iface=MIXER,name='PCM Switch'
numid=5,iface=MIXER,name='PCM Volume'
numid=21,iface=MIXER,name='Line Input Switch'
numid=16,iface=MIXER,name='Line Mode Switch'
numid=27,iface=MIXER,name='Line Mux'
。。。。。
numid=9,iface=MIXER,name='Mic Switch'
numid=8,iface=MIXER,name='Mic Volume'
numid=19,iface=MIXER,name='ADC Mode Switch'
numid=28,iface=MIXER,name='ADC Mux'
。。。。。。。。

去查看,当然你的Linux内核支持哪些配置参数,如上,一共有20多个参数可供你配置。

而对于所有的当然的配置的值,可以通过这个查看:

amixer contents
numid=3,iface=MIXER,name='Master Mode Switch'
; type=ENUMERATED,access=rw------,values=1,items=2
; Item #0 'Common Buffer Off'
; Item #1 'Common Buffer On'
: values=0
。。。。。。。。。。

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
numid=24,iface=MIXER,name='Mixer ADC Mix Switch'
; type=BOOLEAN,access=rw------,values=1
: values=off
numid=26,iface=MIXER,name='Mixer DAC Mix Switch'
; type=BOOLEAN,access=rw------,values=1
: values=on
numid=25,iface=MIXER,name='Mixer Line Mix Switch'
; type=BOOLEAN,access=rw------,values=1
: values=on
numid=23,iface=MIXER,name='Mixer Mic Mix Switch'
; type=BOOLEAN,access=rw------,values=1
: values=on

3.搞懂如何去设置某个参数

总结起来就是,先要用get系列命令去看懂有哪些接口,然后再去用set系列的命令,去设置对应你所要设置的值。

想要针对某项设置,比如想要设置上面的的主音量,master volume,即controls中显示的:

numid=5,iface=MIXER,name='PCM Volume'
那么,可以先看看当前的值:

amixer cget numid=5,iface=MIXER,name='PCM Volume'
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

显示的是最大的27,假设想要设置为25,那么就用cset去设置:

amixer cset numid=5,iface=MIXER,name='PCM Volume' 25
numid=5,iface=MIXER,name='PCM Volume'
; type=INTEGER,access=rw---R--,values=2,min=0,max=27,step=0
: values=25,25
| dBscale-min=-40.50dB,step=1.50dB,mute=0

再比如,去将'Mic Supply 的switch关闭:

amixer cset numid=12,iface=MIXER,name='Mic Supply Switch' Off
numid=12,iface=MIXER,name='Mic Supply Switch'
; type=ENUMERATED,access=rw------,values=1,items=2
; Item #0 'On'
; Item #1 'Off'
: values=1

总结一下用法,就是:

amixer cget    controls中所输出的某个参数

amixer cset    controls中所输出的某个参数      具体的值(比如,0,1,On,Off等)

【提示】

同上面介绍的的cget/cset系列命令:

controls        show all controls for given card
contents        show contents of all controls for given card
cset cID P      set control contents for one control
cget cID        get control contents for one control

类似的,还有另外一套sget/sset系列的命令:

scontrols       show all mixer simple controls
scontents       show contents of all mixer simple controls (default command)
sset sID P      set contents for one mixer simple control
sget sID        get contents for one mixer simple control

也是同样做法,比如:

通过查看当然有哪些选择可以控制:

amixer scontrols
Simple mixer control 'Master',0
Simple mixer control 'Master Mode',0
Simple mixer control 'Master Mux',0
Simple mixer control 'Master Quality',0
。。。

同理,amixer scontents,可以查看当前所有的值,具体就不在这列举了。

另外,去查看或者配置用sget,比如:

amixer sget 'Microphone Input',0
Simple mixer control 'Microphone Input',0
Capabilities: pswitch pswitch-joined
Playback channels: Mono
Mono: Playback [off]

如果想要修改对应设置,用amixer sset ,具体用法是:

amixer sset sID(控制字符串) P(支持的某个值)

其中sID,就是上面的Simple mixer control后面的那个字符串,比如'Master Mux',0

而对其设置就是,先看看其提供了哪些供你设置的值:

amixer sget 'Master Mux',0
Simple mixer control 'Master Mux',0
Capabilities: enum
Items: 'Sum' 'DAC' 'Line' 'Mic'
Item0: 'DAC'

然后比如要设置成Line的,就可以这样:

amixer sset 'Master Mux',0 Line
Simple mixer control 'Master Mux',0
Capabilities: enum
Items: 'Sum' 'DAC' 'Line' 'Mic'
Item0: 'Line'


四、alsa配置

alsa 音频路径的问题:
在sound/soc/codecs目录中有很多音频codec的codec驱动,我使用的是wm9713,AP是s3c6410;这里个驱动文件中定义了很多widget和control,alsa在playback或record的时候,sound/soc/soc-dapm.c中的dapm_power_widgets函数会根据“配置情况”打开相应的widget,搭建一个完整的音频路径,只要该路径搭建成功,就可以正常工作;
sound/soc/codecs/wm9713.c中的audio_map[]就是一个wm9713的路由表,根据wm9713手册中的Audio Paths Overview可以选择自己需要的音频路径,在audio_map[]中测试一下,看audio_map中是否支持这种路径。
alsa 的配置
alsa音频的调试最主要的是alsa的配置。alsa使用amixer命令打开audio_map[]中的开关(control/switch)和其它一些controls,这些control设置后,使用aplay/arecord的时候即可搭建正确的路径,实现播放和录音。
比如我在调试的时候,在不用amixer控制时(默认状态),arecord可以正确录音,使用sound/soc/soc-dapm.c中的dump_dapm函数dump出的路径是正确的;而aplay的时候,dump_dapm出来的路径是错误的,原因是默认设置里没有打开playback的开关(switch),运行如下命令即可正确playback:
amixer cset numid=4,iface=MIXER,name='Headphone Playback Switch' 1
amixer cset numid=93,iface=MIXER,name='Left Headphone Out Mux' 2
amixer cset numid=34,iface=MIXER,name='Out3 Playback Switch'1
amixer cset numid=95,iface=MIXER,name='Left Speaker Out Mux' 4
amixer cset numid=94,iface=MIXER,name='Right Speaker Out Mux' 2
amixer cset numid=91,iface=MIXER,name='Out 3 Mux' 2
amixer cset numid=81,iface=MIXER,name='Left HP Mixer PCM Playback Swit' 1
amixer cset numid=75,iface=MIXER,name='Right HP Mixer PCM Playback Swi' 1
amixer cset numid=3,iface=MIXER,name='Headphone Playback Volume' 26
amixer cset numid=36,iface=MIXER,name='Out3 Playback Volume' 48
其实就是打开playback路径需要的开关,dapm_power_widgets会自动把这些开关连接的widget连接起来,构成一个播放路径。

Linux不能自动检测Mic,需要手动调整Mic通道:

#amixer -c 0 cget iface=MIXER,name="Input Source"
#amixer -c 0 cset iface=MIXER,name="Input Source" 0

#amixer -c 0 cset iface=MIXER,name="Input Source" 1

阅读(1933) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

xiekai_aiai2017-02-22 10:02:07

你好,请教一个问题。在我的机器上执行amixer controls 或者 amixer contents 报错,报错信息如下,请问这是什么原因?
ALSA lib pulse.c:229:(pulse_connect) PulseAudio: Unable to connect: Connection refused

amixer: Control default open error: Connection refused