Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a70a0155 authored by Ziyang Cheng's avatar Ziyang Cheng
Browse files

Deprecate the constructor of RecognitionConfig.

Bug: 368042125
Bug: 370580176
Flag: android.media.soundtrigger.manager_api
Test: atest SoundTriggerTest.
Test: Successfully load the generic sound model and verify
      sound trigger event could be triggered correctly on
      Pixel Watch devices.
Change-Id: I05499a7c99864c18414cbcf4827ab8bd7ad9bdaf
parent ffda9a50
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -1889,8 +1889,7 @@ package android.hardware.soundtrigger {
  }

  @FlaggedApi("android.media.soundtrigger.manager_api") public static final class SoundTrigger.RecognitionConfig implements android.os.Parcelable {
    ctor @Deprecated public SoundTrigger.RecognitionConfig(boolean, boolean, @Nullable android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra[], @Nullable byte[], int);
    ctor public SoundTrigger.RecognitionConfig(boolean, boolean, @Nullable android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra[], @Nullable byte[]);
    ctor @Deprecated public SoundTrigger.RecognitionConfig(boolean, boolean, @Nullable android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra[], @Nullable byte[]);
  }

  public static class SoundTrigger.RecognitionEvent {
+11 −9
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import android.os.SharedMemory;
import android.system.ErrnoException;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;
import java.util.UUID;
@@ -170,17 +171,18 @@ public class ConversionUtil {

    public static SoundTrigger.RecognitionConfig aidl2apiRecognitionConfig(
            RecognitionConfig aidlConfig) {
        var keyphrases =
            new SoundTrigger.KeyphraseRecognitionExtra[aidlConfig.phraseRecognitionExtras.length];
        int i = 0;
        var keyphrases = new ArrayList<SoundTrigger.KeyphraseRecognitionExtra>(
            aidlConfig.phraseRecognitionExtras.length);
        for (var extras : aidlConfig.phraseRecognitionExtras) {
            keyphrases[i++] = aidl2apiPhraseRecognitionExtra(extras);
        }
        return new SoundTrigger.RecognitionConfig(aidlConfig.captureRequested,
                false /** allowMultipleTriggers **/,
                keyphrases,
                Arrays.copyOf(aidlConfig.data, aidlConfig.data.length),
                aidl2apiAudioCapabilities(aidlConfig.audioCapabilities));
            keyphrases.add(aidl2apiPhraseRecognitionExtra(extras));
        }
        return new SoundTrigger.RecognitionConfig.Builder()
            .setCaptureRequested(aidlConfig.captureRequested)
            .setAllowMultipleTriggers(false)
            .setKeyphrases(keyphrases)
            .setData(Arrays.copyOf(aidlConfig.data, aidlConfig.data.length))
            .setAudioCapabilities(aidl2apiAudioCapabilities(aidlConfig.audioCapabilities))
            .build();
    }

    public static PhraseRecognitionExtra api2aidlPhraseRecognitionExtra(
+16 −17
Original line number Diff line number Diff line
@@ -1529,8 +1529,6 @@ public class SoundTrigger {
         * config that can be used by
         * {@link SoundTriggerModule#startRecognition(int, RecognitionConfig)}
         *
         * @deprecated should use builder-based constructor instead.
         *             TODO(b/368042125): remove this method.
         * @param captureRequested Whether the DSP should capture the trigger sound.
         * @param allowMultipleTriggers Whether the service should restart listening after the DSP
         *                              triggers.
@@ -1538,15 +1536,10 @@ public class SoundTrigger {
         * @param data Opaque data for use by system applications who know about voice engine
         *             internals, typically during enrollment.
         * @param audioCapabilities Bit field encoding of the AudioCapabilities.
         *
         * @hide
         */
        @Deprecated
        @SuppressWarnings("Todo")
        @TestApi
        public RecognitionConfig(boolean captureRequested, boolean allowMultipleTriggers,
                @SuppressLint("ArrayReturn") @Nullable KeyphraseRecognitionExtra[] keyphrases,
                @Nullable byte[] data, int audioCapabilities) {
        private RecognitionConfig(boolean captureRequested, boolean allowMultipleTriggers,
                @Nullable KeyphraseRecognitionExtra[] keyphrases, @Nullable byte[] data,
                int audioCapabilities) {
            this.mCaptureRequested = captureRequested;
            this.mAllowMultipleTriggers = allowMultipleTriggers;
            this.mKeyphrases = keyphrases != null ? keyphrases : new KeyphraseRecognitionExtra[0];
@@ -1558,6 +1551,7 @@ public class SoundTrigger {
         * Constructor for {@link RecognitionConfig} without audioCapabilities. The
         * audioCapabilities is set to 0.
         *
         * @deprecated Use {@link Builder} instead.
         * @param captureRequested Whether the DSP should capture the trigger sound.
         * @param allowMultipleTriggers Whether the service should restart listening after the DSP
         *                              triggers.
@@ -1567,10 +1561,10 @@ public class SoundTrigger {
         * @hide
         */
        @UnsupportedAppUsage
        @Deprecated
        @TestApi
        public RecognitionConfig(boolean captureRequested, boolean allowMultipleTriggers,
                @SuppressLint("ArrayReturn") @Nullable KeyphraseRecognitionExtra[] keyphrases,
                @Nullable byte[] data) {
                @Nullable KeyphraseRecognitionExtra[] keyphrases, @Nullable byte[] data) {
            this(captureRequested, allowMultipleTriggers, keyphrases, data, 0);
        }

@@ -1718,7 +1712,7 @@ public class SoundTrigger {

            /**
             * Sets capture requested state.
             * @param captureRequested The new requested state.
             * @param captureRequested Whether the DSP should capture the trigger sound.
             * @return the same Builder instance.
             */
            public @NonNull Builder setCaptureRequested(boolean captureRequested) {
@@ -1728,7 +1722,8 @@ public class SoundTrigger {

            /**
             * Sets allow multiple triggers state.
             * @param allowMultipleTriggers The new allow multiple triggers state.
             * @param allowMultipleTriggers Whether the service should restart listening after the
             *                              DSP triggers.
             * @return the same Builder instance.
             */
            public @NonNull Builder setAllowMultipleTriggers(boolean allowMultipleTriggers) {
@@ -1738,7 +1733,8 @@ public class SoundTrigger {

            /**
             * Sets the keyphrases field.
             * @param keyphrases The new keyphrases.
             * @param keyphrases The list of keyphrase specific data associated with this
             *                   recognition session.
             * @return the same Builder instance.
             */
            public @NonNull Builder setKeyphrases(
@@ -1749,7 +1745,9 @@ public class SoundTrigger {

            /**
             * Sets the data field.
             * @param data The new data.
             * @param data Opaque data provided to the DSP associated with this recognition session,
             *             which is used by system applications who know about voice engine
             *             internals, typically during enrollment.
             * @return the same Builder instance.
             */
            public @NonNull Builder setData(@Nullable byte[] data) {
@@ -1759,7 +1757,8 @@ public class SoundTrigger {

            /**
             * Sets the audio capabilities field.
             * @param audioCapabilities The new audio capabilities.
             * @param audioCapabilities The bit field encoding of the audio capabilities associated
             *                          with this recognition session.
             * @return the same Builder instance.
             */
            public @NonNull Builder setAudioCapabilities(int audioCapabilities) {
+16 −7
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ import com.android.internal.infra.AndroidFuture;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
@@ -1513,10 +1514,11 @@ public class AlwaysOnHotwordDetector extends AbstractDetector {
                    "Recognition for the given keyphrase is not supported");
        }

        KeyphraseRecognitionExtra[] recognitionExtra = new KeyphraseRecognitionExtra[1];
        List<KeyphraseRecognitionExtra> recognitionExtra =
            new ArrayList<KeyphraseRecognitionExtra>(1);
        // TODO: Do we need to do something about the confidence level here?
        recognitionExtra[0] = new KeyphraseRecognitionExtra(mKeyphraseMetadata.getId(),
                mKeyphraseMetadata.getRecognitionModeFlags(), 0, new ConfidenceLevel[0]);
        recognitionExtra.add(new KeyphraseRecognitionExtra(mKeyphraseMetadata.getId(),
            mKeyphraseMetadata.getRecognitionModeFlags(), 0, new ConfidenceLevel[0]));
        boolean captureTriggerAudio =
                (recognitionFlags&RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO) != 0;
        boolean allowMultipleTriggers =
@@ -1534,9 +1536,16 @@ public class AlwaysOnHotwordDetector extends AbstractDetector {
        int code;
        try {
            code = mSoundTriggerSession.startRecognition(
                    mKeyphraseMetadata.getId(), mLocale.toLanguageTag(), mInternalCallback,
                    new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers,
                            recognitionExtra, data, audioCapabilities),
                mKeyphraseMetadata.getId(),
                mLocale.toLanguageTag(),
                mInternalCallback,
                new RecognitionConfig.Builder()
                    .setCaptureRequested(captureTriggerAudio)
                    .setAllowMultipleTriggers(allowMultipleTriggers)
                    .setKeyphrases(recognitionExtra)
                    .setData(data)
                    .setAudioCapabilities(audioCapabilities)
                    .build(),
                runInBatterySaver);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
+9 −4
Original line number Diff line number Diff line
@@ -323,9 +323,14 @@ public final class SoundTriggerDetector {

        int status;
        try {
            status = mSoundTriggerSession.startRecognition(mSoundModel,
                    mRecognitionCallback, new RecognitionConfig(captureTriggerAudio,
                            allowMultipleTriggers, null, null, audioCapabilities),
            status = mSoundTriggerSession.startRecognition(
                mSoundModel,
                mRecognitionCallback,
                new RecognitionConfig.Builder()
                    .setCaptureRequested(captureTriggerAudio)
                    .setAllowMultipleTriggers(allowMultipleTriggers)
                    .setAudioCapabilities(audioCapabilities)
                    .build(),
                runInBatterySaver);
        } catch (RemoteException e) {
            return false;
Loading