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

Commit 9957394d authored by Steve Kondik's avatar Steve Kondik Committed by Steve Kondik
Browse files

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
parent e4bc6860
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -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",
+50 −0
Original line number Diff line number Diff line
@@ -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;