ALSA框架介绍-音频通路
本作品内容为ALSA框架介绍-音频通路,格式为 doc ,大小 413224 KB ,页数为 19页
('1手机事业部ALSA框架介绍——音频通路陈金泉2011-3-3内容:1、简单介绍android音频状态与音频通路、codec。2、通过ALSA的controls控制codec实现通路切换。2.1、control2.2、widget2.3、audio_map2.4、通路切换2.5、alsa_amixer本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。2手机事业部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,本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。3手机事业部ENFORCED_AUDIBLE=7,DTMF=8,TTS=9,Android把10种streamtype归纳为4种路由策略,getStrategy(stream_type)根据stream_type,返回对应的routing_strategy值,也就是返回stream_type对应的路由策略。AudioPolicyManager中有两个成员变量:mAvailableOutputDevices和mAvail-ableInputDevices,他们记录了当前可用的输入和输出设备。getDeviceForStrategy()则结合routing_strategy、mPhoneState以及mAvail-ableOutputDevices或mAvailableInputDevices,返回可用的device。所以android设置音频通路时会先根据getStrategy(stream_type)和getDevice-ForStrategy()函数获取相应的输出、输入设备,然后通过setOutputDevice(mHard-wareOutput,newDevice)函数调用到alsa_default.cpp中的s_route、s_open函数控制到底层。s_open函数用会调用deviceName(handle,devices,mode),这个函数会根据Devices的值来组合成字符串。然后通过snd_pcm_open获取asound.conf中相应的pcm配置里面的controls,并对调用到codec驱动当中对codec进行配置。本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。4手机事业部例子:Music(NORMAL)->STRATEGY_MEDIA->DEVICE_OUT_WIRED_HEADSET->AndroidPlayback_Headset_normalRing(RINGTONE)->SONIFICATION->DEVICE_OUT_SPEAKER和DEVICE_OUT_WIRED_HEADSET->AndroidPlayback_Speaker_Headset_ringtone本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。5手机事业部1.2、codecCodec中文译名是编译码器,由英文编码器(coder)和译码器(decoder)两词的词头组成的缩略语。指的是数字通信中具有编码、译码功能的器件。Wm8900芯片内部框图:Wm8900内部包括有:ADC、DAC、OutputMixer、InputMixer、InputPGA、LI-NEOUT2、HPOUT等音频输入口:INPUT1、INPUT2、INPUT3、I2S_DAC音频输入口:HPOUT、LINEOUT1、LINEOUT2、I2S_ADCCodec输入输出选择、音量控制、各个部分的power会都会通过control、widgets注册到不同的list中供ALSA和用户使用。本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。6手机事业部2、通过ALSA的controls控制codec实现通路切换。2.1、controlCodec中会把一部分功能的设置信息,以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_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定义的标准是“SOURCEDIRECTIONFUNCTION”即“源、方向、功能”。(3)info函数可以得到对应control的详细信息。(4)get()函数用于得到control的目前值并返回用户空间。(5)put()函数用于从用户空间写入值,如果值被改变,该函数返回1,否则返回0;如果发生错误,该函数返回错误码。(6)private_value保存了改control用于设置codec的详细信息。这些也就是与codec直接相关的信息。reg表示寄存器地址;shift表示数据偏移量;max表示数据最大值;invert表示是否倒置。所有的control都是通过snd_soc_add_controls(codec,wm8900_snd_controls,ARRAY_SIZE(wm8900_snd_controls))函数添加到声卡中。本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。7手机事业部2.2、widgetWidget可以认为是codec内部各个部件,需要根据audio_map对应的path来调用。Widget的管理和控制都是在soc-dapm.c中去实现的。通过snd_soc_dapm_new_controls函数添加到codec->dapm_widgets中。SND_SOC_DAPM_PGA("LINEOUT1LPGA",WM8900_REG_POWER2,8,0,NULL,0),SND_SOC_DAPM_PGA会直接把widget对应的信息添加到codec->dapm_widgets中,包括id、reg、shift、max等。id用来区分不同的widget类型,不同的id控制方式也不同。codec通过snd_soc_add_controls和wm8900_add_widgets两个函数把来添加control、widgets到不同的list里。wm8900_add_widgets中除了把wm8900_dapm_widgets结构体里面的所有widgets信息添加到list里,还通过snd_soc_dapm_add_routes函数把audio_map里的信息添加到list里。本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。8手机事业部2.3、audio_map2.3.1、audio_map介绍重点说下audio_map,因为audio_map是一个帮助我们切换通路的很重要的部分。我们可以根据audio_map来控制codec实现通路而不用去了解codec具体内部需要怎么配置寄存器来实现连接。这样就可以不用怎么去了解codec芯片。audio_map的类型snd_soc_dapm_route定义为:structsnd_soc_dapm_route{constcharsink;constcharcontrol;constcharsource;};可以理解为:目的地,控制条件,源头。Codec的通路(连接方式)非常多,以WM8900为例举个例子。从HP_L输出(目的地sink)的信号可能来自MIC、DAC(源头source),而这个取决于codec的配置(控制条件control)。每个通路在codec内部又被分成了好几个部分,也就是前面说到的widgets,每个widget都可以做为一个数据流的源头或者目的地。这些widgets可能的path都在audio_map罗列出来了。如下是WM8900一部分audio_map:/Outputs{"LINEOUT1L",NULL,"LINEOUT1LPGA"},{"LINEOUT1LPGA",NULL,"LeftOutputMixer"},{"LINEOUT1R",NULL,"LINEOUT1RPGA"},{"LINEOUT1RPGA",NULL,"RightOutputMixer"},本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。9手机事业部{"LINEOUT2LPGA",NULL,"LeftOutputMixer"},{"LINEOUT2LP","Disabled","LINEOUT2LPGA"},{"LINEOUT2LP","Enabled","LeftOutputMixer"},{"LINEOUT2L",NULL,"LINEOUT2LP"},{"LINEOUT2RPGA",NULL,"RightOutputMixer"},{"LINEOUT2LP","Disabled","LINEOUT2RPGA"},{"LINEOUT2LP","Enabled","RightOutputMixer"},{"LINEOUT2R",NULL,"LINEOUT2LP"},{"LeftOutputMixer","LINPUT3BypassSwitch","LINPUT3"},{"LeftOutputMixer","AUXBypassSwitch","AUX"},{"LeftOutputMixer","LeftInputMixerSwitch","LeftInputMixer"},{"LeftOutputMixer","RightInputMixerSwitch","RightInputMixer"},{"LeftOutputMixer","DACLSwitch","DACL"},{"RightOutputMixer","RINPUT3BypassSwitch","RINPUT3"},{"RightOutputMixer","AUXBypassSwitch","AUX"},{"RightOutputMixer","LeftInputMixerSwitch","LeftInputMixer"},{"RightOutputMixer","RightInputMixerSwitch","RightInputMixer"},{"RightOutputMixer","DACRSwitch","DACR"},{"HeadphoneAmplifier",NULL,"LINEOUT2LP"},{"HeadphoneAmplifier",NULL,"LINEOUT2LP"},{"HP_L",NULL,"HeadphoneAmplifier"},{"HP_R",NULL,"HeadphoneAmplifier"},从audio_map中可以看出,对于LINEOUT2LP,可以是HeadphoneAmplifier的source,也可以是LeftOutputMixer的sink。2.3.2、audio_map分析本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。10手机事业部对于每一个sink,都有可能有好几个source,也就是codec中一个节点(widget)可能有好几个其他节点(widgets)可以连接到这个节点,如LeftOutputMixer在audio_map作为sink的情况包括:{"LeftOutputMixer","LINPUT3BypassSwitch","LINPUT3"},{"LeftOutputMixer","AUXBypassSwitch","AUX"},{"LeftOutputMixer","LeftInputMixerSwitch","LeftInputMixer"},{"LeftOutputMixer","RightInputMixerSwitch","RightInputMixer"},{"LeftOutputMixer","DACLSwitch","DACL"},这个时候audio_map的control就起了作用。目前我遇到的control只有三种情况,这个也是和widget的添加定义有关,也可以说是与id有,不同id对应path中的control不同:(1)、NULL如:{"HeadphoneAmplifier",NULL,"LINEOUT2LP"},这个时候这个只要LINEOUT2LP作为sink时的path以及HeadphoneAmplifier作为source时的path是连接的状态,那么这个path就自动连接起来。也就是ALSA中会先判断当前path的下游path和上游path是否已经连接。所以,在设置通路时,有这写path是要在所有path都连通的状态下才会全部都自动连接。具体实现如果想了解可以看soc-dapm.c中的staticintdapm_power_widgets(structsnd_soc_codeccodec,intevent)函数。(2)、字符串,source与switch组合而成。如:{"LeftOutputMixer","DACLSwitch","DACL"},对于这中情况,在audio_map添加到list里时会处理成新的control添加到ALSA中,我们可以通过alsa_amixer命令看到这个control的存在:numid=58,iface=MIXER,name=\'LeftOutputMixerDACLSwitch\'本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。11手机事业部控制这个control时参数填入on或者off就可以打开和关闭这个path。(3)、字符串,与source的字符串没有关系。如:{"LINEOUT2LP","Enabled","LeftOutputMixer"},那么这个时候只有当LINEOUT2LP对应的control命令设置为Enabled,这样两个widgets就连接起来了。所以我们要配置codec通路,实际上就是要根据每个codec的audio_map来控制ALSAcontrols。本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。12手机事业部2.4、通路切换播放音乐通路路径图:RK29_I2S->DAC->OUTMIXER->LINEOUT2->HPOUT要配置WM8900到播放音乐通路,那么我们就要知道WM8900播放音乐是的输入口和输出口。播放音乐使用的是I2S信号,所以输入口就是I2S的DAC,从芯片配合SDK电路我们可以知道输出口是HP_L与HP_R。(1)、先看DACL,从audio_map中我们可以看出。以DACL为源头的path只有LeftOutputMixer。{"LeftOutputMixer","DACLSwitch","DACL"},本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。13手机事业部(2)、LeftOutputMixer作为源头,可以与之相连的widgets有一下三个:{"LINEOUT1LPGA",NULL,"LeftOutputMixer"},{"LINEOUT2LPGA",NULL,"LeftOutputMixer"},{"LINEOUT2LP","Enabled","LeftOutputMixer"},即可以到LINEOUT1LPGA、LINEOUT2LPGA、LINEOUT2LP(3)、同时,从audio_map中的下面列出的部分我们可以知道,要到HP_L只能通过LINEOUT2LP。{"HeadphoneAmplifier",NULL,"LINEOUT2LP"},{"HeadphoneAmplifier",NULL,"LINEOUT2LP"},{"HP_L",NULL,"HeadphoneAmplifier"},{"HP_R",NULL,"HeadphoneAmplifier"},(4)、所以播放音乐的路径就确认了:DACL->LeftOutputMixer->LINEOUT2LP->HeadphoneAmplifier->HP_L(5)、路径的实现过程中,只有两个path需要设置:{"LINEOUT2LP","Enabled","LeftOutputMixer"},{"LeftOutputMixer","DACLSwitch","DACL"},所以这部分在asound.conf中对应的控制:{name\'LINEOUT2LP\'valueEnabled}{name\'LeftOutputMixerDACLSwitch\'valueon}本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。14手机事业部{name\'RightOutputMixerDACRSwitch\'valueon}(6)、音量等的设置。通过前面几个步骤,codec的路径就已经打通了,但是可能某些widgets初始音量值是mute或者增益非常小导致听不到声音。另外在ADC和DAC部分有可能会选择输入、输出是左右声道的选择也要注意。所以在配置过程中要注意由snd_soc_add_controls函数添加到list的control命令了。对于WM8900的播放音乐通路,还需要设置:numid=26,iface=MIXER,name=\'DigitalPlaybackVolume\'所以综上所述,配置WM8900播放音乐通路pcm.AndroidPlayback_Speaker_normal如下:pcm.AndroidPlayback_Headset_normal{typehooksslave.pcm{typehwcard0device0#Mustbeoftype"digitalaudioplayback"}hooks.0{typectl_elemshook_args[{name\'LeftDACSource\'valueLeft本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。15手机事业部}{name\'RightDACSource\'valueRight}{name\'LINEOUT2LP\'valueEnabled}{name\'LeftOutputMixerDACLSwitch\'valueon}{name\'RightOutputMixerDACRSwitch\'valueon}{name\'DigitalPlaybackVolume\'value.085value.185}]}}本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。16手机事业部2.5、alsa_amixeralsa_amixer命令:该命令配置主要配置音频codec的mixer开关、mux对路选择、volume值等;#alsa_amixer--helpUsage:amixer
提供ALSA框架介绍-音频通路会员下载,编号:1700773870,格式为 docx,文件大小为19页,请使用软件:wps,office word 进行编辑,PPT模板中文字,图片,动画效果均可修改,PPT模板下载后图片无水印,更多精品PPT素材下载尽在某某PPT网。所有作品均是用户自行上传分享并拥有版权或使用权,仅供网友学习交流,未经上传用户书面授权,请勿作他用。若您的权利被侵害,请联系963098962@qq.com进行删除处理。