Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0bf1666c authored by Michael Dooley's avatar Michael Dooley Committed by Android (Google) Code Review
Browse files

Merge changes from topic "getmodelstate-redo"

* changes:
  Rolling forward with indentation fix.
  Revert "Revert "Adding getModelState API to sound trigger""
parents 366d890f 73486ddb
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.annotation.UnsupportedAppUsage;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

import java.lang.ref.WeakReference;

/**
@@ -131,6 +132,14 @@ public class SoundTriggerModule {
    @UnsupportedAppUsage
    public native int stopRecognition(int soundModelHandle);

    /**
     * Get the current state of a {@link SoundTrigger.SoundModel}
     * @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
     */
    public native SoundTrigger.RecognitionEvent getModelState(int soundModelHandle);

    private class NativeEventHandlerDelegate {
        private final Handler mHandler;

@@ -207,4 +216,3 @@ public class SoundTriggerModule {
        }
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -52,4 +52,6 @@ interface ISoundTriggerService {

    /** For both ...Intent and ...Service based usage */
    boolean isRecognitionActive(in ParcelUuid parcelUuid);

    SoundTrigger.RecognitionEvent getModelState(in ParcelUuid parcelUuid);
}
+60 −0
Original line number Diff line number Diff line
@@ -788,6 +788,63 @@ android_hardware_SoundTrigger_stopRecognition(JNIEnv *env, jobject thiz,
    return status;
}

static jobject
android_hardware_SoundTrigger_getModelState(JNIEnv *env, jobject thiz,
                                            jint jHandle)
{
    ALOGV("getModelState");
    sp<SoundTrigger> module = getSoundTrigger(env, thiz);
    if (module == NULL) {
        return NULL;
    }
    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;
}

static const JNINativeMethod gMethods[] = {
    {"listModules",
        "(Ljava/util/ArrayList;)I",
@@ -817,6 +874,9 @@ static const JNINativeMethod gModuleMethods[] = {
    {"stopRecognition",
        "(I)I",
        (void *)android_hardware_SoundTrigger_stopRecognition},
    {"getModelState",
        "(I)Landroid/hardware/soundtrigger/SoundTrigger$RecognitionEvent;",
        (void *)android_hardware_SoundTrigger_getModelState},
};

int register_android_hardware_SoundTrigger(JNIEnv *env)
+18 −0
Original line number Diff line number Diff line
@@ -365,4 +365,22 @@ public final class SoundTriggerManager {
            return Integer.MAX_VALUE;
        }
    }

    /**
     * Synchronously get state of the indicated model.  The model state is returned as
     * a recognition event, or null if the model is not loaded, or if this method
     * is not supported.
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER)
    public SoundTrigger.RecognitionEvent getModelState(UUID soundModelId) {
        if (soundModelId == null) {
            return null;
        }
        try {
            return mSoundTriggerService.getModelState(new ParcelUuid(soundModelId));
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }
}
+34 −0
Original line number Diff line number Diff line
@@ -566,6 +566,40 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
        }
    }

    SoundTrigger.RecognitionEvent getGenericModelState(UUID modelId) {
        synchronized (mLock) {
            MetricsLogger.count(mContext, "sth_get_generic_model_state", 1);
            if (modelId == null || mModule == null) {
                return null;
            }
            ModelData modelData = mModelDataMap.get(modelId);
            if (modelData == null || !modelData.isGenericModel()) {
                Slog.w(TAG, "GetGenericModelState error: Invalid generic model id:" +
                        modelId);
                return null;
            }
            if (!modelData.isModelLoaded()) {
                Slog.i(TAG, "GetGenericModelState: Given generic model is not loaded:" + modelId);
                return null;
            }
            if (!modelData.isModelStarted()) {
                Slog.i(TAG, "GetGenericModelState: Given generic model is not started:" + modelId);
                return null;
            }

            SoundTrigger.RecognitionEvent ret = mModule.getModelState(modelData.getHandle());
            if (ret == null) {
                Slog.w(TAG, "GetGenericModelState() call failed");
            }
            return ret;
        }
    }

    SoundTrigger.RecognitionEvent getKeyphraseModelState(UUID modelId) {
        Slog.w(TAG, "GetKeyphraseModelState error: Not implemented");
        return null;
    }

    //---- SoundTrigger.StatusListener methods
    @Override
    public void onRecognition(RecognitionEvent event) {
Loading