Converting sound trigger v2.2 getModelState to be asynchronous
Test: built android with checkbuild flag
Change-Id: I4c6f2388c93b6e577113fc7f2cd19242628ee50f
Bug-Id: 70206501
diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java
index 007f4bc..dc4f0b7 100644
--- a/core/java/android/hardware/soundtrigger/SoundTrigger.java
+++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java
@@ -611,6 +611,13 @@
* @hide
*/
public static final int RECOGNITION_STATUS_FAILURE = 2;
+ /**
+ * Recognition event was triggered by a getModelState request, not by the
+ * DSP.
+ *
+ * @hide
+ */
+ public static final int RECOGNITION_STATUS_GET_STATE_RESPONSE = 3;
/**
* A RecognitionEvent is provided by the
diff --git a/core/java/android/hardware/soundtrigger/SoundTriggerModule.java b/core/java/android/hardware/soundtrigger/SoundTriggerModule.java
index e970747..402c228 100644
--- a/core/java/android/hardware/soundtrigger/SoundTriggerModule.java
+++ b/core/java/android/hardware/soundtrigger/SoundTriggerModule.java
@@ -133,12 +133,21 @@
public native int stopRecognition(int soundModelHandle);
/**
- * Get the current state of a {@link SoundTrigger.SoundModel}
+ * Get the current state of a {@link SoundTrigger.SoundModel}.
+ * The state will be returned asynchronously as a {@link SoundTrigger#RecognitionEvent}
+ * in the callback registered in the {@link SoundTrigger.startRecognition} method.
* @param soundModelHandle The sound model handle indicating which model's state to return
- * @return - {@link SoundTrigger#RecognitionEvent} in case of success
- * - null in case of an error or if not supported
+ * @return - {@link SoundTrigger#STATUS_OK} in case of success
+ * - {@link SoundTrigger#STATUS_ERROR} in case of unspecified error
+ * - {@link SoundTrigger#STATUS_PERMISSION_DENIED} if the caller does not have
+ * system permission
+ * - {@link SoundTrigger#STATUS_NO_INIT} if the native service cannot be reached
+ * - {@link SoundTrigger#STATUS_BAD_VALUE} if the sound model handle is invalid
+ * - {@link SoundTrigger#STATUS_DEAD_OBJECT} if the binder transaction to the native
+ * service fails
+ * - {@link SoundTrigger#STATUS_INVALID_OPERATION} if the call is out of sequence
*/
- public native SoundTrigger.RecognitionEvent getModelState(int soundModelHandle);
+ public native int getModelState(int soundModelHandle);
private class NativeEventHandlerDelegate {
private final Handler mHandler;
diff --git a/core/java/com/android/internal/app/ISoundTriggerService.aidl b/core/java/com/android/internal/app/ISoundTriggerService.aidl
index c0c689c..764c0cf 100644
--- a/core/java/com/android/internal/app/ISoundTriggerService.aidl
+++ b/core/java/com/android/internal/app/ISoundTriggerService.aidl
@@ -53,5 +53,5 @@
/** For both ...Intent and ...Service based usage */
boolean isRecognitionActive(in ParcelUuid parcelUuid);
- SoundTrigger.RecognitionEvent getModelState(in ParcelUuid parcelUuid);
+ int getModelState(in ParcelUuid soundModelId);
}
diff --git a/core/jni/android_hardware_SoundTrigger.cpp b/core/jni/android_hardware_SoundTrigger.cpp
index b417a56..98bc735 100644
--- a/core/jni/android_hardware_SoundTrigger.cpp
+++ b/core/jni/android_hardware_SoundTrigger.cpp
@@ -788,61 +788,18 @@
return status;
}
-static jobject
+static jint
android_hardware_SoundTrigger_getModelState(JNIEnv *env, jobject thiz,
jint jHandle)
{
+ jint status = SOUNDTRIGGER_STATUS_OK;
ALOGV("getModelState");
sp<SoundTrigger> module = getSoundTrigger(env, thiz);
if (module == NULL) {
- return NULL;
+ return SOUNDTRIGGER_STATUS_ERROR;
}
- sp<IMemory> memory;
- jint status = module->getModelState(jHandle, memory);
- if (status != 0 || memory == NULL) {
- ALOGW("getModelState, failed to get model state, status: %d", status);
- return NULL;
- }
- struct sound_trigger_recognition_event* event =
- (struct sound_trigger_recognition_event *)memory->pointer();
- if (event == NULL) {
- return NULL;
- }
- if (event->type != SOUND_MODEL_TYPE_GENERIC) {
- ALOGW("getModelState, unsupported model type: %d", event->type);
- return NULL;
- }
-
- jbyteArray jData = NULL;
- if (event->data_size) {
- jData = env->NewByteArray(event->data_size);
- jbyte *nData = env->GetByteArrayElements(jData, NULL);
- memcpy(nData, (char *)event + event->data_offset, event->data_size);
- env->ReleaseByteArrayElements(jData, nData, 0);
- }
-
- jobject jAudioFormat = NULL;
- if (event->trigger_in_data || event->capture_available) {
- jAudioFormat = env->NewObject(gAudioFormatClass,
- gAudioFormatCstor,
- audioFormatFromNative(event->audio_config.format),
- event->audio_config.sample_rate,
- inChannelMaskFromNative(event->audio_config.channel_mask));
-
- }
- jobject jEvent = NULL;
- jEvent = env->NewObject(gGenericRecognitionEventClass, gGenericRecognitionEventCstor,
- event->status, event->model, event->capture_available,
- event->capture_session, event->capture_delay_ms,
- event->capture_preamble_ms, event->trigger_in_data,
- jAudioFormat, jData);
- if (jAudioFormat != NULL) {
- env->DeleteLocalRef(jAudioFormat);
- }
- if (jData != NULL) {
- env->DeleteLocalRef(jData);
- }
- return jEvent;
+ status = module->getModelState(jHandle);
+ return status;
}
static const JNINativeMethod gMethods[] = {
@@ -875,7 +832,7 @@
"(I)I",
(void *)android_hardware_SoundTrigger_stopRecognition},
{"getModelState",
- "(I)Landroid/hardware/soundtrigger/SoundTrigger$RecognitionEvent;",
+ "(I)I",
(void *)android_hardware_SoundTrigger_getModelState},
};