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:
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user