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

Commit b56e743f authored by jiabin's avatar jiabin
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 fd90fdfe
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -2362,7 +2362,7 @@ sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrac
        {
            Mutex::Autolock _atCbL(mAudioTrackCbLock);
            if (callback.get() != nullptr) {
                mAudioTrackCallbacks.emplace(callback);
                mAudioTrackCallbacks.emplace(track, callback);
            }
        }

@@ -2590,6 +2590,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);
@@ -2685,8 +2689,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
@@ -1187,7 +1187,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