summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/service/voice/HotwordDetectionService.java6
-rw-r--r--core/java/android/service/voice/IHotwordDetectionService.aidl3
-rw-r--r--core/jni/android_media_AudioSystem.cpp8
-rw-r--r--media/java/android/media/AudioSystem.java3
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java12
5 files changed, 31 insertions, 1 deletions
diff --git a/core/java/android/service/voice/HotwordDetectionService.java b/core/java/android/service/voice/HotwordDetectionService.java
index deb6c01a3088..b66d93d6316e 100644
--- a/core/java/android/service/voice/HotwordDetectionService.java
+++ b/core/java/android/service/voice/HotwordDetectionService.java
@@ -31,6 +31,7 @@ import android.content.Context;
import android.content.Intent;
import android.hardware.soundtrigger.SoundTrigger;
import android.media.AudioFormat;
+import android.media.AudioSystem;
import android.os.Bundle;
import android.os.IBinder;
import android.os.IRemoteCallback;
@@ -187,6 +188,11 @@ public abstract class HotwordDetectionService extends Service {
}
@Override
+ public void updateAudioFlinger(IBinder audioFlinger) {
+ AudioSystem.setAudioFlingerBinder(audioFlinger);
+ }
+
+ @Override
public void updateContentCaptureManager(IContentCaptureManager manager,
ContentCaptureOptions options) {
mContentCaptureManager = new ContentCaptureManager(
diff --git a/core/java/android/service/voice/IHotwordDetectionService.aidl b/core/java/android/service/voice/IHotwordDetectionService.aidl
index 72dd45aeeb0f..d7ed67812e87 100644
--- a/core/java/android/service/voice/IHotwordDetectionService.aidl
+++ b/core/java/android/service/voice/IHotwordDetectionService.aidl
@@ -19,6 +19,7 @@ package android.service.voice;
import android.content.ContentCaptureOptions;
import android.hardware.soundtrigger.SoundTrigger;
import android.media.AudioFormat;
+import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
@@ -50,6 +51,8 @@ oneway interface IHotwordDetectionService {
in SharedMemory sharedMemory,
in IRemoteCallback callback);
+ void updateAudioFlinger(in IBinder audioFlinger);
+
void updateContentCaptureManager(
in IContentCaptureManager contentCaptureManager,
in ContentCaptureOptions options);
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index 5ca4ec0aae13..6e2b9cf250c6 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -42,6 +42,7 @@
#include "android_media_AudioFormat.h"
#include "android_media_AudioProfile.h"
#include "android_media_MicrophoneInfo.h"
+#include "android_util_Binder.h"
// ----------------------------------------------------------------------------
@@ -850,6 +851,11 @@ android_media_AudioSystem_checkAudioFlinger(JNIEnv *env, jobject clazz)
return (jint) check_AudioSystem_Command(AudioSystem::checkAudioFlinger());
}
+static void android_media_AudioSystem_setAudioFlingerBinder(JNIEnv *env, jobject clazz,
+ jobject audioFlinger) {
+ AudioSystem::setAudioFlingerBinder(android::ibinderForJavaObject(env, audioFlinger));
+}
+
static void convertAudioGainConfigToNative(JNIEnv *env,
struct audio_gain_config *nAudioGainConfig,
const jobject jAudioGainConfig,
@@ -2728,6 +2734,8 @@ static const JNINativeMethod gMethods[] =
{"getOutputLatency", "(I)I", (void *)android_media_AudioSystem_getOutputLatency},
{"setLowRamDevice", "(ZJ)I", (void *)android_media_AudioSystem_setLowRamDevice},
{"checkAudioFlinger", "()I", (void *)android_media_AudioSystem_checkAudioFlinger},
+ {"setAudioFlingerBinder", "(Landroid/os/IBinder;)V",
+ (void *)android_media_AudioSystem_setAudioFlingerBinder},
{"listAudioPorts", "(Ljava/util/ArrayList;[I)I",
(void *)android_media_AudioSystem_listAudioPorts},
{"createAudioPatch",
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 5f6fc17c38cb..8012f03d84b3 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -27,6 +27,7 @@ import android.content.pm.PackageManager;
import android.media.audiofx.AudioEffect;
import android.media.audiopolicy.AudioMix;
import android.os.Build;
+import android.os.IBinder;
import android.os.Vibrator;
import android.telephony.TelephonyManager;
import android.util.Log;
@@ -1655,6 +1656,8 @@ public class AudioSystem
/** @hide */
@UnsupportedAppUsage
public static native int checkAudioFlinger();
+ /** @hide */
+ public static native void setAudioFlingerBinder(IBinder audioFlinger);
/** @hide */
public static native int listAudioPorts(ArrayList<AudioPort> ports, int[] generation);
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
index bac703121c10..17303a4aa7e1 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
@@ -156,8 +156,9 @@ final class HotwordDetectionConnection {
updateStateLocked(options, sharedMemory);
return;
}
- updateStateWithCallbackLocked(options, sharedMemory, callback);
+ updateAudioFlinger();
updateContentCaptureManager();
+ updateStateWithCallbackLocked(options, sharedMemory, callback);
}
private void updateStateWithCallbackLocked(PersistableBundle options,
@@ -229,6 +230,15 @@ final class HotwordDetectionConnection {
});
}
+ private void updateAudioFlinger() {
+ // TODO: Consider using a proxy that limits the exposed API surface.
+ IBinder audioFlinger = ServiceManager.getService("media.audio_flinger");
+ if (audioFlinger == null) {
+ throw new IllegalStateException("Service media.audio_flinger wasn't found.");
+ }
+ mRemoteHotwordDetectionService.post(service -> service.updateAudioFlinger(audioFlinger));
+ }
+
private void updateContentCaptureManager() {
IBinder b = ServiceManager
.getService(Context.CONTENT_CAPTURE_MANAGER_SERVICE);