summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Stefani <luca.stefani.ge1@gmail.com>2020-04-03 16:00:59 +0200
committerMichael Bestas <mkbestas@lineageos.org>2022-02-07 16:48:17 +0200
commit645010f7a8885ddea18afc49a20a8ddff2600089 (patch)
tree2fbd94be282407280caa9acccf67ce4f5b25397b
parentd6b3c917d685888e353d01a05830e23a34418dfe (diff)
Use the standard AudioEffect APIs to retrieve sessions
Change-Id: Iacd3e870d76f9963d0f3eb31f4bb7aa37356261a
-rw-r--r--Android.bp1
-rw-r--r--AndroidManifest.xml2
-rw-r--r--src/org/lineageos/audiofx/receiver/ServiceDispatcher.java48
-rw-r--r--src/org/lineageos/audiofx/service/AudioFxService.java63
-rw-r--r--src/org/lineageos/audiofx/service/SessionManager.java45
5 files changed, 39 insertions, 120 deletions
diff --git a/Android.bp b/Android.bp
index 48d55ce..1b4e695 100644
--- a/Android.bp
+++ b/Android.bp
@@ -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);
}
}
}