




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、ALSA框架介紹一一音質(zhì)通路陳金同2011-3-3內(nèi)容:1、簡(jiǎn)單介紹android音頻狀態(tài)與音頻通路、codec。2、通過(guò)ALSA的controls控制codec實(shí)現(xiàn)通路切換2.1、 control2.2、 widget2.3、 audio_map2.4、 通路切換2.5、 alsa_amixer1、簡(jiǎn)單介紹android音頻狀態(tài)與音頻通路、/“dec、聲卡注冊(cè)1.1、android音頻狀態(tài)與音頻通路Android的音頻通路管理主要是在A(yíng)udioPolicyManager中完成的,包括音量管理,音頻策略(strategy)管理,輸入輸出設(shè)備管理。Android音頻模式狀態(tài)圖:Android的音
2、頻模式狀態(tài)包括:NORMAL、IN_CALL、RINGTONE。AudioPolicyManager的mPhoneState成員變量記錄了當(dāng)前音頻模式狀態(tài),在音頻通路切換時(shí)的設(shè)備選擇時(shí)會(huì)使用到。在這3種音頻模式狀態(tài)下一共有10種音頻數(shù)據(jù)流,定義如下:VOICE_CALL=0,SYSTEM=1,RING=2,MUSIC=3,ALARM=4,NOTIFICATION=5,BLUETOOTH_SCO=6,府嗑罐手機(jī)事業(yè)部ENFORCED_AUD舊LE=7,DTMF=8,TTS=9,Android把10種streamtype歸納為4種路由策略,getStrategy(stream_type)根據(jù)str
3、eam_type,返回對(duì)應(yīng)的routing_strategy值,也就是返回stream_type對(duì)應(yīng)的路由策略。AudioPolicyManager中有兩個(gè)成員變量:mAvailableOutputDevicesmAvailableInputDevices,他們記錄了當(dāng)前可用的輸入和輸出設(shè)備。getDeviceForStrategy()貝U結(jié)合routing_strategy、mPhoneState以及mAvailableOutputDevices或mAvailableInputDevices,返回可用的device。所以android設(shè)置音頻通路時(shí)會(huì)先根據(jù)getStrategy(stream
4、_type)getDeviceForStrategy()函數(shù)獲取相應(yīng)的輸出、輸入設(shè)備,然后通過(guò)函數(shù)調(diào)用到alsa_default.cpp中setOutputDevice(mHardwareOutput,newDevice)的s_route、s_open函數(shù)控制到底層。s_open函數(shù)用會(huì)調(diào)用deviceName(handle,devices,mode),這個(gè)函數(shù)會(huì)根據(jù)Devices的值來(lái)組合成字符串。然后通過(guò)snd_pcm_open獲取asound.conf中相應(yīng)的pcm配置里面的controls,并對(duì)調(diào)用到codec驅(qū)動(dòng)當(dāng)中對(duì)codec進(jìn)行配置。3例子:HEADSETMusic(NORMAL
5、)-STRATEGY_MEDIA-DEVICE_OUT_WIRED_-AndroidPlayback_Headset_normalRing(RINGTONE)-SONIFICATION-DEVICE_OUT_SPEAKERDEVICE_OUT_WIRED_HEADSET-AndroidPlayback_Speaker_Headset_ringtone4府叫手機(jī)事業(yè)部1.2、codecCodec中文譯名是編譯碼器,由英文編碼器(coder)和譯碼器(decoder)兩詞的詞頭組成的縮略語(yǔ)。指的是數(shù)字通信中具有編碼、譯碼功能的器件。Wm8900芯片內(nèi)部框圖:Auxacow豐IDlFVNE(3dWi
6、LLiotfsonWM軟MLJNPUT2UHPUT1RJNPUT1R1NPUH3VDDCFVDDLO1CUFVPOSCPGHDK3ITMAULMIDINTERFACE-xQld豈止曾CONTROLINTERFACEWm8900內(nèi)部包括有:ADC、DAC、OutputMixer、InputMixer、InputPGA、LINEOUT2、HPOUT等音頻輸入口:INPUT1、INPUT2、INPUT3、I2S_DAC音頻輸入口:HPOUT、LINEOUT1、LINEOUT2、I2S_ADCCodec輸入輸出選擇、音量控制、各個(gè)部分的power會(huì)都會(huì)通過(guò)control、widgets注冊(cè)到不同的li
7、st中供ALSA和用戶(hù)使用。k.路切換??刂芻odec實(shí)2、通過(guò)ALSA的controls2.1 、controlCodec中會(huì)把一部分功能的設(shè)置信息,以control的形式通過(guò)snd_soc_add_controls函數(shù)添加到聲卡中,我們可以通過(guò)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,.inf
8、o=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的類(lèi)型,形式為SNDRV_CTL_ELEM_IFACE_XXX,通常是MIXER(2) name是名稱(chēng)標(biāo)識(shí)字符串,control的名稱(chēng)非常重要,因?yàn)閏ontrol的作用由名稱(chēng)來(lái)區(qū)分。name定義的標(biāo)準(zhǔn)是“SOURCEDIRECTIONFUNCTION即源、方向、功能”。(3) info函數(shù)可以得到對(duì)應(yīng)control的
9、詳細(xì)信息。(4) get()函數(shù)用于得到control的目前值并返回用戶(hù)空間。(5) put()函數(shù)用于從用戶(hù)空間寫(xiě)入值,如果值被改變,該函數(shù)返回1,否則返回0;如果發(fā)生錯(cuò)誤,該函數(shù)返回錯(cuò)誤碼。(6) private_value保存了改control用于設(shè)置codec的詳細(xì)信息。這些也就是與codec直接相關(guān)的信息。reg表示寄存器地址;shift表示數(shù)據(jù)偏移量;max表示數(shù)據(jù)最大值;invert表示是否倒置。所有的control都是通過(guò)snd_soc_add_controls(codec,wm8900_snd_controls,ARRAY_SIZE(wm8900_snd_controls)函
10、數(shù)添加到聲卡中。Widget可以認(rèn)為是codec內(nèi)部各個(gè)部件,需要根據(jù)audio_map對(duì)應(yīng)的path來(lái)調(diào)用。Widget的管理和控制都是在soc-dapm.c中去實(shí)現(xiàn)的。通過(guò)snd_soc_dapm_new_controls函數(shù)添力口至Ucodec-dapm_widgets中。SND_SOC_DAPM_PGA(LINEOUT1LPGA,WM8900_REG_POWER2,8,0,NULL,0),SND_SOC_DAPM_PGA會(huì)直接把widget對(duì)應(yīng)的信息添力睢Ucodec-dapm_widgets中,包括id、reg、shift、max等。id用來(lái)區(qū)分不同的widget類(lèi)型,不同的id控制
11、方式也不同。codec通過(guò)snd_soc_add_controls和wm8900_add_widgets兩個(gè)函數(shù)把來(lái)添加control、widgets到不同的list里。wm8900_add_widgets中除了把wm8900_dapm_widgets結(jié)構(gòu)體里面的所有widgets信息添力口至Ulist里,還通過(guò)snd_soc_dapm_add_routes函數(shù)把a(bǔ)udio_map里的信息添加到list里。2.3、 audio_map2.3.1 、audio_map介紹重點(diǎn)說(shuō)下audio_map,因?yàn)閍udio_map是一個(gè)幫助我們切換通路的很重要的部分。我們可以根據(jù)audio_map來(lái)控制c
12、odec實(shí)現(xiàn)通路而不用去了解codec具體內(nèi)部需要怎么配置寄存器來(lái)實(shí)現(xiàn)連接。這樣就可以不用怎么去了解codec芯片。audio_map的類(lèi)型snd_soc_dapm_route定義為:structsnd_soc_dapm_routeconstchar*sink;constchar*control;constchar*source;可以理解為:目的地,控制條件,源頭。Codec的通路(連接方式)非常多,以WM8900為例舉個(gè)例子。從HP_L輸出(目的地sink)的信號(hào)可能來(lái)自MIC、DAC(源頭source),而這個(gè)取決于codec的配置(控制條件control)。每個(gè)通路在codec內(nèi)部又被分
13、成了好幾個(gè)部分,也就是前面說(shuō)到的widgets,每個(gè)widget都可以做為一個(gè)數(shù)據(jù)流的源頭或者目的地。這些widgets可能的path都在audio_map羅列出來(lái)了。如下是WM8900一部分audio_map:/*Outputs*/LINEOUT1L,NULL,LINEOUT1LPGA,LINEOUT1LPGA,NULL,LeftOutputMixer,LINEOUT1R”,NULL,LINEOUT1RPGA,LINEOUT1RPGA,NULL,RightOutputMixer,LINEOUT2LPGA,NULL,LeftOutputMixer,LINEOUT2LP,Disabled,LIN
14、EOUT2LPGA,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,Lef
15、tInputMixerSwitch,LeftInputMixer,LeftOutputMixer,RightInputMixerSwitch,RightInputMixer,LeftOutputMixer,DACLSwitch,DACL,RightOutputMixer,RINPUT3BypassSwitch,RINPUT3,RightOutputMixer,AUXBypassSwitch,AUX,RightOutputMixer,LeftInputMixerSwitch,LeftInputMixer,RightOutputMixer,RightInputMixerSwitch,RightIn
16、putMixer,RightOutputMixer,DACRSwitch,DACR,HeadphoneAmplifier,NULL,LINEOUT2LP,HeadphoneAmplifier,NULL,LINEOUT2LP,HP_L,NULL,HeadphoneAmplifier,HP_R,NULL,HeadphoneAmplifier,從audio_map中可以看出,對(duì)于LINEOUT2LP,可以是HeadphoneAmplifier的source,也可以是LeftOutputMixer的sink。對(duì)于每一個(gè)sink,都有可能有好幾個(gè)source,也就是codec中一個(gè)節(jié)點(diǎn)(widget)可
17、能有好幾個(gè)其他節(jié)點(diǎn)(widgets)可以連接到這個(gè)節(jié)點(diǎn),如LeftOutputMixer在audio_map作為sink的情況包括:LeftOutputMixer,LINPUT3BypassSwitch,LINPUT3,LeftOutputMixer,AUXBypassSwitch,AUX,LeftOutputMixer,LeftInputMixerSwitch,LeftInputMixer,LeftOutputMixer,RightInputMixerSwitch,RightInputMixer,LeftOutputMixer,DACLSwitch,DACL,這個(gè)時(shí)候audio_map的co
18、ntrol就起了作用。目前我遇到的control只有三種情況,這個(gè)也是和widget的添加定義有關(guān),也可以說(shuō)是與id有,不同id對(duì)應(yīng)path中的control不同:、NULL如:HeadphoneAmplifier,NULL,LINEOUT2LP,這個(gè)時(shí)候這個(gè)只要LINEOUT2LP作為sink時(shí)的path以及HeadphoneAmplifier作為source時(shí)的path是連接的狀態(tài),那么這個(gè)path就自動(dòng)連接起來(lái)。也就是ALSA中會(huì)先判斷當(dāng)前path的下游path和上游path是否已經(jīng)連接。所以,在設(shè)置通路時(shí),有這寫(xiě)path是要在所有path都連通的狀態(tài)下才會(huì)全部都自動(dòng)連接。具體實(shí)現(xiàn)如果想
19、了解可以看soc-dapm.c中的staticintdapm_power_widgets(structsnd_soc_codec*codec,intevent)函數(shù)。(2)、字符串,source與switch組合而成。如:LeftOutputMixer,DACLSwitch,DACL,Ihk.1011對(duì)于這中情況,在audio_map添加到list里時(shí)會(huì)處理成新的control添加到ALSA中,我們可以通過(guò)alsa_amixer命令看到這個(gè)control的存在:numid=58,iface=MIXER,name=LeftOutputMixerDACLSwitch控制這個(gè)control時(shí)參數(shù)填入
20、on或者off就可以打開(kāi)和關(guān)閉這個(gè)path。(3)、字符串,與source的字符串沒(méi)有關(guān)系。如:LINEOUT2LP,Enabled,LeftOutputMixer,那么這個(gè)時(shí)候只有當(dāng)LINEOUT2LP對(duì)應(yīng)的control命令設(shè)置為Enabled,這樣兩個(gè)widgets就連接起來(lái)了。所以我們要配置codec通路,實(shí)際上就是要根據(jù)每個(gè)codec的audio_map來(lái)控制ALSAcontrols瑞芯微電子2.4、通路切換播放音樂(lè)通路路徑圖:1uFHLVNEGVPOSCFB1CFB2LINE0UT2L產(chǎn):-IL471FHPINLHDLHPGNDHPRHPINR二=0.47uFLINEOUT1RIA
21、DCREFDACREFDCVDDDBVDDCPVDDHICPVD口947Bt&Hi3fiUNEOUT2R1OuF10uF-15Id-CPGNDO-15R/日LEFTMIXEnLINE0UT1LADCCUGITALFILTERS/OLUhtEtIGI1AL、一339SIMS-15E-WEChargePumpRIGHTMKER-IT-1-s5jiDIGITALAUDIOINTERFACECONTROLINTERFACE1DAC-OUTMIXER-LINEOUT2-HPOUT要配置WM8900到播放音樂(lè)通路,那么我們就要知道WM8900播放音樂(lè)是的輸入口和輸出口。播放音樂(lè)使用的是I2S信號(hào),所以輸入
22、口就是I2S的DAC,從芯片配合SDK電路我們可以知道輸出口是HP_L與HP_R。(1)、先看DACL,從audio_map中我們可以看出。以DACL為源頭的path只有LeftOutputMixer。LeftOutputMixer,DACLSwitch,DACL,12(2)、LeftOutputMixer作為源頭,可以與之相連的widgets有一下三個(gè):LINEOUT1LPGA,NULL,LeftOutputMixer,LINEOUT2LPGA,NULL,LeftOutputMixer,LINEOUT2LP,Enabled,LeftOutputMixer,即可以至ULINEOUT1LPGA、
23、LINEOUT2LPGA、LINEOUT2LP只能通過(guò)(3)、同時(shí),從audio_map中的下面列出的部分我們可以知道,要到HP_LLINEOUT2LP。HeadphoneAmplifier,NULL,LINEOUT2LP,HeadphoneAmplifier,NULL,LINEOUT2LP,HP_L,NULL,HeadphoneAmplifier,HP_R,NULL,HeadphoneAmplifier,(4)、所以播放音樂(lè)的路徑就確認(rèn)了:DACL-LeftOutputMixer-LINEOUT2LP-HeadphoneAmplifier-HP_L(5)、路徑的實(shí)現(xiàn)過(guò)程中,只有兩個(gè)path需
24、要設(shè)置:LINEOUT2LP,Enabled,LeftOutputMixer,LeftOutputMixer,DACLSwitch,DACL,所以這部分在asound.conf中對(duì)應(yīng)的控制:nameLINEOUT2LPvalueEnablednameLeftOutputMixerDACLSwitchvalueon13nameRightOutputMixerDACRSwitchvalueon(6)、音量等的設(shè)置。通過(guò)前面幾個(gè)步驟,codec的路徑就已經(jīng)打通了,但是可能某些widgets初始音量值是mute或者增益非常小導(dǎo)致聽(tīng)不到聲音。另外在A(yíng)DC和DAC部分有可能會(huì)選擇輸入、輸出是左右聲道的選擇
25、也要注意。所以在配置過(guò)程中要注意由snd_soc_add_controls函數(shù)添加到list的control命令了。對(duì)于WM8900的播放音樂(lè)通路,還需要設(shè)置:numid=26,iface=MIXER,name=DigitalPlaybackVolume所以綜上所述,配置WM8900播放音樂(lè)通路pcm.AndroidPlayback_Speaker_normal如下:pcm.AndroidPlayback_Headset_normaltypehooksslave.pcmtypehwcard0device0#Mustbeoftypedigitalaudioplaybackhooks.0typec
26、tl_elemshook_args14)nameRightDACSourcevalueRight)(nameLINEOUT2LPvalueEnabled)(nameLeftOutputMixerDACLSwitchvalueon)(nameRightOutputMixerDACRSwitchvalueon)(nameDigitalPlaybackVolumevalue.085value.185)15muxvolume值等;對(duì)路選擇、#alsa_amixer-help16Usage:amixercommandAvailableoptions:-h,-helpthishelp-c,-cardNse
27、lectthecard-D,-deviceNselectthedevice,defaultdefault-d,-debugdebugmode-n,-nocheckdonotperformrangechecking-v,-versionprintversionofthisprogram-q,-quietbequiet-i,-inactiveshowalsoinactivecontrols-a,-abstractLselectabstractionlevel(noneorbasic)-s,-stdinReadandexecutecommandsfromstdinsequentiallyscontr
28、olsshowallmixersimplecontrolsscontentsshowcontentsofallmixersimplecontrolscommand)ssetsIDPsetcontentsforonemixersimplecontrolsgetsIDgetcontentsforonemixersimplecontrolcontrolsshowallcontrolsforgivencardcontentsshowcontentsofallcontrolsforgivencardcsetcIDPsetcontrolcontentsforonecontrolcgetcIDgetcont
29、rolcontentsforonecontrolAvailablecommands:(default由于在配置wm8900過(guò)程中我只用到了alsa_amixercontrols、alsa_amixeralsa_amixercset、alsa_amixercget,所以下面我就介紹一下這四個(gè)命令的使用,另1外也順便提下alsa_alsactl。2.5.1 、alsa_amixercontrols:使用alsa_amixercontrols可以列出當(dāng)前alsa里面添加的controls的簡(jiǎn)單信息。如(具體可以看alsa_amixercontrols.txt):numid=59,iface=MIXER,name=LINEOUT2LP每個(gè)controls對(duì)應(yīng)一個(gè)numid,至于numid的排序應(yīng)該和添加的時(shí)候有關(guān)系吧。2.5.2 、alsa_amixer通過(guò)alsa_amixer命令,會(huì)列出,所有controls對(duì)應(yīng)的詳細(xì)信息。例1(具體可以看alsa_amixer.txt):SimplemixercontrolLINEOUT2LP,0Capabilities:enumI
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 住宅認(rèn)購(gòu)定金合同范本
- 倉(cāng)儲(chǔ)保管填寫(xiě)合同范本
- 2025年四川貨運(yùn)從業(yè)資格證考試的技巧
- 一房三賣(mài)買(mǎi)賣(mài)合同范本
- 停息掛賬律師委托合同范本
- 個(gè)人外匯貸款合同范本
- 助資合同范本
- 個(gè)人買(mǎi)房購(gòu)房合同范本
- 公司稅貸合同范本
- 個(gè)人店面整體裝修合同范本
- DB32-T 4752-2024 一體化污水處理設(shè)備通.用技術(shù)要求
- 醫(yī)院多重耐藥菌感染管理規(guī)范
- 《公平競(jìng)爭(zhēng)審查條例》微課
- 《肺部疾病 案例分析-原發(fā)性肺癌》課件
- (高清版)WST 402-2024 臨床實(shí)驗(yàn)室定量檢驗(yàn)項(xiàng)目參考區(qū)間的制定
- 中英對(duì)照版-中文版-The-Dead-By-James-Joyces死者-詹姆斯-喬伊斯
- 清水河儲(chǔ)能電站施工方案設(shè)計(jì)
- 低溫絕熱液氧瓶充裝操作規(guī)程模版(2篇)
- (正式版)JBT 11517-2024 刮板取料機(jī)
- 大眾汽車(chē)使用說(shuō)明書(shū)
- 小學(xué)科學(xué)湘科版五年級(jí)下冊(cè)全冊(cè)教案2023春
評(píng)論
0/150
提交評(píng)論