diff options
author | Steve Kondik <steve@cyngn.com> | 2016-04-16 06:08:04 -0700 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2016-04-16 06:08:04 -0700 |
commit | 8bc1539ddbb873810d71a47792f2b5aae615b0a4 (patch) | |
tree | bac795275f002db5ff61f3154a270e8835fb7f6e | |
parent | 985c5b08b5655369098807201861edd01d8360ee (diff) | |
download | android_packages_apps_AudioFX-8bc1539ddbb873810d71a47792f2b5aae615b0a4.tar.gz android_packages_apps_AudioFX-8bc1539ddbb873810d71a47792f2b5aae615b0a4.tar.bz2 android_packages_apps_AudioFX-8bc1539ddbb873810d71a47792f2b5aae615b0a4.zip |
audiofx: Ignore session callbacks if recording in progress
* This can mess up certain apps and certain tests which perform
loopback. Skip callbacks if recording is active.
Change-Id: Ie58b9accdb78abae7abbf7b03b018de68f5ddd4f
-rw-r--r-- | src/org/cyanogenmod/audiofx/HeadsetService.java | 60 |
1 files changed, 38 insertions, 22 deletions
diff --git a/src/org/cyanogenmod/audiofx/HeadsetService.java b/src/org/cyanogenmod/audiofx/HeadsetService.java index bada687..6528465 100644 --- a/src/org/cyanogenmod/audiofx/HeadsetService.java +++ b/src/org/cyanogenmod/audiofx/HeadsetService.java @@ -195,6 +195,34 @@ public class HeadsetService extends Service { private FxSessionCallback mSessionCallback; + private void addSession(int sessionId) { + if (sessionId == 0) { + return; + } + if (DEBUG) Log.i(TAG, String.format("New audio session: %d", sessionId)); + + synchronized (mAudioSessionsL) { + if (mAudioSessionsL.indexOfKey(sessionId) < 0) { + mAudioSessionsL.put(sessionId, new EffectSet(sessionId)); + } + updateLocked(); + } + } + + private void removeSession(int sessionId) { + if (sessionId == 0) { + return; + } + if (DEBUG) Log.i(TAG, String.format("Audio session removed: %d", sessionId)); + + synchronized (mAudioSessionsL) { + EffectSet gone = mAudioSessionsL.removeReturnOld(sessionId); + if (gone != null) { + gone.release(); + } + } + } + private class FxSessionCallback implements AudioSystem.EffectSessionCallback { @Override @@ -203,34 +231,22 @@ public class HeadsetService extends Service { if (stream == AudioManager.STREAM_MUSIC && (flags < 0 || (flags & 0x8) > 0 || (flags & 0x10) > 0) && (channelMask < 0 || channelMask > 1)) { - if (sessionId == 0) { - return; - } - if (DEBUG) Log.i(TAG, String.format("New audio session: %d", sessionId)); - synchronized (mAudioSessionsL) { - if (mAudioSessionsL.indexOfKey(sessionId) < 0) { - mAudioSessionsL.put(sessionId, new EffectSet(sessionId)); - } - updateLocked(); + // Never auto-attach is someone is recording! We don't want to interfere with any sort of + // loopback mechanisms. + final boolean recording = AudioSystem.isSourceActive(0) || AudioSystem.isSourceActive(6); + if (recording) { + Log.w(TAG, "Recording in progress, not performing auto-attach!"); + return; } + addSession(sessionId); } } @Override public void onSessionRemoved(int stream, int sessionId) { if (stream == AudioManager.STREAM_MUSIC) { - if (sessionId == 0) { - return; - } - if (DEBUG) Log.i(TAG, String.format("Audio session removed: %d", sessionId)); - - synchronized (mAudioSessionsL) { - EffectSet gone = mAudioSessionsL.removeReturnOld(sessionId); - if (gone != null) { - gone.release(); - } - } + removeSession(sessionId); } } } @@ -264,10 +280,10 @@ public class HeadsetService extends Service { String action = intent.getAction(); int sessionId = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, 0); if (action.equals(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION)) { - mSessionCallback.onSessionAdded(AudioManager.STREAM_MUSIC, sessionId, -1, -1, -1); + addSession(sessionId); } if (action.equals(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION)) { - mSessionCallback.onSessionRemoved(AudioManager.STREAM_MUSIC, sessionId); + removeSession(sessionId); } } }; |