Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18a4b1c3 authored by jiabin's avatar jiabin Committed by Jiabin Huang
Browse files

Release AudioTrackCallback when the track is removed.

The AudioTrackCallback is cached as a strong pointer in PlaybackThread.
Remove the callback when the corresponding track is removed to avoid
memory leak.

Bug: 168675247
Test: repo steps in the bug
Change-Id: I09d78ca31c43db4d017f9e8c540628bcb6c44727
parent 84d711ca
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -2385,7 +2385,7 @@ sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrac
        {
            Mutex::Autolock _atCbL(mAudioTrackCbLock);
            if (callback.get() != nullptr) {
                mAudioTrackCallbacks.emplace(callback);
                mAudioTrackCallbacks.emplace(track, callback);
            }
        }

@@ -2619,6 +2619,10 @@ void AudioFlinger::PlaybackThread::removeTrack_l(const sp<Track>& track)
    mLocalLog.log("removeTrack_l (%p) %s", track.get(), result.string());

    mTracks.remove(track);
    {
        Mutex::Autolock _atCbL(mAudioTrackCbLock);
        mAudioTrackCallbacks.erase(track);
    }
    if (track->isFastTrack()) {
        int index = track->mFastIndex;
        ALOG_ASSERT(0 < index && index < (int)FastMixerState::sMaxFastTracks);
@@ -2714,8 +2718,8 @@ void AudioFlinger::PlaybackThread::onCodecFormatChanged(
                    audio_utils::metadata::byteStringFromData(metadata);
            std::vector metadataVec(metaDataStr.begin(), metaDataStr.end());
            Mutex::Autolock _l(mAudioTrackCbLock);
            for (const auto& callback : mAudioTrackCallbacks) {
                callback->onCodecFormatChanged(metadataVec);
            for (const auto& callbackPair : mAudioTrackCallbacks) {
                callbackPair.second->onCodecFormatChanged(metadataVec);
            }
    }).detach();
}
+1 −1
Original line number Diff line number Diff line
@@ -1219,7 +1219,7 @@ private:

    Mutex                                    mAudioTrackCbLock;
    // Record of IAudioTrackCallback
    std::set<sp<media::IAudioTrackCallback>> mAudioTrackCallbacks;
    std::map<sp<Track>, sp<media::IAudioTrackCallback>> mAudioTrackCallbacks;

private:
    // The HAL output sink is treated as non-blocking, but current implementation is blocking