14bcdba848449b33d7022de527c526943aff1f5fdEric Laurent/* 24bcdba848449b33d7022de527c526943aff1f5fdEric Laurent * Copyright (C) 2015 The Android Open Source Project 34bcdba848449b33d7022de527c526943aff1f5fdEric Laurent * 44bcdba848449b33d7022de527c526943aff1f5fdEric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 54bcdba848449b33d7022de527c526943aff1f5fdEric Laurent * you may not use this file except in compliance with the License. 64bcdba848449b33d7022de527c526943aff1f5fdEric Laurent * You may obtain a copy of the License at 74bcdba848449b33d7022de527c526943aff1f5fdEric Laurent * 84bcdba848449b33d7022de527c526943aff1f5fdEric Laurent * http://www.apache.org/licenses/LICENSE-2.0 94bcdba848449b33d7022de527c526943aff1f5fdEric Laurent * 104bcdba848449b33d7022de527c526943aff1f5fdEric Laurent * Unless required by applicable law or agreed to in writing, software 114bcdba848449b33d7022de527c526943aff1f5fdEric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 124bcdba848449b33d7022de527c526943aff1f5fdEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134bcdba848449b33d7022de527c526943aff1f5fdEric Laurent * See the License for the specific language governing permissions and 144bcdba848449b33d7022de527c526943aff1f5fdEric Laurent * limitations under the License. 154bcdba848449b33d7022de527c526943aff1f5fdEric Laurent */ 164bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 174bcdba848449b33d7022de527c526943aff1f5fdEric Laurent//#define LOG_NDEBUG 0 184bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 194bcdba848449b33d7022de527c526943aff1f5fdEric Laurent#define LOG_TAG "AudioDeviceCallback-JNI" 204bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 214bcdba848449b33d7022de527c526943aff1f5fdEric Laurent#include <utils/Log.h> 224bcdba848449b33d7022de527c526943aff1f5fdEric Laurent#include <JNIHelp.h> 234bcdba848449b33d7022de527c526943aff1f5fdEric Laurent#include <JniConstants.h> 244bcdba848449b33d7022de527c526943aff1f5fdEric Laurent#include "core_jni_helpers.h" 254bcdba848449b33d7022de527c526943aff1f5fdEric Laurent#include <media/AudioSystem.h> 264bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 274bcdba848449b33d7022de527c526943aff1f5fdEric Laurent#include "android_media_DeviceCallback.h" 284bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 294bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 304bcdba848449b33d7022de527c526943aff1f5fdEric Laurent// ---------------------------------------------------------------------------- 314bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 324bcdba848449b33d7022de527c526943aff1f5fdEric Laurentusing namespace android; 334bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 344bcdba848449b33d7022de527c526943aff1f5fdEric LaurentJNIDeviceCallback::JNIDeviceCallback(JNIEnv* env, jobject thiz, jobject weak_thiz, 354bcdba848449b33d7022de527c526943aff1f5fdEric Laurent jmethodID postEventFromNative) 364bcdba848449b33d7022de527c526943aff1f5fdEric Laurent{ 374bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 384bcdba848449b33d7022de527c526943aff1f5fdEric Laurent // Hold onto the AudioTrack/AudioRecord class for use in calling the static method 394bcdba848449b33d7022de527c526943aff1f5fdEric Laurent // that posts events to the application thread. 404bcdba848449b33d7022de527c526943aff1f5fdEric Laurent jclass clazz = env->GetObjectClass(thiz); 414bcdba848449b33d7022de527c526943aff1f5fdEric Laurent if (clazz == NULL) { 424bcdba848449b33d7022de527c526943aff1f5fdEric Laurent return; 434bcdba848449b33d7022de527c526943aff1f5fdEric Laurent } 444bcdba848449b33d7022de527c526943aff1f5fdEric Laurent mClass = (jclass)env->NewGlobalRef(clazz); 454bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 464bcdba848449b33d7022de527c526943aff1f5fdEric Laurent // We use a weak reference so the AudioTrack/AudioRecord object can be garbage collected. 474bcdba848449b33d7022de527c526943aff1f5fdEric Laurent // The reference is only used as a proxy for callbacks. 484bcdba848449b33d7022de527c526943aff1f5fdEric Laurent mObject = env->NewGlobalRef(weak_thiz); 494bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 504bcdba848449b33d7022de527c526943aff1f5fdEric Laurent mPostEventFromNative = postEventFromNative; 514bcdba848449b33d7022de527c526943aff1f5fdEric Laurent} 524bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 534bcdba848449b33d7022de527c526943aff1f5fdEric LaurentJNIDeviceCallback::~JNIDeviceCallback() 544bcdba848449b33d7022de527c526943aff1f5fdEric Laurent{ 554bcdba848449b33d7022de527c526943aff1f5fdEric Laurent // remove global references 564bcdba848449b33d7022de527c526943aff1f5fdEric Laurent JNIEnv *env = AndroidRuntime::getJNIEnv(); 574bcdba848449b33d7022de527c526943aff1f5fdEric Laurent if (env == NULL) { 584bcdba848449b33d7022de527c526943aff1f5fdEric Laurent return; 594bcdba848449b33d7022de527c526943aff1f5fdEric Laurent } 604bcdba848449b33d7022de527c526943aff1f5fdEric Laurent env->DeleteGlobalRef(mObject); 614bcdba848449b33d7022de527c526943aff1f5fdEric Laurent env->DeleteGlobalRef(mClass); 624bcdba848449b33d7022de527c526943aff1f5fdEric Laurent} 634bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 644bcdba848449b33d7022de527c526943aff1f5fdEric Laurentvoid JNIDeviceCallback::onAudioDeviceUpdate(audio_io_handle_t audioIo, 654bcdba848449b33d7022de527c526943aff1f5fdEric Laurent audio_port_handle_t deviceId) 664bcdba848449b33d7022de527c526943aff1f5fdEric Laurent{ 674bcdba848449b33d7022de527c526943aff1f5fdEric Laurent JNIEnv *env = AndroidRuntime::getJNIEnv(); 684bcdba848449b33d7022de527c526943aff1f5fdEric Laurent if (env == NULL) { 694bcdba848449b33d7022de527c526943aff1f5fdEric Laurent return; 704bcdba848449b33d7022de527c526943aff1f5fdEric Laurent } 714bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 724bcdba848449b33d7022de527c526943aff1f5fdEric Laurent ALOGV("%s audioIo %d deviceId %d", __FUNCTION__, audioIo, deviceId); 734bcdba848449b33d7022de527c526943aff1f5fdEric Laurent env->CallStaticVoidMethod(mClass, 744bcdba848449b33d7022de527c526943aff1f5fdEric Laurent mPostEventFromNative, 754bcdba848449b33d7022de527c526943aff1f5fdEric Laurent mObject, 764bcdba848449b33d7022de527c526943aff1f5fdEric Laurent AUDIO_NATIVE_EVENT_ROUTING_CHANGE, deviceId, 0, NULL); 774bcdba848449b33d7022de527c526943aff1f5fdEric Laurent if (env->ExceptionCheck()) { 784bcdba848449b33d7022de527c526943aff1f5fdEric Laurent ALOGW("An exception occurred while notifying an event."); 794bcdba848449b33d7022de527c526943aff1f5fdEric Laurent env->ExceptionClear(); 804bcdba848449b33d7022de527c526943aff1f5fdEric Laurent } 814bcdba848449b33d7022de527c526943aff1f5fdEric Laurent} 824bcdba848449b33d7022de527c526943aff1f5fdEric Laurent 83