summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Kondik <steve@cyngn.com>2016-04-24 00:12:10 -0700
committerGerrit Code Review <gerrit@cyngn.com>2016-04-28 06:38:02 +0000
commita3a728ce783185ed9d30aa80405e48f7718649e1 (patch)
tree504d56b41146dbb5150369955ccb4ef2593cb5d0
parent32b6b9b7742bdb81223c6ee69814912010ba3d30 (diff)
downloadandroid_packages_apps_AudioFX-a3a728ce783185ed9d30aa80405e48f7718649e1.tar.gz
android_packages_apps_AudioFX-a3a728ce783185ed9d30aa80405e48f7718649e1.tar.bz2
android_packages_apps_AudioFX-a3a728ce783185ed9d30aa80405e48f7718649e1.zip
audiofx: Update for CMAudioService changes
* Switch to the new broadcast mechanism for audiosessions. Change-Id: Ibf0a8cf04a80762f3e44642cbbe8c56468197035
-rw-r--r--AndroidManifest.xml2
-rw-r--r--src/com/cyngn/audiofx/receiver/ServiceDispatcher.java13
-rw-r--r--src/com/cyngn/audiofx/service/AudioFxService.java34
-rw-r--r--src/com/cyngn/audiofx/service/SessionManager.java46
4 files changed, 69 insertions, 26 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c0ff7cd..20bd672 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -29,6 +29,7 @@
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="cyanogenmod.permission.PUBLISH_CUSTOM_TILE" />
+ <uses-permission android:name="cyanogenmod.permission.OBSERVE_AUDIO_SESSIONS" />
<permission android:name="com.cyngn.audiofx.ANALYTICS_PERMISSION"
android:protectionLevel="signature" />
@@ -102,6 +103,7 @@
<action android:name="android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION"/>
<action android:name="android.media.action.CLOSE_AUDIO_EFFECT_CONTROL_SESSION"/>
<action android:name="android.media.AUDIO_BECOMING_NOISY"/>
+ <action android:name="cyanogenmod.intent.action.ACTION_AUDIO_SESSIONS_CHANGED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
diff --git a/src/com/cyngn/audiofx/receiver/ServiceDispatcher.java b/src/com/cyngn/audiofx/receiver/ServiceDispatcher.java
index 9d27568..7581ba2 100644
--- a/src/com/cyngn/audiofx/receiver/ServiceDispatcher.java
+++ b/src/com/cyngn/audiofx/receiver/ServiceDispatcher.java
@@ -1,3 +1,4 @@
+
package com.cyngn.audiofx.receiver;
import android.content.BroadcastReceiver;
@@ -8,6 +9,9 @@ import android.util.Log;
import com.cyngn.audiofx.service.AudioFxService;
+import cyanogenmod.media.AudioSessionInfo;
+import cyanogenmod.media.CMAudioManager;
+
public class ServiceDispatcher extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
@@ -23,6 +27,15 @@ public class ServiceDispatcher extends BroadcastReceiver {
String pkg = intent.getStringExtra(AudioEffect.EXTRA_PACKAGE_NAME);
service.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, sessionId);
service.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, pkg);
+
+ } else if (action.equals(CMAudioManager.ACTION_AUDIO_SESSIONS_CHANGED)) {
+
+ // callback from CMAudioService
+ final AudioSessionInfo info = (AudioSessionInfo) intent.getParcelableExtra(
+ CMAudioManager.EXTRA_SESSION_INFO);
+ boolean added = intent.getBooleanExtra(CMAudioManager.EXTRA_SESSION_ADDED, false);
+ service.putExtra(CMAudioManager.EXTRA_SESSION_INFO, info);
+ service.putExtra(CMAudioManager.EXTRA_SESSION_ADDED, added);
}
service.setAction(action);
diff --git a/src/com/cyngn/audiofx/service/AudioFxService.java b/src/com/cyngn/audiofx/service/AudioFxService.java
index d5fae5c..88cc15b 100644
--- a/src/com/cyngn/audiofx/service/AudioFxService.java
+++ b/src/com/cyngn/audiofx/service/AudioFxService.java
@@ -23,7 +23,6 @@ import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.content.res.Configuration;
-import android.media.AudioDeviceInfo;
import android.media.AudioManager;
import android.media.audiofx.AudioEffect;
import android.os.Binder;
@@ -43,6 +42,8 @@ import java.util.Locale;
import cyanogenmod.app.CMStatusBarManager;
import cyanogenmod.app.CustomTile;
+import cyanogenmod.media.AudioSessionInfo;
+import cyanogenmod.media.CMAudioManager;
/**
* This service is responsible for applying all requested effects from the AudioFX UI.
@@ -143,6 +144,15 @@ public class AudioFxService extends Service {
return;
}
+ mSessionManager = new SessionManager(getApplicationContext(), mHandler, mDevicePrefs);
+
+ mOutputListener.addCallback(mDevicePrefs, mSessionManager, this);
+
+ final CMAudioManager cma = CMAudioManager.getInstance(getApplicationContext());
+ for (AudioSessionInfo asi : cma.listAudioSessions(AudioManager.STREAM_MUSIC)) {
+ mSessionManager.addSession(asi);
+ }
+
updateQsTile();
}
@@ -164,15 +174,31 @@ public class AudioFxService extends Service {
AudioEffect.CONTENT_TYPE_MUSIC));
if (action.equals(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION)) {
- if (DEBUG) {
+ if (DEBUG) {
Log.i(TAG, String.format("New audio session: %d package: %s contentType=%d",
sessionId, pkg, stream));
}
- mSessionManager.onSessionAdded(stream, sessionId, -1, -1, -1);
+ AudioSessionInfo info = new AudioSessionInfo(sessionId, stream, -1, -1, -1);
+ mSessionManager.addSession(info);
} else if (action.equals(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION)) {
- mSessionManager.onSessionRemoved(stream, sessionId);
+ AudioSessionInfo info = new AudioSessionInfo(sessionId, stream, -1, -1, -1);
+ mSessionManager.removeSession(info);
+
+ } else if (action.equals(CMAudioManager.ACTION_AUDIO_SESSIONS_CHANGED)) {
+
+ final AudioSessionInfo info = (AudioSessionInfo) intent.getParcelableExtra(
+ CMAudioManager.EXTRA_SESSION_INFO);
+ if (info != null && info.getSessionId() > 0) {
+ boolean added = intent.getBooleanExtra(CMAudioManager.EXTRA_SESSION_ADDED,
+ false);
+ if (added) {
+ mSessionManager.addSession(info);
+ } else {
+ mSessionManager.removeSession(info);
+ }
+ }
}
}
diff --git a/src/com/cyngn/audiofx/service/SessionManager.java b/src/com/cyngn/audiofx/service/SessionManager.java
index d51bb5a..ade6eb4 100644
--- a/src/com/cyngn/audiofx/service/SessionManager.java
+++ b/src/com/cyngn/audiofx/service/SessionManager.java
@@ -40,7 +40,10 @@ import com.cyngn.audiofx.backends.EffectSet;
import com.cyngn.audiofx.backends.EffectsFactory;
import com.cyngn.audiofx.eq.EqUtils;
-class SessionManager extends AudioOutputChangeListener implements AudioSystem.EffectSessionCallback {
+import cyanogenmod.media.AudioSessionInfo;
+import cyanogenmod.media.CMAudioManager;
+
+class SessionManager extends AudioOutputChangeListener {
private static final String TAG = AudioFxService.TAG;
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -53,6 +56,7 @@ class SessionManager extends AudioOutputChangeListener implements AudioSystem.Ef
private final SparseArray<EffectSet> mAudioSessionsL = new SparseArray<EffectSet>();
private Handler mHandler;
+ private final CMAudioManager mCMAudio;
private AudioDeviceInfo mCurrentDevice;
private AudioDeviceInfo mPreviousDevice;
@@ -68,10 +72,10 @@ class SessionManager extends AudioOutputChangeListener implements AudioSystem.Ef
super (context, handler);
mContext = context;
+ mCMAudio = CMAudioManager.getInstance(context);
+
mHandler = new Handler(handler.getLooper(), new AudioServiceHandler());
register();
-
- AudioSystem.setEffectSessionCallback(this);
}
public void onDestroy() {
@@ -83,8 +87,6 @@ class SessionManager extends AudioOutputChangeListener implements AudioSystem.Ef
mHandler.getLooper().quit();
mHandler = null;
}
-
- AudioSystem.setEffectSessionCallback(null);
}
}
@@ -114,14 +116,17 @@ class SessionManager extends AudioOutputChangeListener implements AudioSystem.Ef
* to low-latency streams automatically, and we don't attach to mono streams by default
* either since these are usually notifications/ringtones/etc.
*/
- @Override
- public void onSessionAdded(int stream, int sessionId, int flags, int channelMask, int uid) {
- final boolean music = stream == AudioManager.STREAM_MUSIC;
- final boolean offloaded = (flags < 0)
- || (flags & AudioFxService.AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) > 0
- || (flags & AudioFxService.AUDIO_OUTPUT_FLAG_DEEP_BUFFER) > 0;
- final boolean stereo = channelMask < 0 || channelMask > 1;
+ public boolean shouldHandleSession(AudioSessionInfo info) {
+ final boolean music = info.getStream() == AudioManager.STREAM_MUSIC;
+ final boolean offloaded = (info.getFlags() < 0)
+ || (info.getFlags() & AudioFxService.AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) > 0
+ || (info.getFlags() & AudioFxService.AUDIO_OUTPUT_FLAG_DEEP_BUFFER) > 0;
+ final boolean stereo = info.getChannelMask() < 0 || info.getChannelMask() > 1;
+
+ return music && offloaded && stereo && info.getSessionId() > 0;
+ }
+ 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);
@@ -129,19 +134,16 @@ class SessionManager extends AudioOutputChangeListener implements AudioSystem.Ef
Log.w(TAG, "Recording in progress, not performing auto-attach!");
return;
}
- if (music && offloaded && stereo && !mHandler.hasMessages(MSG_ADD_SESSION, sessionId)) {
- if (DEBUG) Log.i(TAG, String.format("New audio session: %d [flags=%d channelMask=%d uid=%d]",
- sessionId, flags, channelMask, uid));
- mHandler.obtainMessage(MSG_ADD_SESSION, sessionId).sendToTarget();
+ 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();
}
}
- @Override
- public void onSessionRemoved(int stream, int sessionId) {
- if (stream == AudioManager.STREAM_MUSIC &&
- !mHandler.hasMessages(MSG_REMOVE_SESSION, sessionId)) {
- if (DEBUG) Log.i(TAG, String.format("Audio session queued for removal: %d", sessionId));
- mHandler.obtainMessage(MSG_REMOVE_SESSION, sessionId).sendToTarget();
+ 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();
}
}