diff options
-rw-r--r-- | core/jni/android_media_AudioSystem.cpp | 35 | ||||
-rw-r--r-- | media/java/android/media/AudioSystem.java | 50 |
2 files changed, 85 insertions, 0 deletions
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", diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 927cd87..8bf1604 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -268,6 +268,54 @@ public class AudioSystem } + /** + * Handles events for the audio policy manager about effect sessions + * @see android.media.audiopolicy.AudioPolicy + */ + public interface EffectSessionCallback + { + void onSessionAdded(int stream, int sessionId); + + void onSessionRemoved(int stream, int sessionId); + } + + //keep in sync with include/media/AudioPolicy.h + private final static int AUDIO_OUTPUT_SESSION_EFFECTS_UPDATE = 10; + + private static EffectSessionCallback sEffectSessionCallback; + + public static void setEffectSessionCallback(EffectSessionCallback cb) + { + synchronized (AudioSystem.class) { + sEffectSessionCallback = cb; + native_register_effect_session_callback(); + } + } + + private static void effectSessionCallbackFromNative(int event, int stream, int sessionId, boolean added) + { + EffectSessionCallback cb = null; + synchronized (AudioSystem.class) { + if (sEffectSessionCallback != null) { + cb = sEffectSessionCallback; + } + } + if (cb != null) { + switch(event) { + case AUDIO_OUTPUT_SESSION_EFFECTS_UPDATE: + if (added) { + cb.onSessionAdded(stream, sessionId); + } else { + cb.onSessionRemoved(stream, sessionId); + } + break; + default: + Log.e(TAG, "effectSessionCallbackFromNative: unknown event " + event); + } + } + } + + /* * Error codes used by public APIs (AudioTrack, AudioRecord, AudioManager ...) * Must be kept in sync with frameworks/base/core/jni/android_media_AudioErrors.h @@ -648,6 +696,8 @@ public class AudioSystem // declare this instance as having a dynamic policy callback handler private static native final void native_register_dynamic_policy_callback(); + private static native final void native_register_effect_session_callback(); + // must be kept in sync with value in include/system/audio.h public static final int AUDIO_HW_SYNC_INVALID = 0; |