diff options
author | Vincent Becker <vincentx.becker@intel.com> | 2012-09-03 14:29:57 +0800 |
---|---|---|
committer | Robert Beatty <robert.m.beatty@intel.com> | 2014-07-16 17:45:43 -0700 |
commit | 31de680d5649ffc9568172b3904dccd3580d71ae (patch) | |
tree | bb67056a1ae74202c5653c73766e8b9b1cc37f7a /audio | |
parent | 4248e7c3cc06244b9d80a470e65dc95f862fccfa (diff) | |
download | platform_hardware_libhardware_legacy-31de680d5649ffc9568172b3904dccd3580d71ae.tar.gz platform_hardware_libhardware_legacy-31de680d5649ffc9568172b3904dccd3580d71ae.tar.bz2 platform_hardware_libhardware_legacy-31de680d5649ffc9568172b3904dccd3580d71ae.zip |
audio: add mechanism to re-route nullified audio
Fixes a race condition whereby two requests attempt to change the audio stream
(and interrupt each other). For example, a user space app makes a call through
the audio API and before completion, a kernel function such as jack removal is
detected and is serviced. In this case, you have a nullified audio route that
needs to be re-routed.
In order to know a routing update is needed, a boolean member mForceRouting
has been introduced to enforce routing for the next attempt to set audio output
with a non-null device.
Change-Id: Ia0aa2f27fe63c39f0980dec2e1e79dbc26b81e56
Author: Vincent Becker <vincentx.becker@intel.com>
Signed-off-by: Vincent Becker <vincentx.becker@intel.com>
Signed-off-by: Zhi Jin <zhi.jin@intel.com>
Signed-off-by: Shuo Gao <shuo.gao@intel.com>
Signed-off-by: Bruce Beare <bruce.j.beare@intel.com>
Signed-off-by: Jack Ren <jack.ren@intel.com>
Signed-off-by: Robert Beatty <robert.m.beatty@intel.com>
Diffstat (limited to 'audio')
-rw-r--r-- | audio/AudioPolicyManagerBase.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/audio/AudioPolicyManagerBase.cpp b/audio/AudioPolicyManagerBase.cpp index af24dbd..d62e733 100644 --- a/audio/AudioPolicyManagerBase.cpp +++ b/audio/AudioPolicyManagerBase.cpp @@ -2639,7 +2639,22 @@ uint32_t AudioPolicyManagerBase::setOutputDevice(audio_io_handle_t output, if (device != AUDIO_DEVICE_NONE) { outputDesc->mDevice = device; + + // Force routing if previously asked for this output + if (outputDesc->mForceRouting) { + ALOGV("Force routing to current device as previous device was null for this output"); + force = true; + + // Request consumed. Reset mForceRouting to false + outputDesc->mForceRouting = false; + } } + else { + // Device is null and does not reflect the routing. Save the necessity to force + // re-routing upon next attempt to select a non-null device for this output + outputDesc->mForceRouting = true; + } + muteWaitMs = checkDeviceMuteStrategies(outputDesc, prevDevice, delayMs); // Do not change the routing if: @@ -3254,7 +3269,8 @@ AudioPolicyManagerBase::AudioOutputDescriptor::AudioOutputDescriptor( : mId(0), mSamplingRate(0), mFormat((audio_format_t)0), mChannelMask((audio_channel_mask_t)0), mLatency(0), mFlags((audio_output_flags_t)0), mDevice(AUDIO_DEVICE_NONE), - mOutput1(0), mOutput2(0), mProfile(profile), mDirectOpenCount(0) + mOutput1(0), mOutput2(0), mProfile(profile), mDirectOpenCount(0), + mForceRouting(false) { // clear usage count for all stream types for (int i = 0; i < AudioSystem::NUM_STREAM_TYPES; i++) { |