From 8ed1a8b6aab815bc8851116b4c972724c36600fc Mon Sep 17 00:00:00 2001 From: Ytai Ben-Tsvi Date: Thu, 4 Jun 2020 13:11:54 -0700 Subject: [PATCH] Correctly initialize recognition events upon abort Aborting a recognition as result of capture being enabled for devices not supporting concurrent capture is the only case of creating those events that is *not* conversion of the HAL events. Unlike their HIDL counterparts, object and array fields of AIDL parcelables are NOT default initialized and so are not considered valid by our conventions. This change make sure those events are valid by default initializing all the fields and setting the model type correctly. Fixes: 157496890 Test: Manual verification of existing sound trigger cases against regression. Change-Id: I4043997d6d75f1fcb8525dcbd051b13ae2bf1d1b --- .../SoundTriggerModule.java | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) 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 49c7819058982..2f963b7e6b351 100644 --- a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java +++ b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java @@ -20,11 +20,16 @@ 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; +import android.media.soundtrigger_middleware.PhraseRecognitionEvent; +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.SoundModel; import android.media.soundtrigger_middleware.SoundModelType; import android.media.soundtrigger_middleware.SoundTriggerModuleProperties; @@ -540,20 +545,20 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient { switch (mModelType) { case SoundModelType.GENERIC: { android.media.soundtrigger_middleware.RecognitionEvent event = - new android.media.soundtrigger_middleware.RecognitionEvent(); + newEmptyRecognitionEvent(); event.status = android.media.soundtrigger_middleware.RecognitionStatus.ABORTED; + event.type = SoundModelType.GENERIC; mCallback.onRecognition(mHandle, event); } break; case SoundModelType.KEYPHRASE: { android.media.soundtrigger_middleware.PhraseRecognitionEvent event = - new android.media.soundtrigger_middleware.PhraseRecognitionEvent(); - event.common = - new android.media.soundtrigger_middleware.RecognitionEvent(); + newEmptyPhraseRecognitionEvent(); event.common.status = android.media.soundtrigger_middleware.RecognitionStatus.ABORTED; + event.common.type = SoundModelType.KEYPHRASE; mCallback.onPhraseRecognition(mHandle, event); } break; @@ -614,4 +619,35 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient { } } } + + /** + * Creates a default-initialized recognition event. + * + * Object fields are default constructed. + * 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; + } + + /** + * Creates a default-initialized phrase recognition event. + * + * Object fields are default constructed. + * Array fields are initialized to 0 length. + * + * @return The event. + */ + private static PhraseRecognitionEvent newEmptyPhraseRecognitionEvent() { + PhraseRecognitionEvent result = new PhraseRecognitionEvent(); + result.common = newEmptyRecognitionEvent(); + result.phraseExtras = new PhraseRecognitionExtra[0]; + return result; + } }