预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共19页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

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、简单介绍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, ENFORCED_AUDIBLE=7, DTMF=8, TTS=9, Android把10种streamtype归纳为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进行配置。 例子: Music(NORMAL)->STRATEGY_MEDIA->DEVICE_OUT_WIRED_HEADSET ->AndroidPlayback_Headset_normal Ring(RINGTONE)->SONIFICATION->DEVICE_OUT_SPEAKER和DEVICE_OUT_WIRED_HEADSET ->AndroidPlayback_Speaker_Headset_ringtone 1.2、codec Codec中文译名是编译码器,由英文编码器(coder)和译码器(decoder)两词的词头组成的缩略语。指的是数字通信中具有编码、译码功能的器件。 Wm8900芯片内部框图: Wm8900内部包括有:ADC、DAC、OutputMixer、InputMixer、InputPGA、LINEOUT2、HPOUT等 音频输入口:INPUT1、INPUT2、INPUT3、I2S_DAC 音频输入口:HPOUT、LINEOUT1、LINEOUT2、I2S_ADC Codec输入输出选择、音量控制、各个部分的power会都会通过control、widgets注册到不同的list中供ALSA和用户使用。 2、通过ALSA的controls控制codec实现通路切换。 2.1、control Codec中会把一部分功能的设置信息,以control的形式通过snd_soc_add_controls函数添加到声卡中,我们可以通过asound.conf去控制这些control。 如: SOC_SINGLE("LeftInputPGASwitch",WM8900_REG_LINVOL,6,1,1), #defineSOC_SINGLE(xname,reg,shift,max,invert)\ { .iface=SNDRV_CTL_ELEM_IF