diff options
author | Steve Kondik <steve@cyngn.com> | 2016-05-25 13:48:37 -0700 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2016-05-25 13:49:49 -0700 |
commit | 35513df0f15db1e5d65ccf02665f44a74d2b5e79 (patch) | |
tree | e66591303e65a9806cea590f3dab5c5ed76ece16 | |
parent | 7f5ef5814913f0dcf1bb324751961d19b1da6b46 (diff) | |
download | android_packages_apps_AudioFX-35513df0f15db1e5d65ccf02665f44a74d2b5e79.tar.gz android_packages_apps_AudioFX-35513df0f15db1e5d65ccf02665f44a74d2b5e79.tar.bz2 android_packages_apps_AudioFX-35513df0f15db1e5d65ccf02665f44a74d2b5e79.zip |
modiofx: Reintroduce deferred release for MaxxAudio
* And guard against races correctly by adding a death marker.
Change-Id: I28b56e7326163d28293f8f5e9b10a53e7c34a2c0
Fixes: AUDIO-139
-rw-r--r-- | src/com/cyngn/audiofx/backends/EffectSet.java | 20 | ||||
-rw-r--r-- | src/com/cyngn/audiofx/service/SessionManager.java | 62 |
2 files changed, 61 insertions, 21 deletions
diff --git a/src/com/cyngn/audiofx/backends/EffectSet.java b/src/com/cyngn/audiofx/backends/EffectSet.java index 7d1e900..47ae894 100644 --- a/src/com/cyngn/audiofx/backends/EffectSet.java +++ b/src/com/cyngn/audiofx/backends/EffectSet.java @@ -17,6 +17,8 @@ public abstract class EffectSet { private AudioDeviceInfo mDeviceInfo; + private boolean mMarkedForDeath = false; + public EffectSet(int sessionId, AudioDeviceInfo deviceInfo) { mSessionId = sessionId; mDeviceInfo = deviceInfo; @@ -203,6 +205,24 @@ public abstract class EffectSet { return; } + /** + * How long should we delay for when releasing the effects? + * This helps certain effect implementations when the + * app is reusing a session ID. By default this + * behavior is disabled. + */ + public int getReleaseDelay() { + return 0; + } + + public boolean isMarkedForDeath() { + return mMarkedForDeath; + } + + public void setMarkedForDeath(boolean die) { + mMarkedForDeath = die; + } + @Override public String toString() { return "EffectSet (" + this.getClass().getSimpleName() + ")" diff --git a/src/com/cyngn/audiofx/service/SessionManager.java b/src/com/cyngn/audiofx/service/SessionManager.java index a05d5d4..5c62cf6 100644 --- a/src/com/cyngn/audiofx/service/SessionManager.java +++ b/src/com/cyngn/audiofx/service/SessionManager.java @@ -83,11 +83,15 @@ class SessionManager implements AudioOutputChangeListener.AudioOutputChangedCall if (mHandler == null) { return; } - mHandler.obtainMessage(MSG_UPDATE_DSP, flags, 0).sendToTarget(); + synchronized (mAudioSessionsL) { + mHandler.obtainMessage(MSG_UPDATE_DSP, flags, 0).sendToTarget(); + } } public void setOverrideLevels(short band, float level) { - mHandler.obtainMessage(MSG_UPDATE_EQ_OVERRIDE, band, 0, level).sendToTarget(); + synchronized (mAudioSessionsL) { + mHandler.obtainMessage(MSG_UPDATE_EQ_OVERRIDE, band, 0, level).sendToTarget(); + } } /** @@ -112,23 +116,37 @@ class SessionManager implements AudioOutputChangeListener.AudioOutputChangedCall } public void addSession(AudioSessionInfo info) { - // 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; - } - if (shouldHandleSession(info) && !mHandler.hasMessages(MSG_ADD_SESSION, info.getSessionId())) { - if (DEBUG) Log.i(TAG, "New audio session: " + info.toString()); - mHandler.obtainMessage(MSG_ADD_SESSION, info.getSessionId()).sendToTarget(); + synchronized (mAudioSessionsL) { + // 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; + } + if (shouldHandleSession(info) && + !mHandler.hasMessages(MSG_ADD_SESSION, info.getSessionId())) { + mHandler.removeMessages(MSG_REMOVE_SESSION, info.getSessionId()); + mHandler.obtainMessage(MSG_ADD_SESSION, info.getSessionId()).sendToTarget(); + if (DEBUG) Log.i(TAG, "New audio session: " + info.toString()); + } } } public void removeSession(AudioSessionInfo info) { - if (shouldHandleSession(info) && !mHandler.hasMessages(MSG_REMOVE_SESSION, info.getSessionId())) { - if (DEBUG) Log.i(TAG, "Audio session queued for removal: " + info.toString()); - mHandler.obtainMessage(MSG_REMOVE_SESSION, info.getSessionId()).sendToTarget(); + synchronized (mAudioSessionsL) { + if (shouldHandleSession(info) && + !mHandler.hasMessages(MSG_REMOVE_SESSION, info.getSessionId())) { + int sid = info.getSessionId(); + final EffectSet effects = mAudioSessionsL.get(sid); + if (effects != null) { + effects.setMarkedForDeath(true); + mHandler.sendMessageDelayed( + mHandler.obtainMessage(MSG_REMOVE_SESSION, sid), + effects.getReleaseDelay()); + if (DEBUG) Log.i(TAG, "Audio session queued for removal: " + info.toString()); + } + } } } @@ -286,7 +304,8 @@ class SessionManager implements AudioOutputChangeListener.AudioOutputChangedCall break; } - if (mAudioSessionsL.indexOfKey(sessionId) < 0) { + session = mAudioSessionsL.get(sessionId); + if (session == null) { try { session = EffectsFactory.createEffectSet(mContext, sessionId, mCurrentDevice); } catch (Exception e) { @@ -296,6 +315,8 @@ class SessionManager implements AudioOutputChangeListener.AudioOutputChangedCall mAudioSessionsL.put(sessionId, session); if (DEBUG) Log.w(TAG, "added new EffectSet for sessionId=" + sessionId); updateBackendLocked(ALL_CHANGED, session); + } else { + session.setMarkedForDeath(false); } break; @@ -307,13 +328,12 @@ class SessionManager implements AudioOutputChangeListener.AudioOutputChangedCall if (sessionId == null || sessionId <= 0) { break; } - mHandler.removeMessages(MSG_UPDATE_FOR_SESSION, sessionId); - if (mAudioSessionsL.indexOfKey(sessionId) > -1) { - session = mAudioSessionsL.removeReturnOld(sessionId); - } - if (session != null) { + session = mAudioSessionsL.get(sessionId); + if (session != null && session.isMarkedForDeath()) { + mHandler.removeMessages(MSG_UPDATE_FOR_SESSION, sessionId); session.release(); + mAudioSessionsL.remove(sessionId); if (DEBUG) Log.w(TAG, "removed and released sessionId=" + sessionId); } |