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

Commit 9f78d309 authored by Eric Laurent's avatar Eric Laurent Committed by Android (Google) Code Review
Browse files

Merge "AudioSystem: new audioflinger restart detection" into klp-dev

parents 743218d7 dfb881f9
Loading
Loading
Loading
Loading
+17 −18
Original line number Diff line number Diff line
@@ -41,11 +41,15 @@ enum AudioError {

static int check_AudioSystem_Command(status_t status)
{
    if (status == NO_ERROR) {
    switch (status) {
    case DEAD_OBJECT:
        return kAudioStatusMediaServerDied;
    case NO_ERROR:
        return kAudioStatusOk;
    } else {
        return kAudioStatusError;
    default:
        break;
    }
    return kAudioStatusError;
}

static int
@@ -122,21 +126,9 @@ android_media_AudioSystem_error_callback(status_t err)

    jclass clazz = env->FindClass(kClassPathName);

    int error;

    switch (err) {
    case DEAD_OBJECT:
        error = kAudioStatusMediaServerDied;
        break;
    case NO_ERROR:
        error = kAudioStatusOk;
        break;
    default:
        error = kAudioStatusError;
        break;
    }

    env->CallStaticVoidMethod(clazz, env->GetStaticMethodID(clazz, "errorCallbackFromNative","(I)V"), error);
    env->CallStaticVoidMethod(clazz, env->GetStaticMethodID(clazz,
                              "errorCallbackFromNative","(I)V"),
                              check_AudioSystem_Command(err));
}

static int
@@ -283,6 +275,12 @@ android_media_AudioSystem_setLowRamDevice(JNIEnv *env, jobject clazz, jboolean i
    return (jint) AudioSystem::setLowRamDevice((bool) isLowRamDevice);
}

static int
android_media_AudioSystem_checkAudioFlinger(JNIEnv *env, jobject clazz)
{
    return check_AudioSystem_Command(AudioSystem::checkAudioFlinger());
}

// ----------------------------------------------------------------------------

static JNINativeMethod gMethods[] = {
@@ -310,6 +308,7 @@ static JNINativeMethod gMethods[] = {
    {"getPrimaryOutputFrameCount",   "()I", (void *)android_media_AudioSystem_getPrimaryOutputFrameCount},
    {"getOutputLatency",    "(I)I",     (void *)android_media_AudioSystem_getOutputLatency},
    {"setLowRamDevice",     "(Z)I",     (void *)android_media_AudioSystem_setLowRamDevice},
    {"checkAudioFlinger",    "()I",     (void *)android_media_AudioSystem_checkAudioFlinger},
};

int register_android_media_AudioSystem(JNIEnv *env)
+25 −43
Original line number Diff line number Diff line
@@ -140,23 +140,22 @@ public class AudioService extends IAudioService.Stub {
    private static final int MSG_PERSIST_MASTER_VOLUME = 2;
    private static final int MSG_PERSIST_RINGER_MODE = 3;
    private static final int MSG_MEDIA_SERVER_DIED = 4;
    private static final int MSG_MEDIA_SERVER_STARTED = 5;
    private static final int MSG_PLAY_SOUND_EFFECT = 6;
    private static final int MSG_BTA2DP_DOCK_TIMEOUT = 7;
    private static final int MSG_LOAD_SOUND_EFFECTS = 8;
    private static final int MSG_SET_FORCE_USE = 9;
    private static final int MSG_BT_HEADSET_CNCT_FAILED = 10;
    private static final int MSG_SET_ALL_VOLUMES = 11;
    private static final int MSG_PERSIST_MASTER_VOLUME_MUTE = 12;
    private static final int MSG_REPORT_NEW_ROUTES = 13;
    private static final int MSG_SET_FORCE_BT_A2DP_USE = 14;
    private static final int MSG_CHECK_MUSIC_ACTIVE = 16;
    private static final int MSG_BROADCAST_AUDIO_BECOMING_NOISY = 17;
    private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME = 18;
    private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED = 19;
    private static final int MSG_PERSIST_SAFE_VOLUME_STATE = 20;
    private static final int MSG_BROADCAST_BT_CONNECTION_STATE = 21;
    private static final int MSG_UNLOAD_SOUND_EFFECTS = 22;
    private static final int MSG_PLAY_SOUND_EFFECT = 5;
    private static final int MSG_BTA2DP_DOCK_TIMEOUT = 6;
    private static final int MSG_LOAD_SOUND_EFFECTS = 7;
    private static final int MSG_SET_FORCE_USE = 8;
    private static final int MSG_BT_HEADSET_CNCT_FAILED = 9;
    private static final int MSG_SET_ALL_VOLUMES = 10;
    private static final int MSG_PERSIST_MASTER_VOLUME_MUTE = 11;
    private static final int MSG_REPORT_NEW_ROUTES = 12;
    private static final int MSG_SET_FORCE_BT_A2DP_USE = 13;
    private static final int MSG_CHECK_MUSIC_ACTIVE = 14;
    private static final int MSG_BROADCAST_AUDIO_BECOMING_NOISY = 15;
    private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME = 16;
    private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED = 17;
    private static final int MSG_PERSIST_SAFE_VOLUME_STATE = 18;
    private static final int MSG_BROADCAST_BT_CONNECTION_STATE = 19;
    private static final int MSG_UNLOAD_SOUND_EFFECTS = 20;
    // start of messages handled under wakelock
    //   these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(),
    //   and not with sendMsg(..., ..., SENDMSG_QUEUE, ...)
@@ -180,8 +179,6 @@ public class AudioService extends IAudioService.Stub {
    // protects mRingerMode
    private final Object mSettingsLock = new Object();

    private boolean mMediaServerOk;

    private SoundPool mSoundPool;
    private final Object mSoundEffectsLock = new Object();
    private static final int NUM_SOUNDPOOL_CHANNELS = 4;
@@ -286,18 +283,8 @@ public class AudioService extends IAudioService.Stub {
        public void onError(int error) {
            switch (error) {
            case AudioSystem.AUDIO_STATUS_SERVER_DIED:
                if (mMediaServerOk) {
                    sendMsg(mAudioHandler, MSG_MEDIA_SERVER_DIED, SENDMSG_NOOP, 0, 0,
                            null, 1500);
                    mMediaServerOk = false;
                }
                break;
            case AudioSystem.AUDIO_STATUS_OK:
                if (!mMediaServerOk) {
                    sendMsg(mAudioHandler, MSG_MEDIA_SERVER_STARTED, SENDMSG_NOOP, 0, 0,
                            null, 0);
                    mMediaServerOk = true;
                }
                sendMsg(mAudioHandler, MSG_MEDIA_SERVER_DIED,
                        SENDMSG_NOOP, 0, 0, null, 0);
                break;
            default:
                break;
@@ -499,6 +486,8 @@ public class AudioService extends IAudioService.Stub {
        mMediaFocusControl = new MediaFocusControl(mAudioHandler.getLooper(),
                mContext, /*VolumeController*/ mVolumePanel, this);

        AudioSystem.setErrorCallback(mAudioSystemCallback);

        boolean cameraSoundForced = mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_camera_sound_forced);
        mCameraSoundForced = new Boolean(cameraSoundForced);
@@ -528,15 +517,12 @@ public class AudioService extends IAudioService.Stub {
        createStreamStates();

        readAndSetLowRamDevice();
        mMediaServerOk = true;

        // Call setRingerModeInt() to apply correct mute
        // state on streams affected by ringer mode.
        mRingerModeMutedStreams = 0;
        setRingerModeInt(getRingerMode(), false);

        AudioSystem.setErrorCallback(mAudioSystemCallback);

        // Register for device connection intent broadcasts.
        IntentFilter intentFilter =
                new IntentFilter(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED);
@@ -3432,21 +3418,17 @@ public class AudioService extends IAudioService.Stub {
                    break;

                case MSG_MEDIA_SERVER_DIED:
                    if (!mMediaServerOk) {
                    if (AudioSystem.checkAudioFlinger() != AudioSystem.AUDIO_STATUS_OK) {
                        Log.e(TAG, "Media server died.");
                        // Force creation of new IAudioFlinger interface so that we are notified
                        // when new media_server process is back to life.
                        AudioSystem.setErrorCallback(mAudioSystemCallback);
                        sendMsg(mAudioHandler, MSG_MEDIA_SERVER_DIED, SENDMSG_NOOP, 0, 0,
                                null, 500);
                    }
                        break;

                case MSG_MEDIA_SERVER_STARTED:
                    }
                    Log.e(TAG, "Media server started.");

                    // indicate to audio HAL that we start the reconfiguration phase after a media
                    // server crash
                    // Note that MSG_MEDIA_SERVER_STARTED message is only received when the media server
                    // Note that we only execute this when the media server
                    // process restarts after a crash, not the first time it is started.
                    AudioSystem.setParameters("restarting=true");

+4 −6
Original line number Diff line number Diff line
@@ -177,12 +177,10 @@ public class AudioSystem
    {
        synchronized (AudioSystem.class) {
            mErrorCallback = cb;
            if (cb != null) {
                cb.onError(checkAudioFlinger());
            }
        }
        // Calling a method on AudioFlinger here makes sure that we bind to IAudioFlinger
        // binder interface death. Not doing that would result in not being notified of
        // media_server process death if no other method is called on AudioSystem that reaches
        // to AudioFlinger.
        isMicrophoneMuted();
    }

    private static void errorCallbackFromNative(int error)
@@ -404,5 +402,5 @@ public class AudioSystem
    public static native int getOutputLatency(int stream);

    public static native int setLowRamDevice(boolean isLowRamDevice);

    public static native int checkAudioFlinger();
}