diff options
author | Luca Stefani <luca.stefani.ge1@gmail.com> | 2020-04-03 16:00:59 +0200 |
---|---|---|
committer | Michael Bestas <mkbestas@lineageos.org> | 2022-02-07 16:48:17 +0200 |
commit | 645010f7a8885ddea18afc49a20a8ddff2600089 (patch) | |
tree | 2fbd94be282407280caa9acccf67ce4f5b25397b | |
parent | d6b3c917d685888e353d01a05830e23a34418dfe (diff) |
Use the standard AudioEffect APIs to retrieve sessions
Change-Id: Iacd3e870d76f9963d0f3eb31f4bb7aa37356261a
-rw-r--r-- | Android.bp | 1 | ||||
-rw-r--r-- | AndroidManifest.xml | 2 | ||||
-rw-r--r-- | src/org/lineageos/audiofx/receiver/ServiceDispatcher.java | 48 | ||||
-rw-r--r-- | src/org/lineageos/audiofx/service/AudioFxService.java | 63 | ||||
-rw-r--r-- | src/org/lineageos/audiofx/service/SessionManager.java | 45 |
5 files changed, 39 insertions, 120 deletions
@@ -24,7 +24,6 @@ android_app { static_libs: [ "androidx.core_core", "androidx.legacy_legacy-support-v4", - "org.lineageos.platform.internal", ], platform_apis: true, diff --git a/AndroidManifest.xml b/AndroidManifest.xml index f959b02..b512321 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -95,8 +95,6 @@ <intent-filter> <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="lineageos.intent.action.ACTION_AUDIO_SESSIONS_CHANGED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> diff --git a/src/org/lineageos/audiofx/receiver/ServiceDispatcher.java b/src/org/lineageos/audiofx/receiver/ServiceDispatcher.java index 9e9a35b..d27a374 100644 --- a/src/org/lineageos/audiofx/receiver/ServiceDispatcher.java +++ b/src/org/lineageos/audiofx/receiver/ServiceDispatcher.java @@ -23,36 +23,38 @@ import android.util.Log; import org.lineageos.audiofx.service.AudioFxService; -import lineageos.media.AudioSessionInfo; -import lineageos.media.LineageAudioManager; - public class ServiceDispatcher extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - Intent service = new Intent(context.getApplicationContext(), AudioFxService.class); - String action = intent.getAction(); - - // We can also get AUDIO_BECOMING_NOISY, which means a device change is - // coming and we should wake up to handle it. - if (action.equals(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION) || - action.equals(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION)) { - int sessionId = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, 0); - 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(LineageAudioManager.ACTION_AUDIO_SESSIONS_CHANGED)) { - - // callback from LineageAudioService - final AudioSessionInfo info = intent.getParcelableExtra( - LineageAudioManager.EXTRA_SESSION_INFO); - boolean added = intent.getBooleanExtra(LineageAudioManager.EXTRA_SESSION_ADDED, false); - service.putExtra(LineageAudioManager.EXTRA_SESSION_INFO, info); - service.putExtra(LineageAudioManager.EXTRA_SESSION_ADDED, added); + final String action = intent.getAction(); + final String packageName = intent.getStringExtra(AudioEffect.EXTRA_PACKAGE_NAME); + final int audioSession = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, + AudioEffect.ERROR_BAD_VALUE); + final int contentType = intent.getIntExtra(AudioEffect.EXTRA_CONTENT_TYPE, + AudioEffect.CONTENT_TYPE_MUSIC); + + // check package name + if (packageName == null) { + return; + } + + // check audio session + if (audioSession < 0) { + return; } + // check if it's music + if (contentType != AudioEffect.CONTENT_TYPE_MUSIC) { + return; + } + + Intent service = new Intent(context.getApplicationContext(), AudioFxService.class); + service.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, packageName); + service.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, audioSession); + service.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, contentType); service.setAction(action); + context.startService(service); if (AudioFxService.DEBUG) { Log.d("AudioFX-Dispatcher", "Received " + action); diff --git a/src/org/lineageos/audiofx/service/AudioFxService.java b/src/org/lineageos/audiofx/service/AudioFxService.java index 3368e8f..525c7aa 100644 --- a/src/org/lineageos/audiofx/service/AudioFxService.java +++ b/src/org/lineageos/audiofx/service/AudioFxService.java @@ -18,7 +18,6 @@ package org.lineageos.audiofx.service; import android.app.Service; import android.content.Intent; import android.media.AudioDeviceInfo; -import android.media.AudioManager; import android.media.audiofx.AudioEffect; import android.os.Binder; import android.os.Handler; @@ -32,9 +31,6 @@ import org.lineageos.audiofx.backends.EffectSet; import java.lang.ref.WeakReference; -import lineageos.media.AudioSessionInfo; -import lineageos.media.LineageAudioManager; - /** * This service is responsible for applying all requested effects from the AudioFX UI. * <p> @@ -63,11 +59,6 @@ public class AudioFxService extends Service public static final int REVERB_CHANGED = 0x20; public static final int ALL_CHANGED = 0xFF; - // flags from audio.h, used by session callbacks - static final int AUDIO_OUTPUT_FLAG_FAST = 0x4; - static final int AUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8; - static final int AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD = 0x10; - private AudioOutputChangeListener mOutputListener; private DevicePreferenceManager mDevicePrefs; private SessionManager mSessionManager; @@ -133,11 +124,6 @@ public class AudioFxService extends Service mSessionManager = new SessionManager(getApplicationContext(), mHandler, mDevicePrefs, mCurrentDevice); mOutputListener.addCallback(mDevicePrefs, mSessionManager); - - final LineageAudioManager lam = LineageAudioManager.getInstance(getApplicationContext()); - for (AudioSessionInfo asi : lam.listAudioSessions(AudioManager.STREAM_MUSIC)) { - mSessionManager.addSession(asi); - } } @Override @@ -148,60 +134,19 @@ public class AudioFxService extends Service } if (intent != null && intent.getAction() != null) { String action = intent.getAction(); - int sessionId = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, 0); + int sessionId = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, + AudioEffect.ERROR_BAD_VALUE); String pkg = intent.getStringExtra(AudioEffect.EXTRA_PACKAGE_NAME); - int stream = mapContentTypeToStream( - intent.getIntExtra(AudioEffect.EXTRA_CONTENT_TYPE, - AudioEffect.CONTENT_TYPE_MUSIC)); if (action.equals(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION)) { - if (DEBUG) { - Log.i(TAG, String.format("New audio session: %d package: %s contentType=%d", - sessionId, pkg, stream)); - } - AudioSessionInfo info = new AudioSessionInfo(sessionId, stream, -1, -1, -1); - mSessionManager.addSession(info); - + mSessionManager.addSession(sessionId); } else if (action.equals(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION)) { - - AudioSessionInfo info = new AudioSessionInfo(sessionId, stream, -1, -1, -1); - mSessionManager.removeSession(info); - - } else if (action.equals(LineageAudioManager.ACTION_AUDIO_SESSIONS_CHANGED)) { - - final AudioSessionInfo info = intent.getParcelableExtra( - LineageAudioManager.EXTRA_SESSION_INFO); - if (info != null && info.getSessionId() > 0) { - boolean added = intent.getBooleanExtra( - LineageAudioManager.EXTRA_SESSION_ADDED, false); - if (added) { - mSessionManager.addSession(info); - } else { - mSessionManager.removeSession(info); - } - } + mSessionManager.removeSession(sessionId); } } return START_STICKY; } - /** - * maps {@link AudioEffect#EXTRA_CONTENT_TYPE} to an AudioManager.STREAM_* item - */ - private static int mapContentTypeToStream(int contentType) { - switch (contentType) { - case AudioEffect.CONTENT_TYPE_VOICE: - return AudioManager.STREAM_VOICE_CALL; - case AudioEffect.CONTENT_TYPE_GAME: - // explicitly don't support game effects right now - return -1; - case AudioEffect.CONTENT_TYPE_MOVIE: - case AudioEffect.CONTENT_TYPE_MUSIC: - default: - return AudioManager.STREAM_MUSIC; - } - } - @Override public synchronized void onAudioOutputChanged(boolean firstChange, AudioDeviceInfo outputDevice) { diff --git a/src/org/lineageos/audiofx/service/SessionManager.java b/src/org/lineageos/audiofx/service/SessionManager.java index e1a1c68..dd1fa32 100644 --- a/src/org/lineageos/audiofx/service/SessionManager.java +++ b/src/org/lineageos/audiofx/service/SessionManager.java @@ -38,7 +38,6 @@ import static org.lineageos.audiofx.service.AudioFxService.VOLUME_BOOST_CHANGED; import android.content.Context; import android.content.SharedPreferences; import android.media.AudioDeviceInfo; -import android.media.AudioManager; import android.media.AudioSystem; import android.media.audiofx.PresetReverb; import android.os.Handler; @@ -51,9 +50,6 @@ import org.lineageos.audiofx.backends.EffectSet; import org.lineageos.audiofx.backends.EffectsFactory; import org.lineageos.audiofx.eq.EqUtils; -import lineageos.media.AudioSessionInfo; -import lineageos.media.LineageAudioManager; - class SessionManager implements AudioOutputChangeListener.AudioOutputChangedCallback { private static final String TAG = AudioFxService.TAG; @@ -62,7 +58,6 @@ class SessionManager implements AudioOutputChangeListener.AudioOutputChangedCall private final Context mContext; private final Handler mHandler; private final DevicePreferenceManager mDevicePrefs; - private final LineageAudioManager mLineageAudio; /** * All fields ending with L should be locked on {@link #mAudioSessionsL} @@ -82,7 +77,6 @@ class SessionManager implements AudioOutputChangeListener.AudioOutputChangedCall public SessionManager(Context context, Handler handler, DevicePreferenceManager devicePrefs, AudioDeviceInfo outputDevice) { mContext = context; - mLineageAudio = LineageAudioManager.getInstance(context); mDevicePrefs = devicePrefs; mCurrentDevice = outputDevice; mHandler = new Handler(handler.getLooper(), new AudioServiceHandler()); @@ -110,23 +104,7 @@ class SessionManager implements AudioOutputChangeListener.AudioOutputChangedCall } } - /** - * Callback which listens for session updates from AudioPolicyManager. This is a feature added - * by LineageOS which notifies when sessions are created or destroyed on a particular stream. - * This is independent of the standard control intents and should not conflict with them. This - * feature may not be available on all devices. - * <p> - * Default logic is to do our best to only attach to music streams. We don't attach to mono - * streams by default since these are usually notifications/ringtones/etc. - */ - public boolean shouldHandleSession(AudioSessionInfo info) { - final boolean music = info.getStream() == AudioManager.STREAM_MUSIC; - final boolean stereo = info.getChannelMask() < 0 || info.getChannelMask() > 1; - - return music && stereo && info.getSessionId() > 0; - } - - public void addSession(AudioSessionInfo info) { + public void addSession(int stream) { synchronized (mAudioSessionsL) { // Never auto-attach is someone is recording! We don't want to interfere // with any sort of loopback mechanisms. @@ -136,27 +114,24 @@ class SessionManager implements AudioOutputChangeListener.AudioOutputChangedCall 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()); + if (!mHandler.hasMessages(MSG_ADD_SESSION, stream)) { + mHandler.removeMessages(MSG_REMOVE_SESSION, stream); + mHandler.obtainMessage(MSG_ADD_SESSION, stream).sendToTarget(); + if (DEBUG) Log.i(TAG, "New audio session: " + stream); } } } - public void removeSession(AudioSessionInfo info) { + public void removeSession(int stream) { synchronized (mAudioSessionsL) { - if (shouldHandleSession(info) && - !mHandler.hasMessages(MSG_REMOVE_SESSION, info.getSessionId())) { - int sid = info.getSessionId(); - final EffectSet effects = mAudioSessionsL.get(sid); + if (!mHandler.hasMessages(MSG_REMOVE_SESSION, stream)) { + final EffectSet effects = mAudioSessionsL.get(stream); if (effects != null) { effects.setMarkedForDeath(true); mHandler.sendMessageDelayed( - mHandler.obtainMessage(MSG_REMOVE_SESSION, sid), + mHandler.obtainMessage(MSG_REMOVE_SESSION, stream), effects.getReleaseDelay()); - if (DEBUG) Log.i(TAG, "Audio session queued for removal: " + info.toString()); + if (DEBUG) Log.i(TAG, "Audio session queued for removal: " + stream); } } } |