diff --git a/core/java/android/hardware/soundtrigger/ConversionUtil.java b/core/java/android/hardware/soundtrigger/ConversionUtil.java index 425218a63cf79..c4d123ca4382c 100644 --- a/core/java/android/hardware/soundtrigger/ConversionUtil.java +++ b/core/java/android/hardware/soundtrigger/ConversionUtil.java @@ -195,11 +195,14 @@ class ConversionUtil { public static SoundTrigger.RecognitionEvent aidl2apiRecognitionEvent( int modelHandle, RecognitionEvent aidlEvent) { + // The API recognition event doesn't allow for a null audio format, even though it doesn't + // always make sense. We thus replace it with a default. + AudioFormat audioFormat = aidl2apiAudioFormatWithDefault(aidlEvent.audioConfig); return new SoundTrigger.GenericRecognitionEvent( aidlEvent.status, modelHandle, aidlEvent.captureAvailable, aidlEvent.captureSession, aidlEvent.captureDelayMs, aidlEvent.capturePreambleMs, aidlEvent.triggerInData, - aidl2apiAudioFormat(aidlEvent.audioConfig), aidlEvent.data); + audioFormat, aidlEvent.data); } public static SoundTrigger.RecognitionEvent aidl2apiPhraseRecognitionEvent( @@ -210,11 +213,14 @@ class ConversionUtil { for (int i = 0; i < aidlEvent.phraseExtras.length; ++i) { apiExtras[i] = aidl2apiPhraseRecognitionExtra(aidlEvent.phraseExtras[i]); } + // The API recognition event doesn't allow for a null audio format, even though it doesn't + // always make sense. We thus replace it with a default. + AudioFormat audioFormat = aidl2apiAudioFormatWithDefault(aidlEvent.common.audioConfig); return new SoundTrigger.KeyphraseRecognitionEvent(aidlEvent.common.status, modelHandle, aidlEvent.common.captureAvailable, aidlEvent.common.captureSession, aidlEvent.common.captureDelayMs, aidlEvent.common.capturePreambleMs, aidlEvent.common.triggerInData, - aidl2apiAudioFormat(aidlEvent.common.audioConfig), aidlEvent.common.data, + audioFormat, aidlEvent.common.data, apiExtras); } @@ -226,6 +232,14 @@ class ConversionUtil { return apiBuilder.build(); } + // Same as above, but in case of a null input returns a non-null valid output. + public static AudioFormat aidl2apiAudioFormatWithDefault(@Nullable AudioConfig audioConfig) { + if (audioConfig != null) { + return aidl2apiAudioFormat(audioConfig); + } + return new AudioFormat.Builder().build(); + } + public static int aidl2apiEncoding(int aidlFormat) { switch (aidlFormat) { case android.media.audio.common.AudioFormat.PCM diff --git a/core/java/android/hardware/soundtrigger/SoundTriggerModule.java b/core/java/android/hardware/soundtrigger/SoundTriggerModule.java index c1df5b6d2e7e4..a2a15b30d5787 100644 --- a/core/java/android/hardware/soundtrigger/SoundTriggerModule.java +++ b/core/java/android/hardware/soundtrigger/SoundTriggerModule.java @@ -303,7 +303,7 @@ public class SoundTriggerModule { (SoundTrigger.RecognitionEvent) msg.obj); break; case EVENT_SERVICE_STATE_CHANGE: - listener.onServiceStateChange(msg.arg1); + listener.onServiceStateChange((int) msg.obj); break; case EVENT_SERVICE_DIED: listener.onServiceDied(); diff --git a/media/java/android/media/soundtrigger_middleware/RecognitionEvent.aidl b/media/java/android/media/soundtrigger_middleware/RecognitionEvent.aidl index de4d060ce4849..a237ec1aa3b31 100644 --- a/media/java/android/media/soundtrigger_middleware/RecognitionEvent.aidl +++ b/media/java/android/media/soundtrigger_middleware/RecognitionEvent.aidl @@ -43,9 +43,9 @@ parcelable RecognitionEvent { boolean triggerInData; /** * Audio format of either the trigger in event data or to use for capture of the rest of the - * utterance. + * utterance. May be null when no audio is available for this event type. */ - AudioConfig audioConfig; + @nullable AudioConfig audioConfig; /** Additional data. */ byte[] data; } diff --git a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java index 2f963b7e6b351..522e5e1892328 100644 --- a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java +++ b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java @@ -20,8 +20,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback; import android.hardware.soundtrigger.V2_2.ISoundTriggerHw; -import android.media.audio.common.AudioConfig; -import android.media.audio.common.AudioOffloadInfo; import android.media.soundtrigger_middleware.ISoundTriggerCallback; import android.media.soundtrigger_middleware.ISoundTriggerModule; import android.media.soundtrigger_middleware.ModelParameterRange; @@ -30,6 +28,7 @@ import android.media.soundtrigger_middleware.PhraseRecognitionExtra; import android.media.soundtrigger_middleware.PhraseSoundModel; import android.media.soundtrigger_middleware.RecognitionConfig; import android.media.soundtrigger_middleware.RecognitionEvent; +import android.media.soundtrigger_middleware.RecognitionStatus; import android.media.soundtrigger_middleware.SoundModel; import android.media.soundtrigger_middleware.SoundModelType; import android.media.soundtrigger_middleware.SoundTriggerModuleProperties; @@ -579,7 +578,7 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient { @NonNull ISoundTriggerHwCallback.RecognitionEvent recognitionEvent, int cookie) { synchronized (SoundTriggerModule.this) { - android.media.soundtrigger_middleware.RecognitionEvent aidlEvent = + RecognitionEvent aidlEvent = ConversionUtil.hidl2aidlRecognitionEvent(recognitionEvent); aidlEvent.captureSession = mSession.mSessionHandle; try { @@ -589,8 +588,7 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient { // In any case, client callbacks are considered best effort. Log.e(TAG, "Client callback execption.", e); } - if (aidlEvent.status - != android.media.soundtrigger_middleware.RecognitionStatus.FORCED) { + if (aidlEvent.status != RecognitionStatus.FORCED) { setState(ModelState.LOADED); } } @@ -601,7 +599,7 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient { @NonNull ISoundTriggerHwCallback.PhraseRecognitionEvent phraseRecognitionEvent, int cookie) { synchronized (SoundTriggerModule.this) { - android.media.soundtrigger_middleware.PhraseRecognitionEvent aidlEvent = + PhraseRecognitionEvent aidlEvent = ConversionUtil.hidl2aidlPhraseRecognitionEvent(phraseRecognitionEvent); aidlEvent.common.captureSession = mSession.mSessionHandle; try { @@ -611,8 +609,7 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient { // In any case, client callbacks are considered best effort. Log.e(TAG, "Client callback execption.", e); } - if (aidlEvent.common.status - != android.media.soundtrigger_middleware.RecognitionStatus.FORCED) { + if (aidlEvent.common.status != RecognitionStatus.FORCED) { setState(ModelState.LOADED); } } @@ -623,15 +620,13 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient { /** * Creates a default-initialized recognition event. * - * Object fields are default constructed. - * Array fields are initialized to 0 length. + * Non-nullable object fields are default constructed. + * Non-nullable array fields are initialized to 0 length. * * @return The event. */ private static RecognitionEvent newEmptyRecognitionEvent() { RecognitionEvent result = new RecognitionEvent(); - result.audioConfig = new AudioConfig(); - result.audioConfig.offloadInfo = new AudioOffloadInfo(); result.data = new byte[0]; return result; } @@ -639,8 +634,8 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient { /** * Creates a default-initialized phrase recognition event. * - * Object fields are default constructed. - * Array fields are initialized to 0 length. + * Non-nullable object fields are default constructed. + * Non-nullable array fields are initialized to 0 length. * * @return The event. */