diff options
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); |