diff options
author | Steve Kondik <steve@cyngn.com> | 2016-04-24 00:12:10 -0700 |
---|---|---|
committer | Gerrit Code Review <gerrit@cyngn.com> | 2016-04-28 06:38:02 +0000 |
commit | a3a728ce783185ed9d30aa80405e48f7718649e1 (patch) | |
tree | 504d56b41146dbb5150369955ccb4ef2593cb5d0 | |
parent | 32b6b9b7742bdb81223c6ee69814912010ba3d30 (diff) | |
download | android_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.xml | 2 | ||||
-rw-r--r-- | src/com/cyngn/audiofx/receiver/ServiceDispatcher.java | 13 | ||||
-rw-r--r-- | src/com/cyngn/audiofx/service/AudioFxService.java | 34 | ||||
-rw-r--r-- | src/com/cyngn/audiofx/service/SessionManager.java | 46 |
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(); } } |