首先上層java調用 java
XXXPlayer android
AudioManager audiomanage = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); api
audiomanager就是咱們定義的控制系統聲音的對象,(若是context報錯,可將其改爲XXXPlayer.this) app
audiomanager.SetStreamVolume(AA,BB,CC),是咱們能夠直接使用的AudioManager的成員函數,3個 參數表示的意思:AA:有內置的常量,能夠在AudioManager裏面查到相關的定義,咱們在此用 AudioManager.STREAM_MUSIC, BB:本身設置音量的值,CC:也是一些標示量,我在此設置爲0; 函數
1.AudioManager.java post
public void setStreamVolume(int streamType, int index, int flags);上層接口 ui
1)調用IAudioService service = getService(); 當程序開啓時會得到service,調用此來得到 this
2.執行ServiceManager.java
public static IBinder getService(String name)獲取audio服務 spa
3.AudioService.java
public void setStreamVolume(int streamType, int index, int flags)//服務接口
1) private void setStreamVolumeInt(int streamType, int index, boolean force, boolean lastAudible)//服務函數
2)調用如下函數
sendMsg(mAudioHandler, MSG_SET_SYSTEM_VOLUME, streamType, SENDMSG_NOOP, 0, 0,streamState, 0)
//Post message to set system volume (it in turn will post a message
// to persist)
3)AudioHandler::setSystemVolume(VolumeStreamState streamState);//sendmsg(...)後執行函數
4)調用AudioHandler::setStreamVolumeIndex(int stream, int index)
5)AudioSystem.setStreamVolumeIndex(stream,index);//audioSystem接口 對象
static int android_media_AudioSystem_setStreamVolumeIndex(JNIEnv *env, jobject thiz, jint stream, jint index)
1)調用AudioSystem::setStreamVolumeIndex
6.status_t AudioSystem::setStreamVolumeIndex(stream_type stream, int index)(處理到這時,也能夠直接走AudioFlinger路線,不通過策略)
1)得到服務 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2)調用aps->setStreamVolumeIndex(stream, index)
7.status_t AudioPolicyService::setStreamVolumeIndex(AudioSystem::stream_type stream, int index)
1)調用mpPolicyManager->setStreamVolumeIndex(stream, index)
status_t AudioPolicyManager::setStreamVolumeIndex(AudioSystem::stream_type stream, int index)
1)記錄音量index: mStreams[stream].mIndexCur = index
2)compute and apply stream volume on all outputs:
checkAndSetVolume(stream, index, mOutputs.keyAt(i), mOutputs.valueAt(i)->device())
8.status_t AudioPolicyManager::checkAndSetVolume(int stream, int index, audio_io_handle_t output, uint32_t device, int delayMs, bool force)
1)計算音量:float volume = computeVolume(stream, index, output, device);
2)調用:mpClientInterface->setStreamVolume((AudioSystem::stream_type)stream, volume, output, delayMs);
9.status_t AudioPolicyService::setStreamVolume(AudioSystem::stream_type stream, float volume, audio_io_handle_t output, int delayMs)
調用mAudioCommandThread->volumeCommand((int)stream, volume, (int)output, delayMs);
10.status_t AudioPolicyService::AudioCommandThread::volumeCommand(int stream, float volume, int output, int delayMs)
調用insertCommand_l(command, delayMs);
補充1)在條用getService();獲取服務的時候 ,實際調用的是ServiceManager.getService(context);
系統服務都是由serviceManager來管理的,要添加服務,能夠調用serviceManager.AddService(context,service);
每添加一個service,都會有對應的惟一context, 當getService的時候就會根據context得到相應的服務,
可查看ServiceManager.java, ServiceManager.h/cpp
補充2) AudioService 的接口在 IaudioService.aidl中定義。添加自定義功能時( 咱們建立控制接口好比建立個音效處理的接口SetEffectVolume(XXX),能夠參照SetStreamVolume(a,b,c))別忘了修 改此處,不然,AudioManager 會出現cannot find symbol..錯誤!!!
補充3)編譯的時候可能會在Audiomanager.java中調用本身寫的接口時出錯,此時先將該文件中的調用註釋掉,執行 make update-api
執行完成後,將註釋去掉,而後重新編譯。。。