在android 2.3版本或更高的版本中有一個musicFx應用,用於設置音效,音樂播放器music或設置中均有設置音效界面的入口,設置的值通過Sharepreference保存在data/data/com.android.musicFx這個目錄下,我的問題是系統是如何讀到這些值的?在哪個類讀的?對於最後的是混音工作我知道一定是在audioFlinger裡完成,很想知道是怎麼到那裡的?還請高手解答,說下思路也可以。
以下的#號全部當成下劃線, 非代碼段中的“_”這個識別不出來,一個小bug。
前面的回答 這個Intent AudioEffect.ACTION_GET_PARAM
只能獲取一些參數,如果只想獲得數據是可以用的,不過在源碼只看到接收的receiver, 並沒有看到發送這個Intent的例子。
對於我的問題更關心的是下面的流程:當界面調節seekbar改變具體音效大小的時候會觸發下面兩個函數,先getParameter後setParameter,
public int setParameter(byte[] param, byte[] value) throws IllegalStateException {
checkState("setParameter()");
return native_setParameter(param.length, param, value.length, value);
}
public int getParameter(byte[] param, byte[] value) throws IllegalStateException {
checkState("getParameter()");
return native_getParameter(param.length, param, value.length, value);
}
setParameter方法裡會調用native_setParameter,通過JNI會來到
audio_media_AUdioEffect.cpp {"native_setParameter", "(I[BI[B)I", (void*)android_media_AudioEffect_native#setParameter},
在這個android_media_AudioEffect#native_setParameter函數裡會找到下面這個
mIEffect->command(EFFECT_CMD_SET_PARAM, sizeof (effect_param_t) + psize, param, &size, ¶m->status);
而 mIEffect的由iEffect賦值,而iEffect初始化代碼如下,
iEffect = audioFlinger->createEffect(getpid(), (effect_descriptor_t *)&mDescriptor,
mIEffectClient, priority, io, mSessionId, &mStatus, &mId, &enabled);
這樣我們就把界面上的值送到audioFlinger,後面還要涉及到EffectHandle,EffectModule一些類,更具體的過程還有待分析,不過對於上面問題的解答到這裡可以暫時完成了。以上是個人的整理結果,如果大家有更好的結果,歡迎分享啊。問題也許太寬泛了,只好自己來結束問題了。
.