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

Commit 9792f963 authored by Roman Birg's avatar Roman Birg
Browse files

Revert "Ensure synchronized access of JNI callback object"

This was supposed to fix screen-on buffer underruns with angler, but it
did not solve the issueso I'd rather revert this now than it causing
issues down the line.

This reverts commit 2c9c5455.

Change-Id: I2bc62df648f75cc6ba8e64db04cdc378ecc6f23d
parent ef133b18
Loading
Loading
Loading
Loading
+28 −53
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@
#include "android_runtime/AndroidRuntime.h"

#include <string.h>
#include <pthread.h>

namespace android {
static jmethodID method_onConnectionStateChanged;
@@ -40,8 +39,6 @@ static const btav_interface_t *sBluetoothA2dpInterface = NULL;
static jobject mCallbacksObj = NULL;
static JNIEnv *sCallbackEnv = NULL;

static pthread_mutex_t mMutex = PTHREAD_MUTEX_INITIALIZER;

static bool checkCallbackThread() {
    // Always fetch the latest callbackEnv from AdapterService.
    // Caching this could cause this sCallbackEnv to go out-of-sync
@@ -61,6 +58,10 @@ static void bta2dp_connection_state_callback(btav_connection_state_t state, bt_b

    ALOGI("%s", __FUNCTION__);

    if (mCallbacksObj == NULL) {
        ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
        return;
    }
    if (!checkCallbackThread()) {                                       \
        ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
        return;                                                         \
@@ -74,16 +75,8 @@ static void bta2dp_connection_state_callback(btav_connection_state_t state, bt_b
    }

    sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*) bd_addr);

    pthread_mutex_lock(&mMutex);
    if (mCallbacksObj != NULL) {
        sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConnectionStateChanged,
                        (jint) state, addr);
    } else {
        ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
    }
    pthread_mutex_unlock(&mMutex);

    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConnectionStateChanged, (jint) state,
                                 addr);
    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
    sCallbackEnv->DeleteLocalRef(addr);
}
@@ -93,6 +86,10 @@ static void bta2dp_audio_state_callback(btav_audio_state_t state, bt_bdaddr_t* b

    ALOGI("%s", __FUNCTION__);

    if (mCallbacksObj == NULL) {
        ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
        return;
    }
    if (!checkCallbackThread()) {                                       \
        ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
        return;                                                         \
@@ -105,16 +102,8 @@ static void bta2dp_audio_state_callback(btav_audio_state_t state, bt_bdaddr_t* b
    }

    sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*) bd_addr);

    pthread_mutex_lock(&mMutex);
    if (mCallbacksObj != NULL) {
        sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAudioStateChanged,
                        (jint) state, addr);
    } else {
        ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
    }
    pthread_mutex_unlock(&mMutex);

    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAudioStateChanged, (jint) state,
                                 addr);
    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
    sCallbackEnv->DeleteLocalRef(addr);
}
@@ -124,6 +113,10 @@ static void bta2dp_connection_priority_callback(bt_bdaddr_t* bd_addr) {

    ALOGI("%s", __FUNCTION__);

    if (mCallbacksObj == NULL) {
        ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
        return;
    }
    if (!checkCallbackThread()) {                                       \
        ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
        return;                                                         \
@@ -136,16 +129,7 @@ static void bta2dp_connection_priority_callback(bt_bdaddr_t* bd_addr) {
    }

    sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*) bd_addr);

    pthread_mutex_lock(&mMutex);
    if (mCallbacksObj != NULL) {
        sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onCheckConnectionPriority,
                        addr);
    } else {
        ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
    }
    pthread_mutex_unlock(&mMutex);

    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onCheckConnectionPriority, addr);
    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
    sCallbackEnv->DeleteLocalRef(addr);
}
@@ -154,20 +138,16 @@ static void bta2dp_multicast_enabled_callback(int state) {

    ALOGI("%s", __FUNCTION__);

    if (mCallbacksObj == NULL) {
        ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
        return;
    }
    if (!checkCallbackThread()) {                                       \
        ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
        return;                                                         \
    }

    pthread_mutex_lock(&mMutex);
    if (mCallbacksObj != NULL) {
        sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMulticastStateChanged,
                        state);
    } else {
        ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
    }
    pthread_mutex_unlock(&mMutex);

    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMulticastStateChanged, state);
    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
}

@@ -238,32 +218,29 @@ static void initNative(JNIEnv *env, jobject object, jint maxA2dpConnections,
         sBluetoothA2dpInterface = NULL;
    }

    if (mCallbacksObj != NULL) {
         ALOGW("Cleaning up A2DP callback object");
         env->DeleteGlobalRef(mCallbacksObj);
         mCallbacksObj = NULL;
    }

    if ( (sBluetoothA2dpInterface = (btav_interface_t *)
          btInf->get_profile_interface(BT_PROFILE_ADVANCED_AUDIO_ID)) == NULL) {
        ALOGE("Failed to get Bluetooth A2DP Interface");
        return;
    }

    pthread_mutex_lock(&mMutex);
    if (mCallbacksObj != NULL) {
         ALOGW("Cleaning up A2DP callback object");
         env->DeleteGlobalRef(mCallbacksObj);
         mCallbacksObj = NULL;
    }
    mCallbacksObj = env->NewGlobalRef(object);
    pthread_mutex_unlock(&mMutex);

    if ( (status = sBluetoothA2dpInterface->init(&sBluetoothA2dpCallbacks,
            maxA2dpConnections, multiCastState)) != BT_STATUS_SUCCESS) {
        ALOGE("Failed to initialize Bluetooth A2DP, status: %d", status);
        sBluetoothA2dpInterface = NULL;
        pthread_mutex_lock(&mMutex);
        if (mCallbacksObj != NULL) {
             ALOGW("Clean up A2DP callback object");
             env->DeleteGlobalRef(mCallbacksObj);
             mCallbacksObj = NULL;
        }
        pthread_mutex_unlock(&mMutex);
        return;
    }

@@ -283,12 +260,10 @@ static void cleanupNative(JNIEnv *env, jobject object) {
        sBluetoothA2dpInterface = NULL;
    }

    pthread_mutex_lock(&mMutex);
    if (mCallbacksObj != NULL) {
        env->DeleteGlobalRef(mCallbacksObj);
        mCallbacksObj = NULL;
    }
    pthread_mutex_unlock(&mMutex);
}

static jboolean connectA2dpNative(JNIEnv *env, jobject object, jbyteArray address) {