frameworks/base/media/java/android/media/AudioService.java
public void adjustMasterVolume(int steps, int flags)
public void setMasterVolume(int volume, int flags)
private void doSetMasterVolume(float volume, int flags)
private void doSetMasterVolume(float volume, int flags) {
if (!AudioSystem.getMasterMute()) {
int oldVolume = getMasterVolume();
AudioSystem.setMasterVolume(volume); //真正做事的
//setMasterVolumePrivate(volume); //第二种方案
int newVolume = getMasterVolume();
if (newVolume != oldVolume) {
// Post a persist master volume msg
sendMsg(mAudioHandler, MSG_PERSIST_MASTER_VOLUME, SENDMSG_REPLACE, //发送消息,保存音量值,以便重启时设置
Math.round(volume * (float)1000.0), 0, null, PERSIST_DELAY);
}
// Send the volume update regardless whether there was a change.
sendMasterVolumeUpdate(flags, oldVolume, newVolume); // UI update and Broadcast Intent
} else { // In case of mute, disable mute first.
setMasterMute(false, flags, new Binder());
}
}
第一种方案
frameworks/base/media/java/android/media/AudioSystem.java
public static native int setMasterVolume(float value);
frameworks/av/media/libmedia/AudioSystem.cpp
status_t AudioSystem::setMasterVolume(float value)
{
const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
if (af == 0) return PERMISSION_DENIED;
af->setMasterVolume(value);
return NO_ERROR;
}
status_t AudioFlinger::setMasterVolume(float value)
{
status_t ret = initCheck();
if (ret != NO_ERROR) {
return ret;
}
// check calling permissions
if (!settingsAllowed()) {
return PERMISSION_DENIED;
}
float swmv = value;
mA2DPHandle = -1;
Mutex::Autolock _l(mLock);
// when hw supports master volume, don't scale in sw mixer
if (MVS_NONE != mMasterVolumeSupportLvl) { //MVS_SETONLY
for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
AutoMutex lock(mHardwareLock);
audio_hw_device_t *dev = mAudioHwDevs.valueAt(i)->hwDevice();
mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;
if (NULL != dev->set_master_volume) {
dev->set_master_volume(dev, value); //硬件调节,但是一般只提供这个接口,但底层什么都不做。
}
mHardwareStatus = AUDIO_HW_IDLE;
}
swmv = 1.0;
}
mMasterVolume = value;
mMasterVolumeSW = swmv;
for (size_t i = 0; i < mPlaybackThreads.size(); i++)
mPlaybackThreads.valueAt(i)->setMasterVolume(swmv); //软件调节,这里swmv=1.0,相当于什么都不做。
return NO_ERROR;
}
enum master_volume_support {
// MVS_NONE:
// Audio HAL has no support for master volume, either setting or
// getting. All master volume control must be implemented in SW by the
// AudioFlinger mixing core.
MVS_NONE,
// MVS_SETONLY:
// Audio HAL has support for setting master volume, but not for getting
// master volume (original HAL design did not include a getter).
// AudioFlinger needs to keep track of the last set master volume in
// addition to needing to set an initial, default, master volume at HAL
// load time.
MVS_SETONLY,
// MVS_FULL:
// Audio HAL has support both for setting and getting master volume.
// AudioFlinger should send all set and get master volume requests
// directly to the HAL.
MVS_FULL,
};
第二种方案:
frameworks/base/media/java/android/media/AudioService.java
private int setMasterVolumePrivate(float value) {
if (DEBUG_VOL) {
Log.d(TAG, "setMasterVolumeLetv(value=" + value + ")");
}
final int retValue = AudioSystem.setMasterVolume(value); //这个函数其实什么都没做
// Set all type of streams.
final int numStreamTypes = AudioSystem.getNumStreamTypes();
for (int i = numStreamTypes - 1; i >= 0; i--) {
AudioSystem.setStreamVolumeIndex(i, (int) (value * MAX_MASTER_VOLUME), getDeviceForStream(i)); //真正做事的
}
return retValue;
}
frameworks/base/media/java/android/media/AudioSystem.java
public static native int setStreamVolumeIndex(int stream, int index, int device);
frameworks/av/media/libmedia/AudioSystem.cpp
status_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream,
int index,
audio_devices_t device)
{
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == 0) return PERMISSION_DENIED;
return aps->setStreamVolumeIndex(stream, index, device);
}
frameworks/av/services/audioflinger/AudioPolicyService.cpp
status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
int index,
audio_devices_t device)
{
if (mpAudioPolicy == NULL) {
return NO_INIT;
}
if (!settingsAllowed()) {
return PERMISSION_DENIED;
}
if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
return BAD_VALUE;
}
if (mpAudioPolicy->set_stream_volume_index_for_device) {
return mpAudioPolicy->set_stream_volume_index_for_device(mpAudioPolicy,
stream,
index,
device);
} else {
return mpAudioPolicy->set_stream_volume_index(mpAudioPolicy, stream, index);
}
}
参考: