From 9957394df71db6f01802091858216582c58eab67 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sun, 6 Mar 2016 05:31:05 -0800 Subject: audiosystem: Add API for listening to effect session events * This API will allow attaching a global listener which will notify the application when audio effect sessions are attached or removed on a stream. This requires that the policy is configured to automatically attach a set of effects. Change-Id: Iaf1ca133765045322b005d4148e2c4e86a9c3913 --- core/jni/android_media_AudioSystem.cpp | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'core/jni') diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 91b3278..1acf867 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -154,6 +154,11 @@ static struct { jmethodID postDynPolicyEventFromNative; } gDynPolicyEventHandlerMethods; +static struct { + jmethodID postEffectSessionEventFromNative; +} gEffectSessionEventHandlerMethods; + + static Mutex gLock; enum AudioError { @@ -386,6 +391,24 @@ android_media_AudioSystem_dyn_policy_callback(int event, String8 regId, int val) } +static void +android_media_AudioSystem_effect_session_callback(int event, audio_stream_type_t stream, + audio_unique_id_t sessionId, bool added) +{ + JNIEnv *env = AndroidRuntime::getJNIEnv(); + if (env == NULL) { + return; + } + + jclass clazz = env->FindClass(kClassPathName); + + env->CallStaticVoidMethod(clazz, gEffectSessionEventHandlerMethods.postEffectSessionEventFromNative, + event, stream, sessionId, added); + + env->DeleteLocalRef(clazz); + +} + static jint android_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jint state, jstring device_address, jstring device_name) { @@ -1487,6 +1510,12 @@ android_media_AudioSystem_registerDynPolicyCallback(JNIEnv *env, jobject thiz) AudioSystem::setDynPolicyCallback(android_media_AudioSystem_dyn_policy_callback); } +static void +android_media_AudioSystem_registerEffectSessionCallback(JNIEnv *env, jobject thiz) +{ + AudioSystem::setEffectSessionCallback(android_media_AudioSystem_effect_session_callback); +} + static jint convertAudioMixToNative(JNIEnv *env, AudioMix *nAudioMix, @@ -1659,6 +1688,8 @@ static JNINativeMethod gMethods[] = { (void *)android_media_AudioSystem_registerPolicyMixes}, {"native_register_dynamic_policy_callback", "()V", (void *)android_media_AudioSystem_registerDynPolicyCallback}, + {"native_register_effect_session_callback", "()V", + (void *)android_media_AudioSystem_registerEffectSessionCallback}, {"systemReady", "()I", (void *)android_media_AudioSystem_systemReady}, }; @@ -1766,6 +1797,10 @@ int register_android_media_AudioSystem(JNIEnv *env) GetStaticMethodIDOrDie(env, env->FindClass(kClassPathName), "dynamicPolicyCallbackFromNative", "(ILjava/lang/String;I)V"); + gEffectSessionEventHandlerMethods.postEffectSessionEventFromNative = + GetStaticMethodIDOrDie(env, env->FindClass(kClassPathName), + "effectSessionCallbackFromNative", "(IIIZ)V"); + jclass audioMixClass = FindClassOrDie(env, "android/media/audiopolicy/AudioMix"); gAudioMixClass = MakeGlobalRefOrDie(env, audioMixClass); gAudioMixFields.mRule = GetFieldIDOrDie(env, audioMixClass, "mRule", -- cgit v1.1