alsamixer 在音频子系统的使用

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

alsamixer是基于文本下的图形界面的,可以通过键盘的上下键,左右键等,很方便地设置需要的音量,开关某个switch(开关)等等操作,下图是 在Ubuntu12.04系统上图形配置界面,操作非常的简单,这里使用的是Ubuntu12.04的Line-in功能(实现立体声功能):

声音播放输出通道设置:

声音输入设备通道设置:

笔者测试Ubuntu12.04的Line-in功能,所以选择音频输入通道为 Line。

amixer,是alsamixer的文本模式,即命令行模式,需要用amixer命令的形式去配置你的声卡的各个选项,可以这么说,你
也许会直接修改Linux内核音频驱动源码来满足您的需求,比如选择音频输入通道是Mic输入,还是Line
输入,需要修改WM9714的寄存器来决定,而amixer可以从应用层来修改音频芯片的寄存器值,决定采用Mic输入或者Line输入。这样就大大简化
了代码修改的难度,毕竟比直接修改Linux Kernel ALSA会简单些。

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

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

amixer --help
Usage: amixer <options> [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

查看,比如:

[[email protected]]# ./amixer  controls
numid=49,iface=MIXER,name=‘Headphone Mixer Aux Playback Volume‘
numid=43,iface=MIXER,name=‘Headphone Mixer Beep Playback Volume‘
numid=32,iface=MIXER,name=‘Headphone Playback ZC Switch‘
numid=4,iface=MIXER,name=‘Headphone Playback Switch‘
numid=3,iface=MIXER,name=‘Headphone Playback Volume‘
numid=6,iface=MIXER,name=‘PCM Playback Volume‘
numid=5,iface=MIXER,name=‘Line In Volume‘

××××××××××××××××××××××××××××××××××××××××××××××××

而对于所有的配置的值,可以通过 amixer contents打印:

[[email protected]NX6410]# ./amixer  contents
numid=49,iface=MIXER,name=‘Headphone Mixer Aux Playback Volume‘
  ; type=INTEGER,access=rw---R--,values=1,min=0,max=7,step=0
  : values=5
  | dBscale-min=-15.00dB,step=3.00dB,mute=0
numid=43,iface=MIXER,name=‘Headphone Mixer Beep Playback Volume‘
  ; type=INTEGER,access=rw---R--,values=1,min=0,max=7,step=0
  : values=5
  | dBscale-min=-15.00dB,step=3.00dB,mute=0
numid=32,iface=MIXER,name=‘Headphone Playback ZC Switch‘
  ; type=BOOLEAN,access=rw------,values=2
  : values=off,off
。。。

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

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

想要针对某项设置,比如想要设置上面的Line-in输入的音量,‘Line In Volume‘,即controls中显示的:

numid=5,iface=MIXER,name=‘Line In Volume‘
那么,可以先看看当前的值:

[[email protected]]# ./amixer cget  numid=5,iface=MIXER,name=‘Line In Volume‘
numid=5,iface=MIXER,name=‘Line In Volume‘
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=31,step=0
  : values=23,23
  | dBscale-min=-34.50dB,step=1.50dB,mute=0
显示最大音量为31,假设想要设置为25,那么就用cset去设置:

amixer cset  numid=5,iface=MIXER,name=‘Line In Volume‘  25
[[email protected]]# ../amixer cset  numid=5,iface=MIXER,name=‘Line In Volume‘  25
numid=5,iface=MIXER,name=‘Line In Volume‘
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=31,step=0
  : values=25,25
  | dBscale-min=-34.50dB,step=1.50dB,mute=0

[提示]:

同上面介绍的的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 ,scontents即可满足您的需求。

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

也是同样做法,比如:

[[email protected]]# ./amixer  scontrols
Simple mixer control ‘Headphone‘,0
Simple mixer control ‘Headphone Mixer Aux‘,0
Simple mixer control ‘Headphone Mixer Beep‘,0
Simple mixer control ‘Headphone Playback ZC‘,0
Simple mixer control ‘Tone‘,0
Simple mixer control ‘Tone Cut-off‘,0
Simple mixer control ‘Bass‘,0
Simple mixer control ‘Bass Control‘,0
Simple mixer control ‘Bass Cut-off‘,0
Simple mixer control ‘PCM‘,0
Simple mixer control ‘Sidetone Mux‘,0
Simple mixer control ‘Line In‘,0-----------(这里是设置Line-in的音量的参数,同以上设置Line-in音量功能相同)
Simple mixer control ‘Mic 1‘,0
Simple mixer control ‘Mic 1 Preamp‘,0
Simple mixer control ‘Mic 2‘,0
Simple mixer control ‘Mic 2 Preamp‘,0
Simple mixer control ‘Mic A Source‘,0
Simple mixer control ‘Mic B Source‘,0

。。。

Simple mixer control ‘Left Capture Source‘,0 (这项很重要,左声道音频源输入选择)

Simple mixer control ‘Right Capture Source‘,0 (右声道音频源输入选择)
。。。

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

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

[[email protected]]# ./amixer  sget  ‘Left Capture Source‘,0
Simple mixer control ‘Left Capture Source‘,0
  Capabilities: enum
  Items: ‘Mic 1‘ ‘Mic 2‘ ‘Line‘ ‘Mono In‘ ‘Headphone‘ ‘Speaker‘ ‘Mono Out‘ ‘Zh‘
  Item0: ‘Mic 1‘
如果想要修改对应设置,用amixer sset ,具体用法是:

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

其中sID,就是上面的Simple mixer control后面的那个字符串,比如 ‘Left Capture Source‘ 而对其设置就是,

[[email protected]]# ./amixer  sset ‘Left Capture Source‘,0 Line
Simple mixer control ‘Left Capture Source‘,0
  Capabilities: enum
  Items: ‘Mic 1‘ ‘Mic 2‘ ‘Line‘ ‘Mono In‘ ‘Headphone‘ ‘Speaker‘ ‘Mono Out‘ ‘Zh‘
  Item0: ‘Line‘

然后再把右声道输入源设置为Line-in:

[[email protected]]# ./amixer  sset ‘Right Capture Source‘,0 Line
Simple mixer control ‘Right  Capture Source‘,0
  Capabilities: enum
  Items: ‘Mic 1‘ ‘Mic 2‘ ‘Line‘ ‘Mono In‘ ‘Headphone‘ ‘Speaker‘ ‘Mono Out‘ ‘Zh‘
  Item0: ‘Line‘

这样您的设备就可以使用Line-in功能录音了。

执行命令:

[[email protected]]#./arecord -f cd -c 1 -t wav my-file.wav
Recording WAVE ‘my-file.wav‘ : Signed 16 bit Little Endian, Rate 44100 Hz, Mono

开始Line-in录音 ,-c 1代表使用单声道,2 代表使用立体声.

播放刚才录制的声音文件:

.[[email protected]]#./aplay my-file.wav
Playing WAVE ‘my-file.wav‘ : Signed 16 bit Little Endian, Rate 44100 Hz, Mono

时间: 2024-10-05 10:04:41

alsamixer 在音频子系统的使用的相关文章

android 音频子系统-Surfaceflinger(二)

音频系统的核心:AudioFlinger AudioFlinger为上层提供访问和管理音频的接口,同时通过hal来管理音频设备. AudioFlinger服务的启动: Framework/av/media/audioserver/main_audioserver.cpp int main(int argc __unused, char **argv){ AudioFlinger::instantiate(); AudioPolicyService::instantiate(); RadioSer

音频的采集和播放

音频的采集和播放主要由专门的codec芯片完成,主流的codec芯片厂商有Circus Logic.Wolfson等.采集时codec芯片通过A/D采样把声音的模拟信号转换成数字信号并通过I2S总线送给CPU处理,播放时CPU把处理好的数字信号通过I2S总线送给codec芯片并通过D/A转换为模拟信号播放出来.codec芯片除了A/D, D/A功能外还有其他功能,主要有1)对音频通路进行控制,比如播放音乐打电话等在codec芯片内部的流通线路是不一样的.2)对音频信号做相应的处理,比如音量控制.

转---Android Audio System 之一:AudioTrack如何与AudioFlinger交换音频数据

引子 Android Framework的音频子系统中,每一个音频流对应着一个AudioTrack类的一个实例,每个AudioTrack会在创建时注册到 AudioFlinger中,由AudioFlinger把所有的AudioTrack进行混合(Mixer),然后输送到AudioHardware中 进行播放,目前Android的Froyo版本设定了同时最多可以创建32个音频流,也就是说,Mixer最多会同时处理32个AudioTrack的数 据流. 如何使用AudioTrack AudioTra

音频透传背后的技术实现

现在市面上流行的电视盒大部分都是Android,"音频透传"是一个经常见到的词,那到底什么是音频透传.音频透传背后的技术实现到底如何,引起了我的兴趣,因此花了点时间研究了一下.由于是针对全志H8的电视盒方案进行分析,因此分析的结果不具有普遍性,可能其它的方案在技术实现上有所不同. 在开始分析前先查找了一下关于"透传"这个概念的解释,根据度娘的说法是"透传即是透明传送,即传送网络无论传输业务如何,只负责将需要传送的业务传送到目的节点,同时保证传输的质量即可,

linux音频alsa-uda134x驱动分析之二(时钟)

Audio Clocking音频时钟============== This text describes the audio clocking terms in ASoC and digital audio ingeneral. Note: Audio clocking can be complex!本文本总体描述ASoC和数字音频中的音频时钟条款. Note:Audio Clock 是一个很复杂的东东 Master Clock主时钟------------ Every audio subsys

Android多媒体开发介绍(转)

Android多媒体开发介绍 转自:http://blog.csdn.net/reiliu/article/details/9060557 一.       多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3.AAC.AMR.JPG.PNG.GIF等.从功能上分为两部分,一是音/视频的回放(PlayBack),二是音视频的纪录(Recorder). CODEC(编解码器)使用OpenMAX 1L

【C语言探索之旅】 第三部分第二课:SDL开发游戏之创建窗口和画布

内容简介 1.第三部分第二课: SDL开发游戏之创建窗口和画布 2.第三部分第三课预告: SDL开发游戏之显示图像 第三部分第二课:SDL开发游戏之创建窗口和画布 在上一课中,我们对SDL这个开源库做了介绍,也带大家配置了SDL的开发环境.请大家按照上一课的步骤创建一个SDL工程,能够初步运行. 如果遇到问题,可以百度,Google相关平台SDL的配置.或者联系小编. 当然了,有些朋友可能会说开发C语言游戏还可以用GTK+这个库,但是个人认为GTK+没有SDL那么适合开发游戏,其创建图形界面的能

后ARM时代,嵌入式工程师的自我修养

1嵌入式学习的一些概念理解误区 很多嵌入式初学者认为,学嵌入式,就是学习ARM,就是学习开发板.买一块开发板,然后在上面"移植"u-boot.Linux内核,再使用busybox制作一个根文件系统,大功告成!觉得可以出去找工作了.这其实是有一定片面性的:首先ARM是个CPU架构,跟PC上的X86架构一样,你见过有人在Windows下面学习C/C++编程.MFC编程.网络编程.互联网编程,说自己学习X86的吗?当然,也不可否认,嵌入式平台的多样性.硬件的可定制性导致我们在嵌入式平台上开发

The Linux usage model for device tree data

Linux and the Device Tree Author: Grant Likely [email protected] 这篇文章介绍了Linux中使用Device Tree的方法.可以在http://devicetree.org/Device_Tree_Usage获取到Device Tree数据格式. Device Tree是一种描述硬件的语言,它可以让操作系统不硬编码硬件的信息. 结构上讲,Device Tree是树形结构,或者非循环的有名节点组成的图.每个节点包含一定数目的属性和键