- 论坛徽章:
- 0
|
调用详细路径如下:
文件 |
原型 |
RingerVolumePreference.java |
onCheckedChanged(CompoundButton
buttonView, boolean isChecked) |
AudioManager.java |
setStreamVolume(int
streamType, int index, int flags) |
AudioService.java |
setStreamVolume(int
streamType, int index, int flags) |
AudioSystem.java |
native
setStreamVolumeIndex(int stream, int index); |
android_media_AudioSystem.cpp |
android_media_AudioSystem_setStreamVolumeIndex |
AudioSystem.cpp |
setStreamVolumeIndex(stream_type
stream, int index) |
AudioPolicyService.cpp |
setStreamVolumeIndex(AudioSystem::stream_type
stream, int index) |
AudioPolicyManager.cpp |
setStreamVolumeIndex(AudioSystem::stream_type
stream, int index) |
AudioPolicyService.cpp |
setStreamVolume(AudioSystem::stream_type
stream, float volume, audio_io_handle_t output, int delayMs = 0); |
AudioPolicyService.cpp |
AudioCommandThread::volumeCommand(int
stream, float volume, int output, int delayMs) |
AudioPolicyService.cpp |
AudioCommandThread::threadLoop() |
AudioSystem.cpp |
setStreamVolume(int
stream, float value, int output) |
AudioFlinger.cpp |
setStreamVolume(int
stream, float value, int output) |
AudioFlinger.cpp |
MixerThread::threadLoop() |
AudioFlinger.cpp |
MixerThread::prepareTracks_l(const
SortedVector< wp<Track> >& activeTracks, Vector<
sp<Track> > *tracksToRemove) |
AudioMixer.cpp |
process(void*
output) | 详细步骤: 1.当按音量调节按钮时  会调用RingerVolumePreference::on CheckedChanged,见文件 packages/apps/Settings/res/layout/sound_and_display_settings.xml, 然后就会调用AudioManager::setStreamVolume,一路跟踪直至文件AudioPolicyManager.cpp中的函数setStreamVolumeIndex,它会调用checkAndSetVolume,进而调用mpClientInterface->setStreamVolume,这个mpClientInterface应该是由AudioPolicyService来实现的,所以调用AudioPolicyService.cpp中的setStreamVolume,一直往下看至AudioFlinger.cpp中的setStreamVolume,改变的值保存在数组mStreamTypes中。 另外,当播放音乐时,MixerThread::threadLoop()是一直在运行的,当检测到待播放的track时,就调用函数prepareTracks_l,这个函数里会计算左右声道的音量,并且设置到AudioMixer里,代码如下: ......
float typeVolume = mStreamTypes[track->type()].volume;
float v = mMasterVolume * typeVolume; float v_clamped = v *
cblk->volume[0]; if (v_clamped > MAX_GAIN) v_clamped =
MAX_GAIN; left = int16_t(v_clamped);
v_clamped = v * cblk->volume[1]; if (v_clamped >
MAX_GAIN) v_clamped = MAX_GAIN; right =
int16_t(v_clamped); ......
mAudioMixer->setParameter(AudioMixer::RAMP_VOLUME, AudioMixer::VOLUME0,
left); mAudioMixer->setParameter(AudioMixer::RAMP_VOLUME,
AudioMixer::VOLUME1, right);
...... 调用函数prepareTracks_l后,继续调用 mAudioMixer->process(curBuf); 从而综合处理音频数据 由上可见,android是利用软件来调节音量,仅仅设置一个硬件音量的最大值(完). |
|