summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/jni/android_media_AudioSystem.cpp35
-rw-r--r--media/java/android/media/AudioSystem.java50
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;