summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Kondik <steve@cyngn.com>2016-05-25 13:48:37 -0700
committerSteve Kondik <steve@cyngn.com>2016-05-25 13:49:49 -0700
commit35513df0f15db1e5d65ccf02665f44a74d2b5e79 (patch)
treee66591303e65a9806cea590f3dab5c5ed76ece16
parent7f5ef5814913f0dcf1bb324751961d19b1da6b46 (diff)
downloadandroid_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.java20
-rw-r--r--src/com/cyngn/audiofx/service/SessionManager.java62
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);
}