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:

alsa_amixer cset numid=4,iface=MIXER,name='Headphone Playback
Switch' 1
alsa_amixer cset numid=93,iface=MIXER,name='Left Headphone Out Mux'
2
alsa_amixer cset numid=34,iface=MIXER,name='Out3 Playback
Switch'1
alsa_amixer cset numid=95,iface=MIXER,name='Left Speaker Out Mux'
4
alsa_amixer cset numid=94,iface=MIXER,name='Right Speaker Out Mux'
2
alsa_amixer cset numid=91,iface=MIXER,name='Out 3 Mux' 2
alsa_amixer cset numid=81,iface=MIXER,name='Left HP Mixer PCM
Playback Swit' 1
alsa_amixer cset numid=75,iface=MIXER,name='Right HP Mixer PCM
Playback Swi' 1
alsa_amixer cset numid=3,iface=MIXER,name='Headphone Playback
Volume' 26
alsa_amixer cset numid=36,iface=MIXER,name='Out3 Playback Volume'
48
其实就是打开playback路径需要的开关,dapm_power_widgets会自动把这些开关连接的widget连接起来,构成一个播放路径。

Android中alsa的配置:
Andriod中使用alsa-lib,也需要对配置音频路径。配置方法有两个:
1、在AudioHardwareALSA.cpp中的doRouting中使用system函数调用amixer进行配置
system("alsa_amixer cset numid=4,iface=MIXER,name='Headphone
Playback Switch' 1");
2、编写asound.conf文件,AudioHardwareALSA.cpp中的ALSAMixer::ALSAMixer对象初始化的时候会通过alsa-lib的conf.c文件中的函数读取/etc/asound.conf文件,获取配置信息,对codec进行配置。

alsa的一些命令
alsa_amixer该命令配置主要配置音频codec的mixer开关、mux对路选择、volume值等;
alsa_amixer --help
alsa_amixer contents
alsa_amixer contents
numid=30,iface=MIXER,name='Headphone Playback ZC Switch'
; type=BOOLEAN,access=rw------,values=2
: values=off,off
numid=4,iface=MIXER,name='Headphone Playback Switch'
; type=BOOLEAN,access=rw------,values=2
: values=off,off
numid=3,iface=MIXER,name='Headphone Playback Volume'
; type=INTEGER,access=rw------,values=2,min=0,max=31,step=0
: values=31,31
numid=6,iface=MIXER,name='PCM Playback Volume'
; type=INTEGER,access=rw------,values=2,min=0,max=31,step=0
: values=23,23
numid=5,iface=MIXER,name='Line In Volume'
; type=INTEGER,access=rw------,values=2,min=0,max=31,step=0
: values=23,23
numid=7,iface=MIXER,name='Mic 1 Volume'
; type=INTEGER,access=rw------,values=1,min=0,max=31,step=0
: values=23
numid=8,iface=MIXER,name='Mic 2 Volume'
; type=INTEGER,access=rw------,values=1,min=0,max=31,step=0
: values=23
numid=85,iface=MIXER,name='Mic A Source'
; type=ENUMERATED,access=rw------,values=1,items=3
; Item #0 'Mic 1'
; Item #1 'Mic 2 A'
; Item #2 'Mic 2 B'
: values=0

alsa_amixer controls
numid=30,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'
numid=7,iface=MIXER,name='Mic 1 Volume'
numid=8,iface=MIXER,name='Mic 2 Volume'
numid=85,iface=MIXER,name='Mic A Source'
numid=84,iface=MIXER,name='Mic B Source'
numid=9,iface=MIXER,name='Mic Boost (+20dB) Switch'
numid=10,iface=MIXER,name='Mic Headphone Mixer Volume'
numid=47,iface=MIXER,name='Aux Playback Headphone Volume'
numid=48,iface=MIXER,name='Aux Playback Master Volume'
numid=49,iface=MIXER,name='Aux Playback Mono Volume'
numid=67,iface=MIXER,name='Mono Mixer Aux Playback Switch'
numid=69,iface=MIXER,name='Mono Mixer Bypass Playback Swit'
numid=70,iface=MIXER,name='Mono Mixer Mic 1 Sidetone Switc'
numid=71,iface=MIXER,name='Mono Mixer Mic 2 Sidetone Switc'
numid=65,iface=MIXER,name='Mono Mixer PC Beep Playback Swi'
numid=68,iface=MIXER,name='Mono Mixer PCM Playback Switch'
numid=66,iface=MIXER,name='Mono Mixer Voice Playback Switc'
alsa_alsactl
store:该命令生成/etc/asound.state文件,该文件显示当请codec的状态,可以根据该文件检查codec的状态是否正确。

# cat /etc/asound.state
state.SMDK6400 {
control.1 {
comment.access 'read write'
comment.type INTEGER
comment.count 2
comment.range '0 - 31'
iface MIXER
name 'Speaker Playback Volume'
value.0 31
value.1 31
}
control.2 {
comment.access 'read write'
comment.type BOOLEAN
comment.count 2
iface MIXER
name 'Speaker Playback Switch'
value.0 false
value.1 false
}
control.3 {
comment.access 'read write'
comment.type INTEGER
comment.count 2
comment.range '0 - 31'
iface MIXER
name 'Headphone Playback Volume'
value.0 26
value.1 26
}
control.4 {
comment.access 'read write'
comment.type BOOLEAN
comment.count 2
iface MIXER
name 'Headphone Playback Switch'
value.0 true
value.1 true
}
control.5 {
comment.access 'read write'
comment.type INTEGER
comment.count 2
comment.range '0 - 31'
iface MIXER
name 'Line In Volume'
value.0 23
value.1 23
}
使用amixer命令可以参照alsa_amixer
contents的内容;编写asound.conf,可以参照alsa_alsactl生成的/etc/asound.state。

下面是我的asound.conf的一段,其它的pcm.AndroidPlayback_xxx可以写法一样,就是hook_argsp[]中的内容根据自己的情况设置。

##
## Mixer Devices
##
ctl.AndroidPlayback {
type hw
card 0 # Can replace with driver"s name from
/proc/asound/cards
}
ctl.AndroidRecord {
type hw
card 0 # Can replace with driver"s name from
/proc/asound/cards
}
##
## Playback Devices
##
pcm.AndroidPlayback {
type hooks
slave.pcm {
type hw
card 0
device 0 # Must be of type "digital audio playback"
}
hooks.0 {
type ctl_elems
hook_args [
{
name 'Master Playback Switch'
value true
}
{
name 'Master Playback Volume'
value.0 51
value.1 51
}
{
name 'Phone Playback Switch'
value false
}
{
name 'Phone Playback Volume'
value.0 0
value.1 0
}
{
name 'Mic Playback Switch'
value false
}
{
name 'Mic Playback Volume'
value.0 0
value.1 0
}
{
name 'Mic Boost (+20dB)'
value false
}
{
name 'Line Playback Switch'
value false
}
{
name 'Line Playback Volume'
value.0 0
value.1 0
}
{
name 'PCM Playback Switch'
value true
}
{
name 'PCM Playback Volume'
value.0 51
value.1 51
}
{
name 'Capture Source'
value.0 Mic
value.1 Mic
}
{
name 'Capture Switch'
value true
}
{
name 'Capture Volume'
value.0 0
value.1 0
}
]
}
}

转 -ALSA 配置的更多相关文章

  1. Alsa中PCM参数设置⭐⭐

    1) PCM设备的句柄.2) 指定同时可供回放或截获的PCM流的方向3) 提供一些关于我们想要使用的设置选项的信息,比如缓冲区大小,采样率,PCM数据格式等4) 检查硬件是否支持设置选项.   4.1 ...

  2. linux(ubuntu) 查看系统设备信息 命令

    时间:2012-08-02 00:12   ubuntu查看版本命令 方法一: 在终端中执行下列指令: cat /etc/issue 方法二: 使用 lsb_release 命令也可以查看 Ubunt ...

  3. linux常用的查看设备的命令

    系统 # uname -a # 查看内核/操作系统/CPU信息  # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息  # ...

  4. linux(ubuntu) 查看系统设备信息

    ubuntu查看版本命令 方法一: 在终端中执行下列指令: cat /etc/issue 方法二: 使用 lsb_release 命令也可以查看 Ubuntu 的版本号,与方法一相比,内容更为详细. ...

  5. mixer音量的设置:amixer小工具的…

    1.关于alsa-utils和lib的移植我的上一篇博文中已经说明了,下面我就来说说我的混音器mixer音量控制的调节过程,网上的很多方法都是比较基本的入门没有知名具体的操作方法,在此我来谈谈我的设置 ...

  6. alsa-lib 交叉编译以及声卡驱动测试 (转)

    l  下载alsa-utils, alsa-lib, 版本要一致 http://www.alsa-project.org/main/index.php/Download l  编译alsa-lib . ...

  7. 【Linux】Linux下设备网卡以及硬件管理等

    这是Linux下网络硬件管理的基础知识,虽然平时用到的可能比软件的少一点,但是作为基础命令,还是需要记住,以免用时又得查询. 本文参考官方文档:https://wiki.ubuntu.com.cn/% ...

  8. 三个小白是如何在三个月内搭一个基于kaldi的嵌入式在线语音识别系统的

    前面的博客里说过最近几个月我从传统语音(语音通信)切到了智能语音(语音识别).刚开始是学语音识别领域的基础知识,学了后把自己学到的写了PPT给组内同学做了presentation(语音识别传统方法(G ...

  9. 1-1. OSS/ALSA 声卡的驱动与配置和 Madplay 嵌入式播放器的移植

    报警子系统 一. OSS/ALSA 声卡的驱动与配置 声卡驱动中传统的OSS构架在02年被收购后即不开源,并且OSS的混音效果不好->因此ALSA构架孕育而生. ALSA(高级音频构架,目前应用 ...

随机推荐

  1. 测试中认识 sqlite

    1.SQLite,是一款轻型的数据库:简单, 轻松的API 单词速记中单词离线包也用到sqlite 百度了一下,基本的使用语句: .help .quit sqlite3 testDB.db 在当前目录 ...

  2. canvas实现点击带水纹的按钮

    咱今天在闲逛网页时,看到一个点击带水纹的按钮特效,尼玛,写的还挺好,先看效果: 于是就奔着升级版的拿来主义,别人的好东西,咱都要拿来滴,so,扒代码! 完整代码在最后,是经过我的改进优化滴. 在这里先 ...

  3. Helix Server流媒体服务器架设教程(附Helix Server11.01下载)

    现在D版的远古影视系统很流行,也很实用,但是在这之前,很多人都是用共享,或者是使用Helix Server留媒体来做电影服务器~ 虽然Helix Server流媒体服有点落伍了,不过我相信它还是有用武 ...

  4. I.MX6 View长宽大于屏的分辨率

    /******************************************************************************** * I.MX6 View长宽大于屏的 ...

  5. (五)js数组方法二

    一:数组方法 var arr = []; 1.arr.push()//给数组末尾<添加>元素 2.arr.unshift()//给数组头部<添加>元素 3.arr.shift( ...

  6. Java集合总结之Collection整体框架

    前段时间一直在忙一个物联网的项目,所以Java的学习一直搁置,从今天开始继续学习!望大家多提宝贵意见! java.util包中包含了一些在Java 2中新增加的最令人兴奋的增强功能:类集.一个类集(c ...

  7. Window Handle介绍

    HANDLE(句柄)是Windows操作系统中的一个概念.在Windows程序中,有各种各样的资源(窗口.图标.光标等),系统在创建这些资源时会为它们分配内存,并返回标示这些资源的标示号,即句柄.句柄 ...

  8. Django-rest-framework多条件查询/分页/多表Json

    http://www.mamicode.com/info-detail-1648765.html

  9. 阿里云接口异常-Can not find endpoint to access

    最近在做公司的资产盘点,需要请求阿里云的接口获取公司的云服务器信息.在获取实例列表的过程中,通过异常机制捕获了 Can not find endpoint to access 这个错误.经过多次排查, ...

  10. Ubantu下安装FTP服务器

    在Linux中ftp服务器的全名叫 vsftpd,我们需要利用相关命令来开启安装ftp服务器,然后再在vsftpd.conf中进行相关配置,下面我来介绍在Ubuntu中vsftpd安装与配置增加用户的 ...