From 299efbe1fbdca7bf2c852b67df3da361930f3ef2 Mon Sep 17 00:00:00 2001 From: Sandeep Siddhartha Date: Wed, 30 Jul 2014 13:40:56 -0700 Subject: [PATCH] Don't unload sound model in start recognition unless the model changes This helps in start -> detected -> start again scenarios Change-Id: I6d8d55e469e0623b9eb07595df8897ad4942aa11 --- .../voiceinteraction/SoundTriggerHelper.java | 59 ++++++++++++------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java index 15ec62938444d..0eac1c4d4e898 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java @@ -31,6 +31,7 @@ import android.util.Slog; import android.util.SparseArray; import java.util.ArrayList; +import java.util.UUID; /** * Helper for {@link SoundTrigger} APIs. @@ -63,6 +64,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { private final SparseArray mActiveListeners; private int mCurrentSoundModelHandle = INVALID_SOUND_MODEL_HANDLE; + private UUID mCurrentSoundModelUuid = null; SoundTriggerHelper() { ArrayList modules = new ArrayList<>(); @@ -109,18 +111,25 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { + ", recognitionConfig=" + recognitionConfig); Slog.d(TAG, "moduleProperties=" + moduleProperties); Slog.d(TAG, "# of current listeners=" + mActiveListeners.size()); - Slog.d(TAG, "mCurrentSoundModelHandle=" + mCurrentSoundModelHandle); + Slog.d(TAG, "current SoundModel handle=" + mCurrentSoundModelHandle); + Slog.d(TAG, "current SoundModel UUID=" + + (mCurrentSoundModelUuid == null ? null : mCurrentSoundModelUuid)); } if (moduleProperties == null || mModule == null) { Slog.w(TAG, "Attempting startRecognition without the capability"); return STATUS_ERROR; } - if (mCurrentSoundModelHandle != INVALID_SOUND_MODEL_HANDLE) { + if (mCurrentSoundModelHandle != INVALID_SOUND_MODEL_HANDLE + && !soundModel.uuid.equals(mCurrentSoundModelUuid)) { Slog.w(TAG, "Unloading previous sound model"); - // TODO: Inspect the return codes here. - mModule.unloadSoundModel(mCurrentSoundModelHandle); + int status = mModule.unloadSoundModel(mCurrentSoundModelHandle); + if (status != SoundTrigger.STATUS_OK) { + Slog.w(TAG, "unloadSoundModel call failed with " + status); + return status; + } mCurrentSoundModelHandle = INVALID_SOUND_MODEL_HANDLE; + mCurrentSoundModelUuid = null; } // If the previous recognition was by a different listener, @@ -136,26 +145,35 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { mActiveListeners.remove(keyphraseId); } - int[] handle = new int[] { INVALID_SOUND_MODEL_HANDLE }; - int status = mModule.loadSoundModel(soundModel, handle); - if (status != SoundTrigger.STATUS_OK) { - Slog.w(TAG, "loadSoundModel call failed with " + status); - return STATUS_ERROR; - } - if (handle[0] == INVALID_SOUND_MODEL_HANDLE) { - Slog.w(TAG, "loadSoundModel call returned invalid sound model handle"); - return STATUS_ERROR; + // Load the sound model if the current one is null. + int soundModelHandle = mCurrentSoundModelHandle; + if (mCurrentSoundModelHandle == INVALID_SOUND_MODEL_HANDLE + || mCurrentSoundModelUuid == null) { + int[] handle = new int[] { INVALID_SOUND_MODEL_HANDLE }; + int status = mModule.loadSoundModel(soundModel, handle); + if (status != SoundTrigger.STATUS_OK) { + Slog.w(TAG, "loadSoundModel call failed with " + status); + return status; + } + if (handle[0] == INVALID_SOUND_MODEL_HANDLE) { + Slog.w(TAG, "loadSoundModel call returned invalid sound model handle"); + return STATUS_ERROR; + } + soundModelHandle = handle[0]; + } else { + if (DBG) Slog.d(TAG, "Reusing previously loaded sound model"); } // Start the recognition. - status = mModule.startRecognition(handle[0], recognitionConfig); + int status = mModule.startRecognition(soundModelHandle, recognitionConfig); if (status != SoundTrigger.STATUS_OK) { Slog.w(TAG, "startRecognition failed with " + status); - return STATUS_ERROR; + return status; } // Everything went well! - mCurrentSoundModelHandle = handle[0]; + mCurrentSoundModelHandle = soundModelHandle; + mCurrentSoundModelUuid = soundModel.uuid; // Register the new listener. This replaces the old one. // There can only be a maximum of one active listener for a keyphrase // at any given time. @@ -194,14 +212,12 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { Slog.w(TAG, "Attempting stopRecognition without a successful startRecognition"); return STATUS_ERROR; } else if (currentListener.asBinder() != listener.asBinder()) { - // TODO: Figure out if this should match the listener that was passed in during - // startRecognition, or should we allow a different listener to stop the recognition, - // in which case we don't need to pass in a listener here. + // We don't allow a different listener to stop the recognition than the one + // that started it. Slog.w(TAG, "Attempting stopRecognition for another recognition"); return STATUS_ERROR; } else { // Stop recognition if it's the current one, ignore otherwise. - // TODO: Inspect the return codes here. int status = mModule.stopRecognition(mCurrentSoundModelHandle); if (status != SoundTrigger.STATUS_OK) { Slog.w(TAG, "stopRecognition call failed with " + status); @@ -214,6 +230,8 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } mCurrentSoundModelHandle = INVALID_SOUND_MODEL_HANDLE; + mCurrentSoundModelUuid = null; + mActiveListeners.remove(keyphraseId); return STATUS_OK; } @@ -285,6 +303,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { Slog.w(TAG, "RemoteException in onDetectionStopped"); } mCurrentSoundModelHandle = INVALID_SOUND_MODEL_HANDLE; + mCurrentSoundModelUuid = null; // Remove all listeners. mActiveListeners.clear(); }