標籤:android
Android內建音頻均衡器MusicFx分析
種種原因,我要簡單分析一個Android中built-in的音頻均衡器MusicFx。重點是它的預設值的來曆。網上很少有文章講了這個的除了這篇《com.android.musicFx設定音效流程 -- 從app到AudioFlinger》。註:Android系統版本為4.2.2_r1。
從App到AudioFliger的終點是在android_media_AudioEffect.cpp(之前版本在是audio_media_AudioEffect.cpp)中的android_media_AudioEffect_native_getParameter()。
這裡調用了AudioEffect.cpp中的getParameter().
最終進入AudioFlinger:
mIEffect->command(EFFECT_CMD_GET_PARAM, sizeof(effect_param_t) + param->psize, param, &psize, param)
AudioFlinger如何對這個命令進行的處理Android音頻系統之AudioFlinger(一)和Android源碼分析:AudioEffect。
前者調用到了:
status_t status = (*mEffectInterface)->command(mEffectInterface,
cmdCode,
cmdSize,
pCmdData,
replySize,
pReplyData);
這個mEffectInterface是何方神聖呢?
中間出現了斷層,直接搜尋EFFECT_CMD_GET_PARAM.
1.EffectBundle
2.EffectDownmix.c -> Downmix_Command
3.EffectEqualizer.cpp -> Equalizer_command
可以看到調用了Equalizer_getParameter,這個函數的原型為:
這和應用程式中的api就對應起來了,擷取頻段的增益是getBandLevel:
返回了pContext->pBundleContext->bandGaindB[band] * 100;
來看看這個值有誰在設定。
源碼中開啟Log,在應用上使能Equalizer了 就會有輸出了,但是先暫停。
1) 通過查看以AudioEffect為TAG的日誌,可以判斷是先擷取的增益參數後設定的參數。
2) 類別為Normal。
終於找到了:frameworks/av/media/libeffects/lvm/wrapper/Bundle/EffectBundle.h
上邊是一個參考,真正直到作用是下面那個EQNB_5BandSoftProsets。
5段分別為:50Hz/230Hz/910Hz/4kHz/14kHz.以下是將230Hz調整為-10的實驗:
總結:研究這個MusicFx是源於裝置上擴音器在某些頻段增益過高導致啪啪響聲(我現在還不能使用專業的語言來形容這種現象),就準備測試使用軟體EQ來解決這個問題。現在EQ的預設值也找到了,但是這終究是軟體實現的,使用軟體實現來解決硬體問題我覺得是很不妥當,不過我也藉此機會瞭解了整個流程和預設值的位置。