diff options
author | Ashish Jain <ashishj@codeaurora.org> | 2015-10-27 12:11:18 +0530 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2016-02-01 17:23:51 -0800 |
commit | da6f52df74ff57a79ab5c338b6f7b4124b47e133 (patch) | |
tree | 11e7e77d1e49feb946b82661348fd4762f7a0da4 /services/audioflinger | |
parent | 0276a2fa56d6d8074e88940a4d21caa3e54f4972 (diff) | |
download | frameworks_av-da6f52df74ff57a79ab5c338b6f7b4124b47e133.zip frameworks_av-da6f52df74ff57a79ab5c338b6f7b4124b47e133.tar.gz frameworks_av-da6f52df74ff57a79ab5c338b6f7b4124b47e133.tar.bz2 |
AudioMixer: Clear bufferProviders in correct order
Issue:
While switching between clips with different track properties, when
earlier track is cleared, postDownMixerBufferProvider
tries to release a buffer to serverProxy instead of the original owner
i.e. downMixBufferProvider. This illegal releaseBuffer call to serverProxy
results in an assert in AudioTrackShared.
-In issue scenario, data flow path in AudioMixer is,
ServerProxy-->-->DownMixer-->PostDownMixer-->Resampler,
- Clear for downMixerBufferProvider ensures that all serverproxy
buffers are returned back.
-This also causes the postDownMixer to get connected with serverProxy.
-Hence on delete of postDownMixer illegal releaseBuffer for
serverProxy gets executed.
Fix:
Clear PostDownMixerBufferProvider before clearing DownMixerBufferProvider
to ensure that buffers are release to right owners.
Change-Id: I982366660d0a1e04be8cca6dabe758221dedf9b1
Diffstat (limited to 'services/audioflinger')
-rw-r--r-- | services/audioflinger/AudioMixer.cpp | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp index b830985..bc062e6 100644 --- a/services/audioflinger/AudioMixer.cpp +++ b/services/audioflinger/AudioMixer.cpp @@ -308,6 +308,11 @@ bool AudioMixer::setChannelMasks(int name, void AudioMixer::track_t::unprepareForDownmix() { ALOGV("AudioMixer::unprepareForDownmix(%p)", this); + if (mPostDownmixReformatBufferProvider != NULL) { + delete mPostDownmixReformatBufferProvider; + mPostDownmixReformatBufferProvider = NULL; + reconfigureBufferProviders(); + } mDownmixRequiresFormat = AUDIO_FORMAT_INVALID; if (downmixerBufferProvider != NULL) { // this track had previously been configured with a downmixer, delete it @@ -363,18 +368,9 @@ status_t AudioMixer::track_t::prepareForDownmix() void AudioMixer::track_t::unprepareForReformat() { ALOGV("AudioMixer::unprepareForReformat(%p)", this); - bool requiresReconfigure = false; if (mReformatBufferProvider != NULL) { delete mReformatBufferProvider; mReformatBufferProvider = NULL; - requiresReconfigure = true; - } - if (mPostDownmixReformatBufferProvider != NULL) { - delete mPostDownmixReformatBufferProvider; - mPostDownmixReformatBufferProvider = NULL; - requiresReconfigure = true; - } - if (requiresReconfigure) { reconfigureBufferProviders(); } } |