ALSA框架简介 下载本文

手机事业部

ALSA框架介绍——音频通路

陈金泉 2011-3-3

内容:

1、简单介绍android音频状态与音频通路、codec。 2、通过ALSA的controls控制codec实现通路切换。

2.1、control 2.2、widget 2.3、audio_map 2.4、通路切换 2.5、alsa_amixer

本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。

1

手机事业部

1、简单介绍android音频状态与音频通路、codec、声卡注册

1.1、android音频状态与音频通路

Android的音频通路管理主要是在AudioPolicyManager中完成的,包括音量管理,音频策略(strategy)管理,输入输出设备管理。

Android音频模式状态图:

Android的音频模式状态包括:NORMAL、IN_CALL、RINGTONE。

AudioPolicyManager的mPhoneState成员变量记录了当前音频模式状态,在音频通路切换时的设备选择时会使用到。

在这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把10种stream type归纳为4种路由策略,getStrategy(stream_type)

根据stream_type,返回对应的routing_strategy值,也就是返回stream_type对应的路由策略。

AudioPolicyManager中有两个成员变量:mAvailableOutputDevices和mAvailableInputDevices,他们记录了当前可用的输入和输出设备。

getDeviceForStrategy()则结合routing_strategy、mPhoneState以及mAvailableOutputDevices或mAvailableInputDevices,返回可用的device。

所以android设置音频通路时会先根据getStrategy(stream_type)和getDeviceForStrategy()函数获取相应的输出、输入设备,然后通过

setOutputDevice(mHardwareOutput, newDevice)函数调用到alsa_default.cpp中的s_route、s_open函数控制到底层。

s_open函数用会调用deviceName(handle, devices, mode),这个函数会根据Devices的值来组合成字符串。然后通过snd_pcm_open获取asound.conf中相应的pcm配置里面的controls,并对调用到codec驱动当中对codec进行配置。

本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。

3