Merge changes Ibf4ecdb4,I1e4adf9f into rvc-dev am: 3917b729a6

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11815381

Change-Id: I0273ba4eca004e7381915e3818566ba9c818f0ec
This commit is contained in:
Ytai Ben-tsvi
2020-06-10 19:38:27 +00:00
committed by Automerger Merge Worker
4 changed files with 28 additions and 19 deletions

View File

@@ -195,11 +195,14 @@ class ConversionUtil {
public static SoundTrigger.RecognitionEvent aidl2apiRecognitionEvent( public static SoundTrigger.RecognitionEvent aidl2apiRecognitionEvent(
int modelHandle, RecognitionEvent aidlEvent) { 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( return new SoundTrigger.GenericRecognitionEvent(
aidlEvent.status, aidlEvent.status,
modelHandle, aidlEvent.captureAvailable, aidlEvent.captureSession, modelHandle, aidlEvent.captureAvailable, aidlEvent.captureSession,
aidlEvent.captureDelayMs, aidlEvent.capturePreambleMs, aidlEvent.triggerInData, aidlEvent.captureDelayMs, aidlEvent.capturePreambleMs, aidlEvent.triggerInData,
aidl2apiAudioFormat(aidlEvent.audioConfig), aidlEvent.data); audioFormat, aidlEvent.data);
} }
public static SoundTrigger.RecognitionEvent aidl2apiPhraseRecognitionEvent( public static SoundTrigger.RecognitionEvent aidl2apiPhraseRecognitionEvent(
@@ -210,11 +213,14 @@ class ConversionUtil {
for (int i = 0; i < aidlEvent.phraseExtras.length; ++i) { for (int i = 0; i < aidlEvent.phraseExtras.length; ++i) {
apiExtras[i] = aidl2apiPhraseRecognitionExtra(aidlEvent.phraseExtras[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, return new SoundTrigger.KeyphraseRecognitionEvent(aidlEvent.common.status, modelHandle,
aidlEvent.common.captureAvailable, aidlEvent.common.captureAvailable,
aidlEvent.common.captureSession, aidlEvent.common.captureDelayMs, aidlEvent.common.captureSession, aidlEvent.common.captureDelayMs,
aidlEvent.common.capturePreambleMs, aidlEvent.common.triggerInData, aidlEvent.common.capturePreambleMs, aidlEvent.common.triggerInData,
aidl2apiAudioFormat(aidlEvent.common.audioConfig), aidlEvent.common.data, audioFormat, aidlEvent.common.data,
apiExtras); apiExtras);
} }
@@ -226,6 +232,14 @@ class ConversionUtil {
return apiBuilder.build(); 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) { public static int aidl2apiEncoding(int aidlFormat) {
switch (aidlFormat) { switch (aidlFormat) {
case android.media.audio.common.AudioFormat.PCM case android.media.audio.common.AudioFormat.PCM

View File

@@ -303,7 +303,7 @@ public class SoundTriggerModule {
(SoundTrigger.RecognitionEvent) msg.obj); (SoundTrigger.RecognitionEvent) msg.obj);
break; break;
case EVENT_SERVICE_STATE_CHANGE: case EVENT_SERVICE_STATE_CHANGE:
listener.onServiceStateChange(msg.arg1); listener.onServiceStateChange((int) msg.obj);
break; break;
case EVENT_SERVICE_DIED: case EVENT_SERVICE_DIED:
listener.onServiceDied(); listener.onServiceDied();

View File

@@ -43,9 +43,9 @@ parcelable RecognitionEvent {
boolean triggerInData; boolean triggerInData;
/** /**
* Audio format of either the trigger in event data or to use for capture of the rest of the * 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. */ /** Additional data. */
byte[] data; byte[] data;
} }

View File

@@ -20,8 +20,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback; import android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback;
import android.hardware.soundtrigger.V2_2.ISoundTriggerHw; 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.ISoundTriggerCallback;
import android.media.soundtrigger_middleware.ISoundTriggerModule; import android.media.soundtrigger_middleware.ISoundTriggerModule;
import android.media.soundtrigger_middleware.ModelParameterRange; 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.PhraseSoundModel;
import android.media.soundtrigger_middleware.RecognitionConfig; import android.media.soundtrigger_middleware.RecognitionConfig;
import android.media.soundtrigger_middleware.RecognitionEvent; import android.media.soundtrigger_middleware.RecognitionEvent;
import android.media.soundtrigger_middleware.RecognitionStatus;
import android.media.soundtrigger_middleware.SoundModel; import android.media.soundtrigger_middleware.SoundModel;
import android.media.soundtrigger_middleware.SoundModelType; import android.media.soundtrigger_middleware.SoundModelType;
import android.media.soundtrigger_middleware.SoundTriggerModuleProperties; import android.media.soundtrigger_middleware.SoundTriggerModuleProperties;
@@ -579,7 +578,7 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient {
@NonNull ISoundTriggerHwCallback.RecognitionEvent recognitionEvent, @NonNull ISoundTriggerHwCallback.RecognitionEvent recognitionEvent,
int cookie) { int cookie) {
synchronized (SoundTriggerModule.this) { synchronized (SoundTriggerModule.this) {
android.media.soundtrigger_middleware.RecognitionEvent aidlEvent = RecognitionEvent aidlEvent =
ConversionUtil.hidl2aidlRecognitionEvent(recognitionEvent); ConversionUtil.hidl2aidlRecognitionEvent(recognitionEvent);
aidlEvent.captureSession = mSession.mSessionHandle; aidlEvent.captureSession = mSession.mSessionHandle;
try { try {
@@ -589,8 +588,7 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient {
// In any case, client callbacks are considered best effort. // In any case, client callbacks are considered best effort.
Log.e(TAG, "Client callback execption.", e); Log.e(TAG, "Client callback execption.", e);
} }
if (aidlEvent.status if (aidlEvent.status != RecognitionStatus.FORCED) {
!= android.media.soundtrigger_middleware.RecognitionStatus.FORCED) {
setState(ModelState.LOADED); setState(ModelState.LOADED);
} }
} }
@@ -601,7 +599,7 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient {
@NonNull ISoundTriggerHwCallback.PhraseRecognitionEvent phraseRecognitionEvent, @NonNull ISoundTriggerHwCallback.PhraseRecognitionEvent phraseRecognitionEvent,
int cookie) { int cookie) {
synchronized (SoundTriggerModule.this) { synchronized (SoundTriggerModule.this) {
android.media.soundtrigger_middleware.PhraseRecognitionEvent aidlEvent = PhraseRecognitionEvent aidlEvent =
ConversionUtil.hidl2aidlPhraseRecognitionEvent(phraseRecognitionEvent); ConversionUtil.hidl2aidlPhraseRecognitionEvent(phraseRecognitionEvent);
aidlEvent.common.captureSession = mSession.mSessionHandle; aidlEvent.common.captureSession = mSession.mSessionHandle;
try { try {
@@ -611,8 +609,7 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient {
// In any case, client callbacks are considered best effort. // In any case, client callbacks are considered best effort.
Log.e(TAG, "Client callback execption.", e); Log.e(TAG, "Client callback execption.", e);
} }
if (aidlEvent.common.status if (aidlEvent.common.status != RecognitionStatus.FORCED) {
!= android.media.soundtrigger_middleware.RecognitionStatus.FORCED) {
setState(ModelState.LOADED); setState(ModelState.LOADED);
} }
} }
@@ -623,15 +620,13 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient {
/** /**
* Creates a default-initialized recognition event. * Creates a default-initialized recognition event.
* *
* Object fields are default constructed. * Non-nullable object fields are default constructed.
* Array fields are initialized to 0 length. * Non-nullable array fields are initialized to 0 length.
* *
* @return The event. * @return The event.
*/ */
private static RecognitionEvent newEmptyRecognitionEvent() { private static RecognitionEvent newEmptyRecognitionEvent() {
RecognitionEvent result = new RecognitionEvent(); RecognitionEvent result = new RecognitionEvent();
result.audioConfig = new AudioConfig();
result.audioConfig.offloadInfo = new AudioOffloadInfo();
result.data = new byte[0]; result.data = new byte[0];
return result; return result;
} }
@@ -639,8 +634,8 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient {
/** /**
* Creates a default-initialized phrase recognition event. * Creates a default-initialized phrase recognition event.
* *
* Object fields are default constructed. * Non-nullable object fields are default constructed.
* Array fields are initialized to 0 length. * Non-nullable array fields are initialized to 0 length.
* *
* @return The event. * @return The event.
*/ */