手机事业部
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