summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2012-05-15 19:16:30 -0700
committerEric Laurent <elaurent@google.com>2012-05-15 19:26:46 -0700
commit01e6272f0a3a7d1d53e826012377ff9269b03b06 (patch)
treebbc1a201c6eed6f896c03435992362b8335bf1d4
parent03f3747b2f364bce475aead57141bbc44b1637e7 (diff)
downloadhardware_libhardware_legacy-01e6272f0a3a7d1d53e826012377ff9269b03b06.zip
hardware_libhardware_legacy-01e6272f0a3a7d1d53e826012377ff9269b03b06.tar.gz
hardware_libhardware_legacy-01e6272f0a3a7d1d53e826012377ff9269b03b06.tar.bz2
audio policy: fix in call volume problem.
When switching audio path, it is sometimes required to temporarily mute certain streams to avoid glitches. The unmute command is sent with a delay but the volume applied when unmuting is computed according to the state at the time of mute. If the device selection changes after the delayed unmute is programmed the new volume will not correspond to the new device. setStreamMute() now accepts a device selection as input parameter which is used instead of current device for volume computation. Bug 6497819. Change-Id: I355ebf9e1afe814fa5c2723bda9c40e58f921b46
-rw-r--r--audio/AudioPolicyManagerBase.cpp36
-rw-r--r--include/hardware_legacy/AudioPolicyManagerBase.h12
2 files changed, 34 insertions, 14 deletions
diff --git a/audio/AudioPolicyManagerBase.cpp b/audio/AudioPolicyManagerBase.cpp
index f744ce5..27a5cf7 100644
--- a/audio/AudioPolicyManagerBase.cpp
+++ b/audio/AudioPolicyManagerBase.cpp
@@ -1675,10 +1675,10 @@ bool AudioPolicyManagerBase::vectorsEqual(SortedVector<audio_io_handle_t>& outpu
void AudioPolicyManagerBase::checkOutputForStrategy(routing_strategy strategy)
{
- SortedVector<audio_io_handle_t> srcOutputs =
- getOutputsForDevice(getDeviceForStrategy(strategy, true /*fromCache*/));
- SortedVector<audio_io_handle_t> dstOutputs =
- getOutputsForDevice(getDeviceForStrategy(strategy, false /*fromCache*/));
+ audio_devices_t oldDevice = getDeviceForStrategy(strategy, true /*fromCache*/);
+ audio_devices_t newDevice = getDeviceForStrategy(strategy, false /*fromCache*/);
+ SortedVector<audio_io_handle_t> srcOutputs = getOutputsForDevice(oldDevice);
+ SortedVector<audio_io_handle_t> dstOutputs = getOutputsForDevice(newDevice);
if (!vectorsEqual(srcOutputs,dstOutputs)) {
ALOGV("checkOutputForStrategy() strategy %d, moving from output %d to output %d",
@@ -1686,7 +1686,7 @@ void AudioPolicyManagerBase::checkOutputForStrategy(routing_strategy strategy)
// mute strategy while moving tracks from one output to another
for (size_t i = 0; i < srcOutputs.size(); i++) {
setStrategyMute(strategy, true, srcOutputs[i]);
- setStrategyMute(strategy, false, srcOutputs[i], MUTE_TIME_MS);
+ setStrategyMute(strategy, false, srcOutputs[i], MUTE_TIME_MS, newDevice);
}
// Move effects associated to this strategy from previous output to new output
@@ -2116,8 +2116,9 @@ uint32_t AudioPolicyManagerBase::checkDeviceMuteStrategies(AudioOutputDescriptor
setStrategyMute((routing_strategy)i, mute, curOutput, mute ? 0 : delayMs);
if (desc->strategyRefCount((routing_strategy)i) != 0) {
if (tempMute) {
- setStrategyMute((routing_strategy)i, true, curOutput, 0);
- setStrategyMute((routing_strategy)i, false, curOutput, desc->latency() * 2);
+ setStrategyMute((routing_strategy)i, true, curOutput);
+ setStrategyMute((routing_strategy)i, false, curOutput,
+ desc->latency() * 2, device);
}
if (tempMute || mute) {
if (muteWaitMs < desc->latency()) {
@@ -2603,23 +2604,34 @@ void AudioPolicyManagerBase::applyStreamVolumes(audio_io_handle_t output,
}
}
-void AudioPolicyManagerBase::setStrategyMute(routing_strategy strategy, bool on, audio_io_handle_t output, int delayMs)
+void AudioPolicyManagerBase::setStrategyMute(routing_strategy strategy,
+ bool on,
+ audio_io_handle_t output,
+ int delayMs,
+ audio_devices_t device)
{
ALOGV("setStrategyMute() strategy %d, mute %d, output %d", strategy, on, output);
for (int stream = 0; stream < AudioSystem::NUM_STREAM_TYPES; stream++) {
if (getStrategy((AudioSystem::stream_type)stream) == strategy) {
- setStreamMute(stream, on, output, delayMs);
+ setStreamMute(stream, on, output, delayMs, device);
}
}
}
-void AudioPolicyManagerBase::setStreamMute(int stream, bool on, audio_io_handle_t output, int delayMs)
+void AudioPolicyManagerBase::setStreamMute(int stream,
+ bool on,
+ audio_io_handle_t output,
+ int delayMs,
+ audio_devices_t device)
{
StreamDescriptor &streamDesc = mStreams[stream];
AudioOutputDescriptor *outputDesc = mOutputs.valueFor(output);
- audio_devices_t device = outputDesc->device();
+ if (device == 0) {
+ device = outputDesc->device();
+ }
- ALOGV("setStreamMute() stream %d, mute %d, output %d, mMuteCount %d", stream, on, output, outputDesc->mMuteCount[stream]);
+ ALOGV("setStreamMute() stream %d, mute %d, output %d, mMuteCount %d device %04x",
+ stream, on, output, outputDesc->mMuteCount[stream], device);
if (on) {
if (outputDesc->mMuteCount[stream] == 0) {
diff --git a/include/hardware_legacy/AudioPolicyManagerBase.h b/include/hardware_legacy/AudioPolicyManagerBase.h
index be6c19d..a918d39 100644
--- a/include/hardware_legacy/AudioPolicyManagerBase.h
+++ b/include/hardware_legacy/AudioPolicyManagerBase.h
@@ -358,10 +358,18 @@ protected:
void applyStreamVolumes(audio_io_handle_t output, audio_devices_t device, int delayMs = 0, bool force = false);
// Mute or unmute all streams handled by the specified strategy on the specified output
- void setStrategyMute(routing_strategy strategy, bool on, audio_io_handle_t output, int delayMs = 0);
+ void setStrategyMute(routing_strategy strategy,
+ bool on,
+ audio_io_handle_t output,
+ int delayMs = 0,
+ audio_devices_t device = (audio_devices_t)0);
// Mute or unmute the stream on the specified output
- void setStreamMute(int stream, bool on, audio_io_handle_t output, int delayMs = 0);
+ void setStreamMute(int stream,
+ bool on,
+ audio_io_handle_t output,
+ int delayMs = 0,
+ audio_devices_t device = (audio_devices_t)0);
// handle special cases for sonification strategy while in call: mute streams or replace by
// a special tone in the device used for communication