-
手机事业部
ALSA
框架介绍——音频通路
陈金泉
2011-3-3
内容:
1
、
简单介绍
android
音频状态与音频通路、
codec
。
2
、通过
ALSA
的
con
trols
控制
codec
实现通路切
换。
2.1
、
control
2.2
、
widget
2.3
、
audio_map
2.4
、通路切换
2.5
、
alsa_amixer <
/p>
本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。
1
手机事业部
1
、简单介绍
android
音频状
态与音频通路、
codec
、声卡注册
1
.
1
、
p>
android
音频状态与音频通路
p>
Android
的音频通路管理主要是在
A
udioPolicyManager
中完成的,包括音量管理,音频
< br>策略(
strategy
)管理,输入输出设备管理。<
/p>
Android
音频模式状态图:
Android
的音频模式状态包括
:
NORMAL
、
IN_CALL
p>
、
RINGTONE
。
AudioPolicyManager
的
mPhoneState
成员变量记录了当前音频模式状态,在音频
通路切换时的设备选择时会使用到。
在这
p>
3
种音频模式状态下一共有
10
种音频数据流,定义如下:
VOICE_CALL
= 0,
SYSTEM
= 1,
RING
= 2,
MUSIC
= 3,
ALARM
= 4,
NOTIFICATION
= 5,
BLUETOOTH_SCO
= 6,
本文档为瑞芯微电子手机
事业部成员撰写及提供,不得用于工作之外的使用及交流。
2
手机事业部
ENFORCED_AUDIBLE = 7,
DTMF
= 8,
TTS
= 9,
Android
< br>把
10
种
stream typ
e
归纳为
4
种路由策略,
getStrategy(stream_type)
根据
< br>stream_type
,返回对应的
routing_
strategy
值,也就是返回
stream_type
p>
对应
的路由策略。
AudioPolicyManager
中有两个成员变量:
mAvailableOutputDevices
和
mAva
ilableInputDevices
,他们记录了当前可用的输入和输出设备。
p>
getDeviceForStrategy()
则结合
routing_strategy
、
mPhoneState
以及
mAvailab
leOutputDevices
或
mAvailableIn
putDevices
,返回可用的
device
。
所以
android<
/p>
设置音频通路时会先根据
getStrategy(stream
_type)
和
getDeviceForStrategy(
)
函数获取相应的输出、输入设备,然后通过
setOutpu
tDevice(mHardwareOutput, newDevice)
函数调用
到
alsa_
中
的
s_route
、
s_open
函
数控制到底层。
s_open
函数用
会调用
deviceName(handle, devices, mode)
,这个函数会根据
Devices
的值来组合
成字符串。然后通过
snd_pcm_open
获取
中相应的
pcm
配置里面
的
controls
,并对调用到
co
dec
驱动当中对
codec
进行配置
。
本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于
工作之外的使用及交流。
3
手机事业部
例子:
Music
< br>(
NORMAL
)
-> STRATEGY_MEDIA ->
DEVICE_OUT_WIRED_HEADSET
->
AndroidPlayback_Headset_normal
Ring
(
RINGTONE
)
->
SONIFICATION
-> DEVICE_OUT_SPEAKER
和
DEVICE_OUT_WIRED_HEADSET
->
An
droidPlayback_Speaker_Headset_ringtone
本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。
p>
4
手机事业部
1.2
、
codec
Codec
中文译名是编译码器,由英文编码器(
co
der
)和译码器(
decoder
)
两词的
词头组成的缩略语。指的是数字通信中具有编码、译码功能的器件。
Wm8900
芯片内部框图:
Wm8900
内部包括有:
ADC
、
DAC
p>
、
Output
Mixer
、
Input
Mixer
、
Input PGA
、<
/p>
LINEOUT2
、
HPOUT
等
音频输入口:<
/p>
INPUT1
、
INPUT2
、
INPUT3
、
I2S
_DAC
音频输入口:
HPOUT
、
LINEOUT1
、
LINEOUT2
、
I2S_ADC
Codec
输入输出选择、音量控制、各个部分的
po
wer
会都会通过
control
、<
/p>
widgets
注
册到不同的
list
中供
ALSA
和
用户使用。
本文档为瑞芯微电子手
机事业部成员撰写及提供,不得用于工作之外的使用及交流。
5
手机事业部
2
、通过
ALSA
的
controls
控制
codec
实现通路切换。
2.1
、
control
Codec
中
会
把
一
部
分
功
能
的
设
置
信
息
,
以
control
的
形
式
通
过
snd_soc_add_controls
函数添加到声卡中,我们可以通过
去控
制这些
control
。
如:
SOC_SINGLE(
#define SOC_SINGLE(xname, reg, shift,
max, invert)
{
.iface =
SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,
.info = snd_soc_info_volsw,
.get = snd_soc_get_volsw,
.put = snd_soc_put_volsw,
.private_value =
SOC_SINGLE_VALUE(reg, shift, max,
invert) }
(
1
)
iface
字段定义了
control
的类型,
形式为
SNDRV_CTL_ELEM_IFACE_XXX
,
通
常是
MIXER
(
2
)
name
是名称标识字符串,
control
的名称非常重要,因为
control
的作用由名称
来区分。
name
定义的标准是
“SOURCE DIRECTION FUNC
TION”
即
“
源、方向、功能
”
。
(
3
)
info
函数可以得到对应
control
的详细信息。
(
4
)
get()
函数用于得到
control
的目前值并返回用户空间。
(
5
)
put()
函数
用于从用户空间写入值,如果值被改变,该函数返回
1
,否则返
回
0
;如果
发生错误,该函数返回错误
码。
(
6
)
private_value
保存了改
control
用于设置
codec
的
详细信息。
这些也就是与
codec
直
接相关的信息。
reg
表示寄存器地
址;
shift
表示数据偏移量;
ma
x
表示数据最大值;
invert
表示
是否倒置。
所有的
control<
/p>
都是通过
snd_soc_add_controls(codec,
wm8900_snd_controls,
ARRAY_S
IZE(wm8900_snd_controls))
函
数<
/p>
添
加
到
声
卡
中。
本文档为瑞
芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。
6
手机事业部
2.2
、
widget
Widget
可以认为是
codec
内部各个部件,需要根据
audio_map
对应的
path
来调用。
Widget
的管理和控制都是在
soc-
dapm.c
中去实现的。
通过
p>
snd_soc_dapm_new_controls
函数添加到
codec->dapm_widgets
中。
SND_SOC_DAPM_PGA(
0),
SND_SOC_DAPM_PGA
会直接把
widg
et
对应的信息添加到
codec->dapm_widget
s
中
,包括
id
、
reg
、
shift
、
max
等。
id
用来区分不同的
widget
类型,不同的
p>
id
控制方式
也不同。
codec
通过
snd_soc_add_controls
和
wm890
0_add_widgets
两个函数把来添
加
control
、
widgets
到不同的
list
里。
wm8900_add_widgets
中除了把
wm8900_dapm_widgets
结构体里面的所有
widgets
信息添加到
list
里
,还通过
snd_soc_dapm_add_routes
函
数把
audio_map
里的信息添加到
list
里。
本文档为瑞芯微电子
手机事业部成员撰写及提供,不得用于工作之外的使用及交流。
7
手机事业部
2.3
、
audio_map
2.3.1
、
audio_map
介绍
重点说下
audio_map
,因为
audio_ma
p
是一个帮助我们切换通路的很重要的部分。
我们可以根据
p>
audio_map
来控制
codec
p>
实现通路而不用去了解
codec
具体内部
需要怎么
配置寄存器来实现连接。这样就可以不用怎么去了解
c
odec
芯片。
< br>audio_map
的类型
snd_soc_dapm_
route
定义为:
struct snd_soc_dapm_route {
const char *sink;
const char *control;
const char *source;
};
可以理解为:目的地,控制条件,源头。
Codec
的通路(连接方式)非常
多,以
WM8900
为例举个例子。从
HP_L
输出(目
的地
sink
)
的信号可能来自
MIC
、
DAC
(源头
source
p>
)
,
而这个取决于
codec
的配置
(控
制条件
control
)。
每个通路在
codec
内部又被分成了好几个部分,也就是前面
说到的
widgets
,每个
widg
et
都可以做为一个数据流的源头或者目的地。
这些
widgets
可能的
path
都在
audi
o_map
罗列出来了。
如下是
p>
WM8900
一部分
audio_map<
/p>
:
/* Outputs */
p>
{
{
{
{
本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。
8
手机事业部
{
{
{
p>
{
{
{
{
{
{
{
{
{
{
< br>
{
{
{
{
{
{
{
{
{
从
p>
audio_map
中可以看出,对于
LI
NEOUT2
LP
,可以是
Headphone <
/p>
Amplifier
的
source
p>
,也可以是
Left Output Mixer
< br>的
sink
。
本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。
9
-
-
-
-
-
-
-
-
-
上一篇:LI-6400便携式光合仪使用流程说明(个人总结)
下一篇:民航英语缩略词B