Android 7.0 Audio: 按鍵調節音量的調用過程

(只簡單描述調用過程,需對照代碼看,不畫圖了,也不貼代碼)

1.在key Event處理部分,Phonewindow會捕獲到音量按鍵事件,

Phonewindow.onkeydown-- MediaSessionLegacyHelper.getHelper(getContext()).sendAdjustVolumeBy

 

2.調節音量的時候要處理3件事情,界面顯示、播放提示音、調節音量,

MediaSessionManager. dispatchAdjustVolume--mService.dispatchAdjustVolume/ binder-- MediaSessionService. dispatchAdjustVolume—dispatchAdjustVolumeLocked--mAudioService.adjustSuggestedStreamVolume

 

(如使用AudioManager,則AudioManager 的handleKeyDown、handleKeyUp也可來設置音量。

handleKeyDown--adjustSuggestedStreamVolume--MediaSessionLegacyHelper.sendAdjustVolumeBy—

)

 

 

3.在Audio模塊,

mAudioService.adjustSuggestedStreamVolume(direction,suggestedStream,

                            flags, packageName, TAG);/binder – AudioService.adjustSuggestedStreamVolume—adjustStreamVolume/這裏做了些場景處理和判斷,將APS的工作提前做了,之後,

 

a)調音量,走            --sendMsg(mAudioHandler,

                        MSG_SET_DEVICE_VOLUME,

                        SENDMSG_QUEUE,

                        device,

                        0,

                        streamState,

                        0);-- setDeviceVolume--mStreamStates[streamType].applyDeviceVolume_syncVSS(streamDevice)-- AudioSystem.setStreamVolumeIndex/jni -- AudioSystem.setStreamVolumeIndex-- aps->setStreamVolumeIndex(stream, index, device)/ binder-- AudioPolicyInterfaceImpl.cppsetStreamVolumeIndex-- mAudioPolicyManager->setStreamVolumeIndex—checkAndSetVolume—

調一般的音量調用outputDesc->setVolume,待後面打開output

調節音量使用,調正在播放的鈴聲音量不在這個地方。

調通話中音量走mpClientInterface->setVoiceVolume-- AudioPolicyService::AudioPolicyClient::setVoiceVolume-- mAudioPolicyService->setVoiceVolume -- AudioPolicyService::setVoiceVolume -- mAudioCommandThread->voiceVolumeCommand/SET_VOICE_VOLUME -- AudioSystem::setVoiceVolume -- af->setVoiceVolume -- dev->set_voice_volume--audio_hw.c adev_set_voice_volume-- voice_set_volume-- …

 

這個調音量的流程也是夠夠的了,從jni下來後,AS—APS—APM—APS—AS—AF—HAL這樣走了一大圈。

 

b)調界面,走 —sendVolumeUpdate-- mVolumeController.postVolumeChanged(streamType,flags);-- mController.volumeChanged/ binder--

VolumeDialogController. volumeChanged-- mWorker.obtainMessage(W.VOLUME_CHANGED, streamType,flags).sendToTarget();--onVolumeChangedW--…

 

 

 

4.對於通過outPut設置音量的部分,如果是deepbuffer播放就不會調用下來,如果是offload播放,在audio_hw.c裏面

static intout_set_volume(struct audio_stream_out *stream, float left,

                         float right)

  out->stream.set_volume = out_set_volume;

 

在audioflinger裏面就調整了

Threads.cpp(frameworks\av\services\audioflinger):           if (mOutput->stream->set_volume) {

Threads.cpp (frameworks\av\services\audioflinger):               mOutput->stream->set_volume(mOutput->stream, left, right);

 

 

5.在audio_hw.c裏面,流程如下,

out_set_volume--passthru.caudio_extn_passthru_set_volume--platform.c platform_set_device_params

發佈了96 篇原創文章 · 獲贊 40 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章