Loading core/java/android/hardware/soundtrigger/SoundTrigger.java +59 −0 Original line number Diff line number Diff line Loading @@ -211,6 +211,43 @@ public class SoundTrigger { this.type = type; this.data = data; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + Arrays.hashCode(data); result = prime * result + type; result = prime * result + ((uuid == null) ? 0 : uuid.hashCode()); result = prime * result + ((vendorUuid == null) ? 0 : vendorUuid.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof SoundModel)) return false; SoundModel other = (SoundModel) obj; if (!Arrays.equals(data, other.data)) return false; if (type != other.type) return false; if (uuid == null) { if (other.uuid != null) return false; } else if (!uuid.equals(other.uuid)) return false; if (vendorUuid == null) { if (other.vendorUuid != null) return false; } else if (!vendorUuid.equals(other.vendorUuid)) return false; return true; } } /***************************************************************************** Loading Loading @@ -395,6 +432,28 @@ public class SoundTrigger { + ", uuid=" + uuid + ", vendorUuid=" + vendorUuid + ", type=" + type + ", data=" + (data == null ? 0 : data.length) + "]"; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + Arrays.hashCode(keyphrases); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (!(obj instanceof KeyphraseSoundModel)) return false; KeyphraseSoundModel other = (KeyphraseSoundModel) obj; if (!Arrays.equals(keyphrases, other.keyphrases)) return false; return true; } } /** Loading services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java +18 −29 Original line number Diff line number Diff line Loading @@ -40,7 +40,6 @@ import android.util.Slog; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.UUID; /** * Helper for {@link SoundTrigger} APIs. Loading Loading @@ -78,7 +77,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { private IRecognitionStatusCallback mActiveListener; private int mKeyphraseId = INVALID_VALUE; private int mCurrentSoundModelHandle = INVALID_VALUE; private UUID mCurrentSoundModelUuid = null; private KeyphraseSoundModel mCurrentSoundModel = null; // FIXME: Ideally this should not be stored if allowMultipleTriggers happens at a lower layer. private RecognitionConfig mRecognitionConfig = null; private boolean mRequested = false; Loading Loading @@ -134,7 +133,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { + (mActiveListener == null ? "null" : mActiveListener.asBinder())); Slog.d(TAG, "current SoundModel handle=" + mCurrentSoundModelHandle); Slog.d(TAG, "current SoundModel UUID=" + (mCurrentSoundModelUuid == null ? null : mCurrentSoundModelUuid)); + (mCurrentSoundModel == null ? null : mCurrentSoundModel.uuid)); } if (!mStarted) { Loading Loading @@ -166,20 +165,16 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } // Unload the previous model if the current one isn't invalid // and, it's not the same as the new one, or we are already started // if we are already started, we can get multiple calls to start // if the underlying sound model changes, in which case we should unload and reload. // The model reuse helps only in cases when we trigger and stop internally // without a start recognition call. // and, it's not the same as the new one. // This helps use cache and reuse the model and just start/stop it when necessary. if (mCurrentSoundModelHandle != INVALID_VALUE && (!soundModel.uuid.equals(mCurrentSoundModelUuid) || mStarted)) { && !soundModel.equals(mCurrentSoundModel)) { Slog.w(TAG, "Unloading previous sound model"); int status = mModule.unloadSoundModel(mCurrentSoundModelHandle); if (status != SoundTrigger.STATUS_OK) { Slog.w(TAG, "unloadSoundModel call failed with " + status); } mCurrentSoundModelHandle = INVALID_VALUE; mCurrentSoundModelUuid = null; internalClearSoundModelLocked(); mStarted = false; } Loading @@ -198,7 +193,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { // Load the sound model if the current one is null. int soundModelHandle = mCurrentSoundModelHandle; if (mCurrentSoundModelHandle == INVALID_VALUE || mCurrentSoundModelUuid == null) { || mCurrentSoundModel == null) { int[] handle = new int[] { INVALID_VALUE }; int status = mModule.loadSoundModel(soundModel, handle); if (status != SoundTrigger.STATUS_OK) { Loading @@ -218,7 +213,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { mRequested = true; mKeyphraseId = keyphraseId; mCurrentSoundModelHandle = soundModelHandle; mCurrentSoundModelUuid = soundModel.uuid; mCurrentSoundModel = soundModel; mRecognitionConfig = recognitionConfig; // Register the new listener. This replaces the old one. // There can only be a maximum of one active listener at any given time. Loading Loading @@ -275,14 +270,9 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { return status; } status = mModule.unloadSoundModel(mCurrentSoundModelHandle); if (status != SoundTrigger.STATUS_OK) { Slog.w(TAG, "unloadSoundModel call failed with " + status); } // Clear the internal state once the recognition has been stopped. // Unload sound model call may fail in scenarios, and we'd still want // to reload the sound model. // We leave the sound model loaded but not started, this helps us when we start // back. // Also clear the internal state once the recognition has been stopped. internalClearStateLocked(); return status; } Loading @@ -303,11 +293,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { mRequested = false; int status = updateRecognitionLocked(false /* don't notify for synchronous calls */); status = mModule.unloadSoundModel(mCurrentSoundModelHandle); if (status != SoundTrigger.STATUS_OK) { Slog.w(TAG, "unloadSoundModel call failed with " + status); } internalClearStateLocked(); } } Loading Loading @@ -456,6 +441,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } catch (RemoteException e) { Slog.w(TAG, "RemoteException in onError", e); } finally { internalClearSoundModelLocked(); internalClearStateLocked(); if (mModule != null) { mModule.detach(); Loading Loading @@ -535,8 +521,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { mRequested = false; mKeyphraseId = INVALID_VALUE; mCurrentSoundModelHandle = INVALID_VALUE; mCurrentSoundModelUuid = null; mRecognitionConfig = null; mActiveListener = null; Loading @@ -550,6 +534,11 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } } private void internalClearSoundModelLocked() { mCurrentSoundModelHandle = INVALID_VALUE; mCurrentSoundModel = null; } class MyCallStateListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String arg1) { Loading Loading @@ -581,7 +570,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { pw.print(" keyphrase ID="); pw.println(mKeyphraseId); pw.print(" sound model handle="); pw.println(mCurrentSoundModelHandle); pw.print(" sound model UUID="); pw.println(mCurrentSoundModelUuid == null ? "null" : mCurrentSoundModelUuid); pw.println(mCurrentSoundModel == null ? "null" : mCurrentSoundModel.uuid); pw.print(" current listener="); pw.println(mActiveListener == null ? "null" : mActiveListener.asBinder()); Loading Loading
core/java/android/hardware/soundtrigger/SoundTrigger.java +59 −0 Original line number Diff line number Diff line Loading @@ -211,6 +211,43 @@ public class SoundTrigger { this.type = type; this.data = data; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + Arrays.hashCode(data); result = prime * result + type; result = prime * result + ((uuid == null) ? 0 : uuid.hashCode()); result = prime * result + ((vendorUuid == null) ? 0 : vendorUuid.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof SoundModel)) return false; SoundModel other = (SoundModel) obj; if (!Arrays.equals(data, other.data)) return false; if (type != other.type) return false; if (uuid == null) { if (other.uuid != null) return false; } else if (!uuid.equals(other.uuid)) return false; if (vendorUuid == null) { if (other.vendorUuid != null) return false; } else if (!vendorUuid.equals(other.vendorUuid)) return false; return true; } } /***************************************************************************** Loading Loading @@ -395,6 +432,28 @@ public class SoundTrigger { + ", uuid=" + uuid + ", vendorUuid=" + vendorUuid + ", type=" + type + ", data=" + (data == null ? 0 : data.length) + "]"; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + Arrays.hashCode(keyphrases); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (!(obj instanceof KeyphraseSoundModel)) return false; KeyphraseSoundModel other = (KeyphraseSoundModel) obj; if (!Arrays.equals(keyphrases, other.keyphrases)) return false; return true; } } /** Loading
services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java +18 −29 Original line number Diff line number Diff line Loading @@ -40,7 +40,6 @@ import android.util.Slog; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.UUID; /** * Helper for {@link SoundTrigger} APIs. Loading Loading @@ -78,7 +77,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { private IRecognitionStatusCallback mActiveListener; private int mKeyphraseId = INVALID_VALUE; private int mCurrentSoundModelHandle = INVALID_VALUE; private UUID mCurrentSoundModelUuid = null; private KeyphraseSoundModel mCurrentSoundModel = null; // FIXME: Ideally this should not be stored if allowMultipleTriggers happens at a lower layer. private RecognitionConfig mRecognitionConfig = null; private boolean mRequested = false; Loading Loading @@ -134,7 +133,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { + (mActiveListener == null ? "null" : mActiveListener.asBinder())); Slog.d(TAG, "current SoundModel handle=" + mCurrentSoundModelHandle); Slog.d(TAG, "current SoundModel UUID=" + (mCurrentSoundModelUuid == null ? null : mCurrentSoundModelUuid)); + (mCurrentSoundModel == null ? null : mCurrentSoundModel.uuid)); } if (!mStarted) { Loading Loading @@ -166,20 +165,16 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } // Unload the previous model if the current one isn't invalid // and, it's not the same as the new one, or we are already started // if we are already started, we can get multiple calls to start // if the underlying sound model changes, in which case we should unload and reload. // The model reuse helps only in cases when we trigger and stop internally // without a start recognition call. // and, it's not the same as the new one. // This helps use cache and reuse the model and just start/stop it when necessary. if (mCurrentSoundModelHandle != INVALID_VALUE && (!soundModel.uuid.equals(mCurrentSoundModelUuid) || mStarted)) { && !soundModel.equals(mCurrentSoundModel)) { Slog.w(TAG, "Unloading previous sound model"); int status = mModule.unloadSoundModel(mCurrentSoundModelHandle); if (status != SoundTrigger.STATUS_OK) { Slog.w(TAG, "unloadSoundModel call failed with " + status); } mCurrentSoundModelHandle = INVALID_VALUE; mCurrentSoundModelUuid = null; internalClearSoundModelLocked(); mStarted = false; } Loading @@ -198,7 +193,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { // Load the sound model if the current one is null. int soundModelHandle = mCurrentSoundModelHandle; if (mCurrentSoundModelHandle == INVALID_VALUE || mCurrentSoundModelUuid == null) { || mCurrentSoundModel == null) { int[] handle = new int[] { INVALID_VALUE }; int status = mModule.loadSoundModel(soundModel, handle); if (status != SoundTrigger.STATUS_OK) { Loading @@ -218,7 +213,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { mRequested = true; mKeyphraseId = keyphraseId; mCurrentSoundModelHandle = soundModelHandle; mCurrentSoundModelUuid = soundModel.uuid; mCurrentSoundModel = soundModel; mRecognitionConfig = recognitionConfig; // Register the new listener. This replaces the old one. // There can only be a maximum of one active listener at any given time. Loading Loading @@ -275,14 +270,9 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { return status; } status = mModule.unloadSoundModel(mCurrentSoundModelHandle); if (status != SoundTrigger.STATUS_OK) { Slog.w(TAG, "unloadSoundModel call failed with " + status); } // Clear the internal state once the recognition has been stopped. // Unload sound model call may fail in scenarios, and we'd still want // to reload the sound model. // We leave the sound model loaded but not started, this helps us when we start // back. // Also clear the internal state once the recognition has been stopped. internalClearStateLocked(); return status; } Loading @@ -303,11 +293,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { mRequested = false; int status = updateRecognitionLocked(false /* don't notify for synchronous calls */); status = mModule.unloadSoundModel(mCurrentSoundModelHandle); if (status != SoundTrigger.STATUS_OK) { Slog.w(TAG, "unloadSoundModel call failed with " + status); } internalClearStateLocked(); } } Loading Loading @@ -456,6 +441,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } catch (RemoteException e) { Slog.w(TAG, "RemoteException in onError", e); } finally { internalClearSoundModelLocked(); internalClearStateLocked(); if (mModule != null) { mModule.detach(); Loading Loading @@ -535,8 +521,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { mRequested = false; mKeyphraseId = INVALID_VALUE; mCurrentSoundModelHandle = INVALID_VALUE; mCurrentSoundModelUuid = null; mRecognitionConfig = null; mActiveListener = null; Loading @@ -550,6 +534,11 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } } private void internalClearSoundModelLocked() { mCurrentSoundModelHandle = INVALID_VALUE; mCurrentSoundModel = null; } class MyCallStateListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String arg1) { Loading Loading @@ -581,7 +570,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { pw.print(" keyphrase ID="); pw.println(mKeyphraseId); pw.print(" sound model handle="); pw.println(mCurrentSoundModelHandle); pw.print(" sound model UUID="); pw.println(mCurrentSoundModelUuid == null ? "null" : mCurrentSoundModelUuid); pw.println(mCurrentSoundModel == null ? "null" : mCurrentSoundModel.uuid); pw.print(" current listener="); pw.println(mActiveListener == null ? "null" : mActiveListener.asBinder()); Loading