首先看AudioManager的setParameters方法:
//frameworks/base/media/java/android/media/AudioManager.java
public class AudioManager {
public void setParameters(String keyValuePairs) {
AudioSystem.setParameters(keyValuePairs); //调用AudioSystem的setParameters方法
}
}
调用AudioSystem的setParameters方法:
//frameworks/base/service/java/com/android/server/audio/AudioSystem.java
public static native int setParameters(String keyValuePairs);
AudioSystem的setParameters为native方法,查询android_media_AudioSystem.cpp的gMethods:
//frameworks/base/core/jni/android_media_AudioSystem.cpp
{"setParameters", "(Ljava/lang/String;)I", (void *)android_media_AudioSystem_setParameters},
会调用android_media_AudioSystem_setParameters方法:
//frameworks/base/core/jni/android_media_AudioSystem.cpp
static jint android_media_AudioSystem_setParameters(JNIEnv *env, jobject thiz, jstring keyValuePairs)
{
const jchar* c_keyValuePairs = env->GetStringCritical(keyValuePairs, 0);
String8 c_keyValuePairs8;
if (keyValuePairs) {
c_keyValuePairs8 = String8(
reinterpret_cast<const char16_t*>(c_keyValuePairs),
env->GetStringLength(keyValuePairs));
env->ReleaseStringCritical(keyValuePairs, c_keyValuePairs);
}
int status = check_AudioSystem_Command(AudioSystem::setParameters(c_keyValuePairs8));
return (jint) status;
}
调用AudioSystem的setParameters方法:
//frameworks/av/media/libaudioclient/AudioSystem.cpp
status_t AudioSystem::setParameters(const String8& keyValuePairs) {
return setParameters(AUDIO_IO_HANDLE_NONE, keyValuePairs);
}
调用setParameters重载方法:
//frameworks/av/media/libaudioclient/AudioSystem.cpp
status_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) {
const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
if (af == 0) return PERMISSION_DENIED;
return af->setParameters(ioHandle, keyValuePairs);
}
AudioFlinger setParameters
调用IAudioFlinger的setParameters方法,IAudioFlinger是一个接口,具体实现为AudioFlinger,因此会调用AudioFlinger的setParameters方法: