Merge "Fix issue 2641884: Bluetooth volume is dependent on in call volume." into gingerbread
This commit is contained in:
@@ -1000,8 +1000,9 @@ AudioPolicyManagerBase::AudioPolicyManagerBase(AudioPolicyClientInterface *clien
|
||||
#ifdef AUDIO_POLICY_TEST
|
||||
Thread(false),
|
||||
#endif //AUDIO_POLICY_TEST
|
||||
mPhoneState(AudioSystem::MODE_NORMAL), mRingerMode(0), mMusicStopTime(0),
|
||||
mLimitRingtoneVolume(false), mTotalEffectsCpuLoad(0), mTotalEffectsMemory(0),
|
||||
mPhoneState(AudioSystem::MODE_NORMAL), mRingerMode(0),
|
||||
mMusicStopTime(0), mLimitRingtoneVolume(false), mLastVoiceVolume(-1.0f),
|
||||
mTotalEffectsCpuLoad(0), mTotalEffectsMemory(0),
|
||||
mA2dpSuspended(false)
|
||||
{
|
||||
mpClientInterface = clientInterface;
|
||||
@@ -1838,29 +1839,38 @@ status_t AudioPolicyManagerBase::checkAndSetVolume(int stream, int index, audio_
|
||||
}
|
||||
|
||||
float volume = computeVolume(stream, index, output, device);
|
||||
// do not set volume if the float value did not change
|
||||
if (volume != mOutputs.valueFor(output)->mCurVolume[stream] || force) {
|
||||
// We actually change the volume if:
|
||||
// - the float value returned by computeVolume() changed
|
||||
// - the force flag is set
|
||||
if (volume != mOutputs.valueFor(output)->mCurVolume[stream] ||
|
||||
force) {
|
||||
mOutputs.valueFor(output)->mCurVolume[stream] = volume;
|
||||
LOGV("setStreamVolume() for output %d stream %d, volume %f, delay %d", output, stream, volume, delayMs);
|
||||
if (stream == AudioSystem::VOICE_CALL ||
|
||||
stream == AudioSystem::DTMF ||
|
||||
stream == AudioSystem::BLUETOOTH_SCO) {
|
||||
float voiceVolume = -1.0;
|
||||
// offset value to reflect actual hardware volume that never reaches 0
|
||||
// 1% corresponds roughly to first step in VOICE_CALL stream volume setting (see AudioService.java)
|
||||
volume = 0.01 + 0.99 * volume;
|
||||
if (stream == AudioSystem::VOICE_CALL) {
|
||||
voiceVolume = (float)index/(float)mStreams[stream].mIndexMax;
|
||||
} else if (stream == AudioSystem::BLUETOOTH_SCO) {
|
||||
voiceVolume = 1.0;
|
||||
}
|
||||
if (voiceVolume >= 0 && output == mHardwareOutput) {
|
||||
mpClientInterface->setVoiceVolume(voiceVolume, delayMs);
|
||||
}
|
||||
}
|
||||
mpClientInterface->setStreamVolume((AudioSystem::stream_type)stream, volume, output, delayMs);
|
||||
}
|
||||
|
||||
if (stream == AudioSystem::VOICE_CALL ||
|
||||
stream == AudioSystem::BLUETOOTH_SCO) {
|
||||
float voiceVolume;
|
||||
// Force voice volume to max for bluetooth SCO as volume is managed by the headset
|
||||
if (stream == AudioSystem::VOICE_CALL) {
|
||||
voiceVolume = (float)index/(float)mStreams[stream].mIndexMax;
|
||||
} else {
|
||||
voiceVolume = 1.0;
|
||||
}
|
||||
if (voiceVolume != mLastVoiceVolume && output == mHardwareOutput) {
|
||||
mpClientInterface->setVoiceVolume(voiceVolume, delayMs);
|
||||
mLastVoiceVolume = voiceVolume;
|
||||
}
|
||||
}
|
||||
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user