Login
升级VIP 登录 注册 安全退出
当前位置: 首页 > word文档 > 其他文档 > ALSA框架介绍-音频通路

ALSA框架介绍-音频通路

收藏

本作品内容为ALSA框架介绍-音频通路,格式为 doc ,大小 413224 KB ,页数为 19页

ALSA框架介绍-音频通路


('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[command]Availableoptions:-h,--helpthishelp-c,--cardNselectthecard-D,--deviceNselectthedevice,default\'default\'-d,--debugdebugmode-n,--nocheckdonotperformrangechecking-v,--versionprintversionofthisprogram-q,--quietbequiet-i,--inactiveshowalsoinactivecontrols-a,--abstractLselectabstractionlevel(noneorbasic)-s,--stdinReadandexecutecommandsfromstdinsequentiallyAvailablecommands:scontrolsshowallmixersimplecontrolsscontentsshowcontentsofallmixersimplecontrols(defaultcommand)ssetsIDPsetcontentsforonemixersimplecontrolsgetsIDgetcontentsforonemixersimplecontrolcontrolsshowallcontrolsforgivencardcontentsshowcontentsofallcontrolsforgivencardcsetcIDPsetcontrolcontentsforonecontrolcgetcIDgetcontrolcontentsforonecontrol由于在配置wm8900过程中我只用到了alsa_amixercontrols、alsa_amixer、alsa_amixercset、alsa_amixercget,所以下面我就介绍一本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。17手机事业部下这四个命令的使用,另外也顺便提下alsa_alsactl。2.5.1、alsa_amixercontrols:使用alsa_amixercontrols可以列出当前alsa里面添加的controls的简单信息。如(具体可以看alsa_amixercontrols.txt):numid=59,iface=MIXER,name=\'LINEOUT2LP\'每个controls对应一个numid,至于numid的排序应该和添加的时候有关系吧。2.5.2、alsa_amixer:通过alsa_amixer命令,会列出,所有controls对应的详细信息。例1(具体可以看alsa_amixer.txt):Simplemixercontrol\'LINEOUT2LP\',0Capabilities:enumItems:\'Disabled\'\'Enabled\'Item0:\'Disabled\'这个control对应的可选状态为:\'Disabled\'\'Enabled\',当前状态为:\'Disabled\'例2:Simplemixercontrol\'LeftInputPGA\',0Capabilities:volumevolume-joinedpswitchpswitch-joinedpenumPlaybackchannels:MonoCapturechannels:MonoLimits:0-31Mono:21[68%][9.00dB]Playback[on]这个control对应的可选状态为:on、off,音量值范围:0~31,当前状态为:on,212.5.3、alsa_amixercset:本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。18手机事业部通过alsa_amixercset可以对control进行在线控制。如输入:alsa_amixercsetnumid=25,iface=MIXER,name=\'DACInvertSwitch\'0,1对DACInvertSwitch进行控制,关闭左声道,开启右声道。回应:numid=25,iface=MIXER,name=\'DACInvertSwitch\';type=BOOLEAN,access=rw------,values=2:values=off,on状态已经变。alsa_amixercget用于获取当前control的状态。如输入:alsa_amixercgetnumid=25,iface=MIXER,name=\'DACInvertSwitch\'回应numid=25,iface=MIXER,name=\'DACInvertSwitch\';type=BOOLEAN,access=rw------,values=2:values=off,on获取\'DACInvertSwitch\'的情况。2.5.4、alsa_alsactlalsa_alsactlstore:该命令生成/etc/asound.state文件,该文件显示当前ALSA中contols的配置情况,可以根据该文件检查codec的状态是否正确。#cat/etc/asound.state本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。19手机事业部使用amixer命令可以通过串口直接配置codec通路切换;配置完成后可以通过alsa_alsactl生成/etc/asound.state,列出当前控制过的control列表,进而编写asound.conf。本文档为瑞芯微电子手机事业部成员撰写及提供,不得用于工作之外的使用及交流。',)


  • 编号:1700773870
  • 分类:其他文档
  • 软件: wps,office word
  • 大小:19页
  • 格式:docx
  • 风格:商务
  • PPT页数:413224 KB
  • 标签:

广告位推荐

相关其他文档更多>