android 音量键 广播,【Android 7.0 Audio】: 按键调节音量的调用过程
轉載自http://blog..net/xiashaohua/article/details/53842337
只簡單描述調用過程,需對照代碼看,不畫圖了,也不貼代碼)
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
頂
0
踩
總結
以上是生活随笔為你收集整理的android 音量键 广播,【Android 7.0 Audio】: 按键调节音量的调用过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓如何截图长屏(安卓如何截图)
- 下一篇: android 退出多个activity