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

Commit 2ec208c3 authored by Dichen Zhang's avatar Dichen Zhang Committed by Android (Google) Code Review
Browse files

Merge "Fix addAudioDeviceCallback() memory leak bug"

parents 88a6078c 2a1a52ce
Loading
Loading
Loading
Loading
+12 −11
Original line number Diff line number Diff line
@@ -571,10 +571,9 @@ status_t JAudioTrack::removeAudioDeviceCallback(jobject listener) {
}

void JAudioTrack::registerRoutingDelegates(
        Vector<std::pair<jobject, jobject>>& routingDelegates) {
    for (Vector<std::pair<jobject, jobject>>::iterator it = routingDelegates.begin();
            it != routingDelegates.end(); it++) {
        addAudioDeviceCallback(it->second, getHandler(it->second));
        Vector<std::pair<sp<JObjectHolder>, sp<JObjectHolder>>>& routingDelegates) {
    for (auto it = routingDelegates.begin(); it != routingDelegates.end(); it++) {
        addAudioDeviceCallback(it->second->getJObject(), getHandler(it->second->getJObject()));
    }
}

@@ -597,20 +596,22 @@ jobject JAudioTrack::getHandler(const jobject routingDelegateObj) {
    return env->CallObjectMethod(routingDelegateObj, jGetHandler);
}

jobject JAudioTrack::findByKey(Vector<std::pair<jobject, jobject>>& mp, const jobject key) {
jobject JAudioTrack::findByKey(
        Vector<std::pair<sp<JObjectHolder>, sp<JObjectHolder>>>& mp, const jobject key) {
    JNIEnv *env = JavaVMHelper::getJNIEnv();
    for (Vector<std::pair<jobject, jobject>>::iterator it = mp.begin(); it != mp.end(); it++) {
        if (env->IsSameObject(it->first, key)) {
            return it->second;
    for (auto it = mp.begin(); it != mp.end(); it++) {
        if (env->IsSameObject(it->first->getJObject(), key)) {
            return it->second->getJObject();
        }
    }
    return nullptr;
}

void JAudioTrack::eraseByKey(Vector<std::pair<jobject, jobject>>& mp, const jobject key) {
void JAudioTrack::eraseByKey(
        Vector<std::pair<sp<JObjectHolder>, sp<JObjectHolder>>>& mp, const jobject key) {
    JNIEnv *env = JavaVMHelper::getJNIEnv();
    for (Vector<std::pair<jobject, jobject>>::iterator it = mp.begin(); it != mp.end(); it++) {
        if (env->IsSameObject(it->first, key)) {
    for (auto it = mp.begin(); it != mp.end(); it++) {
        if (env->IsSameObject(it->first->getJObject(), key)) {
            mp.erase(it);
            return;
        }
+10 −7
Original line number Diff line number Diff line
@@ -521,15 +521,18 @@ jobject MediaPlayer2AudioOutput::getRoutedDevice() {
status_t MediaPlayer2AudioOutput::addAudioDeviceCallback(jobject jRoutingDelegate) {
    ALOGV("addAudioDeviceCallback");
    Mutex::Autolock lock(mLock);
    jobject listener = (new JObjectHolder(
            JAudioTrack::getListener(jRoutingDelegate)))->getJObject();
    jobject listener = JAudioTrack::getListener(jRoutingDelegate);
    if (JAudioTrack::findByKey(mRoutingDelegates, listener) == nullptr) {
        jobject handler = (new JObjectHolder(
                JAudioTrack::getHandler(jRoutingDelegate)))->getJObject();
        jobject routingDelegate = (new JObjectHolder(jRoutingDelegate))->getJObject();
        mRoutingDelegates.push_back(std::pair<jobject, jobject>(listener, routingDelegate));
        sp<JObjectHolder> listenerHolder = new JObjectHolder(listener);
        jobject handler = JAudioTrack::getHandler(jRoutingDelegate);
        sp<JObjectHolder> routingDelegateHolder = new JObjectHolder(jRoutingDelegate);

        mRoutingDelegates.push_back(std::pair<sp<JObjectHolder>, sp<JObjectHolder>>(
                listenerHolder, routingDelegateHolder));

        if (mJAudioTrack != nullptr) {
            return mJAudioTrack->addAudioDeviceCallback(routingDelegate, handler);
            return mJAudioTrack->addAudioDeviceCallback(
                    routingDelegateHolder->getJObject(), handler);
        }
    }
    return NO_ERROR;
+6 −3
Original line number Diff line number Diff line
@@ -405,7 +405,8 @@ public:
     * routingDelegates: backed-up routing delegates
     *
     */
    void registerRoutingDelegates(Vector<std::pair<jobject, jobject>>& routingDelegates);
    void registerRoutingDelegates(
            Vector<std::pair<sp<JObjectHolder>, sp<JObjectHolder>>>& routingDelegates);

    /* get listener from RoutingDelegate object
     */
@@ -422,13 +423,15 @@ public:
     * Returns value if key is in the map
     *         nullptr if key is not in the map
     */
    static jobject findByKey(Vector<std::pair<jobject, jobject>>& mp, const jobject key);
    static jobject findByKey(
            Vector<std::pair<sp<JObjectHolder>, sp<JObjectHolder>>>& mp, const jobject key);

    /*
     * Parameters:
     * map and key
     */
    static void eraseByKey(Vector<std::pair<jobject, jobject>>& mp, const jobject key);
    static void eraseByKey(
            Vector<std::pair<sp<JObjectHolder>, sp<JObjectHolder>>>& mp, const jobject key);

private:
    audio_output_flags_t mFlags;
+3 −1
Original line number Diff line number Diff line
@@ -124,7 +124,9 @@ private:
    audio_output_flags_t    mFlags;
    sp<JObjectHolder>       mPreferredDevice;
    mutable Mutex           mLock;
    Vector<std::pair<jobject, jobject>> mRoutingDelegates; // <listener, routingDelegate>

    // <listener, routingDelegate>
    Vector<std::pair<sp<JObjectHolder>, sp<JObjectHolder>>> mRoutingDelegates;

    // static variables below not protected by mutex
    static bool             mIsOnEmulator;