diff options
author | Eric Laurent <elaurent@google.com> | 2011-03-28 18:37:07 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2011-04-05 12:05:41 -0700 |
commit | 38ccae2c0324daa305f3fe77d25fdf5edec0b0e1 (patch) | |
tree | c7aec92091f634a6994ed7e836a2a1ba4e22c035 /include/private | |
parent | 7fb4b427d5fca79c09d69b212ddca41539c215a2 (diff) | |
download | frameworks_av-38ccae2c0324daa305f3fe77d25fdf5edec0b0e1.zip frameworks_av-38ccae2c0324daa305f3fe77d25fdf5edec0b0e1.tar.gz frameworks_av-38ccae2c0324daa305f3fe77d25fdf5edec0b0e1.tar.bz2 |
New fix for issue 4111672: control block flags
The first fix (commit 913af0b4) is problematic because it makes threads
in mediaserver process block on the cblk mutex. This is not permitted
as it can cause audio to skip or worse have a malicious application
prevent all audio playback by keeping the mutex locked.
The fix consists in using atomic operations when modifying the control
block flags.
Also fixed audio_track_cblk_t::framesReady() so that it doesn't block
when called from AudioFlinger (only applies when a loop is active).
Change-Id: Ibf0abb562ced3e9f64118afdd5036854bb959428
Diffstat (limited to 'include/private')
-rw-r--r-- | include/private/media/AudioTrackShared.h | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/include/private/media/AudioTrackShared.h b/include/private/media/AudioTrackShared.h index 4610135..1827c3e 100644 --- a/include/private/media/AudioTrackShared.h +++ b/include/private/media/AudioTrackShared.h @@ -83,13 +83,12 @@ struct audio_track_cblk_t uint8_t frameSize; uint8_t channelCount; - uint16_t flags; - uint16_t bufferTimeoutMs; // Maximum cumulated timeout before restarting audioflinger - uint16_t waitTimeMs; // Cumulated wait time + uint16_t waitTimeMs; // Cumulated wait time uint16_t sendLevel; - uint16_t reserved; + volatile int32_t flags; + // Cache line boundary (32 bytes) audio_track_cblk_t(); uint32_t stepUser(uint32_t frameCount); @@ -98,6 +97,7 @@ struct audio_track_cblk_t uint32_t framesAvailable(); uint32_t framesAvailable_l(); uint32_t framesReady(); + bool tryLock(); }; |