Merge changes Ibf4ecdb4,I1e4adf9f into rvc-dev
* changes: Correctly propagate service state change Support null audio format in recognition event
This commit is contained in:
committed by
Android (Google) Code Review
commit
3917b729a6
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user