Expose SoundTriggerManager and SoundTrigger APIs

am: a5fd0294c7

Change-Id: I71c2698aa282d33fb5468164b0b5bf90b28f8323
This commit is contained in:
Philip P. Moltmann
2018-03-21 05:56:25 +00:00
committed by android-build-merger
3 changed files with 213 additions and 33 deletions

View File

@@ -99,6 +99,7 @@ package android {
field public static final java.lang.String MANAGE_CARRIER_OEM_UNLOCK_STATE = "android.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE";
field public static final java.lang.String MANAGE_CA_CERTIFICATES = "android.permission.MANAGE_CA_CERTIFICATES";
field public static final java.lang.String MANAGE_DEVICE_ADMINS = "android.permission.MANAGE_DEVICE_ADMINS";
field public static final java.lang.String MANAGE_SOUND_TRIGGER = "android.permission.MANAGE_SOUND_TRIGGER";
field public static final java.lang.String MANAGE_SUBSCRIPTION_PLANS = "android.permission.MANAGE_SUBSCRIPTION_PLANS";
field public static final java.lang.String MANAGE_USB = "android.permission.MANAGE_USB";
field public static final java.lang.String MANAGE_USERS = "android.permission.MANAGE_USERS";
@@ -2222,6 +2223,21 @@ package android.hardware.radio {
}
package android.hardware.soundtrigger {
public class SoundTrigger {
field public static final int STATUS_OK = 0; // 0x0
}
public static class SoundTrigger.RecognitionEvent {
method public android.media.AudioFormat getCaptureFormat();
method public int getCaptureSession();
method public byte[] getData();
method public boolean isCaptureAvailable();
}
}
package android.hardware.usb {
public class UsbDeviceConnection {

View File

@@ -16,6 +16,14 @@
package android.hardware.soundtrigger;
import static android.system.OsConstants.EINVAL;
import static android.system.OsConstants.ENODEV;
import static android.system.OsConstants.ENOSYS;
import static android.system.OsConstants.EPERM;
import static android.system.OsConstants.EPIPE;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.media.AudioFormat;
import android.os.Handler;
import android.os.Parcel;
@@ -25,22 +33,33 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.UUID;
import static android.system.OsConstants.*;
/**
* The SoundTrigger class provides access via JNI to the native service managing
* the sound trigger HAL.
*
* @hide
*/
@SystemApi
public class SoundTrigger {
private SoundTrigger() {
}
/**
* Status code used when the operation succeeded
*/
public static final int STATUS_OK = 0;
/** @hide */
public static final int STATUS_ERROR = Integer.MIN_VALUE;
/** @hide */
public static final int STATUS_PERMISSION_DENIED = -EPERM;
/** @hide */
public static final int STATUS_NO_INIT = -ENODEV;
/** @hide */
public static final int STATUS_BAD_VALUE = -EINVAL;
/** @hide */
public static final int STATUS_DEAD_OBJECT = -EPIPE;
/** @hide */
public static final int STATUS_INVALID_OPERATION = -ENOSYS;
/*****************************************************************************
@@ -48,6 +67,8 @@ public class SoundTrigger {
* managed by the native sound trigger service. Each module has a unique
* ID used to target any API call to this paricular module. Module
* properties are returned by listModules() method.
*
* @hide
****************************************************************************/
public static class ModuleProperties implements Parcelable {
/** Unique module ID provided by the native service */
@@ -187,6 +208,8 @@ public class SoundTrigger {
* implementation to detect a particular sound pattern.
* A specialized version {@link KeyphraseSoundModel} is defined for key phrase
* sound models.
*
* @hide
****************************************************************************/
public static class SoundModel {
/** Undefined sound model type */
@@ -261,6 +284,8 @@ public class SoundTrigger {
/*****************************************************************************
* A Keyphrase describes a key phrase that can be detected by a
* {@link KeyphraseSoundModel}
*
* @hide
****************************************************************************/
public static class Keyphrase implements Parcelable {
/** Unique identifier for this keyphrase */
@@ -382,6 +407,8 @@ public class SoundTrigger {
* A KeyphraseSoundModel is a specialized {@link SoundModel} for key phrases.
* It contains data needed by the hardware to detect a certain number of key phrases
* and the list of corresponding {@link Keyphrase} descriptors.
*
* @hide
****************************************************************************/
public static class KeyphraseSoundModel extends SoundModel implements Parcelable {
/** Key phrases in this sound model */
@@ -468,6 +495,8 @@ public class SoundTrigger {
/*****************************************************************************
* A GenericSoundModel is a specialized {@link SoundModel} for non-voice sound
* patterns.
*
* @hide
****************************************************************************/
public static class GenericSoundModel extends SoundModel implements Parcelable {
@@ -524,52 +553,115 @@ public class SoundTrigger {
/**
* Modes for key phrase recognition
*/
/** Simple recognition of the key phrase */
/**
* Simple recognition of the key phrase
*
* @hide
*/
public static final int RECOGNITION_MODE_VOICE_TRIGGER = 0x1;
/** Trigger only if one user is identified */
/**
* Trigger only if one user is identified
*
* @hide
*/
public static final int RECOGNITION_MODE_USER_IDENTIFICATION = 0x2;
/** Trigger only if one user is authenticated */
/**
* Trigger only if one user is authenticated
*
* @hide
*/
public static final int RECOGNITION_MODE_USER_AUTHENTICATION = 0x4;
/**
* Status codes for {@link RecognitionEvent}
*/
/** Recognition success */
/**
* Recognition success
*
* @hide
*/
public static final int RECOGNITION_STATUS_SUCCESS = 0;
/** Recognition aborted (e.g. capture preempted by anotehr use case */
/**
* Recognition aborted (e.g. capture preempted by anotehr use case
*
* @hide
*/
public static final int RECOGNITION_STATUS_ABORT = 1;
/** Recognition failure */
/**
* Recognition failure
*
* @hide
*/
public static final int RECOGNITION_STATUS_FAILURE = 2;
/**
* A RecognitionEvent is provided by the
* {@link StatusListener#onRecognition(RecognitionEvent)}
* {@code StatusListener#onRecognition(RecognitionEvent)}
* callback upon recognition success or failure.
*/
public static class RecognitionEvent implements Parcelable {
/** Recognition status e.g {@link #RECOGNITION_STATUS_SUCCESS} */
public static class RecognitionEvent {
/**
* Recognition status e.g RECOGNITION_STATUS_SUCCESS
*
* @hide
*/
public final int status;
/** Sound Model corresponding to this event callback */
/**
*
* Sound Model corresponding to this event callback
*
* @hide
*/
public final int soundModelHandle;
/** True if it is possible to capture audio from this utterance buffered by the hardware */
/**
* True if it is possible to capture audio from this utterance buffered by the hardware
*
* @hide
*/
public final boolean captureAvailable;
/** Audio session ID to be used when capturing the utterance with an AudioRecord
* if captureAvailable() is true. */
/**
* Audio session ID to be used when capturing the utterance with an AudioRecord
* if captureAvailable() is true.
*
* @hide
*/
public final int captureSession;
/** Delay in ms between end of model detection and start of audio available for capture.
* A negative value is possible (e.g. if keyphrase is also available for capture) */
/**
* Delay in ms between end of model detection and start of audio available for capture.
* A negative value is possible (e.g. if keyphrase is also available for capture)
*
* @hide
*/
public final int captureDelayMs;
/** Duration in ms of audio captured before the start of the trigger. 0 if none. */
/**
* Duration in ms of audio captured before the start of the trigger. 0 if none.
*
* @hide
*/
public final int capturePreambleMs;
/** True if the trigger (key phrase capture is present in binary data */
/**
* True if the trigger (key phrase capture is present in binary data
*
* @hide
*/
public final boolean triggerInData;
/** Audio format of either the trigger in event data or to use for capture of the
* rest of the utterance */
public AudioFormat captureFormat;
/** Opaque data for use by system applications who know about voice engine internals,
* typically during enrollment. */
/**
* Audio format of either the trigger in event data or to use for capture of the
* rest of the utterance
*
* @hide
*/
public final AudioFormat captureFormat;
/**
* Opaque data for use by system applications who know about voice engine internals,
* typically during enrollment.
*
* @hide
*/
public final byte[] data;
/** @hide */
public RecognitionEvent(int status, int soundModelHandle, boolean captureAvailable,
int captureSession, int captureDelayMs, int capturePreambleMs,
boolean triggerInData, AudioFormat captureFormat, byte[] data) {
@@ -584,6 +676,46 @@ public class SoundTrigger {
this.data = data;
}
/**
* Check if is possible to capture audio from this utterance buffered by the hardware.
*
* @return {@code true} iff a capturing is possible
*/
public boolean isCaptureAvailable() {
return captureAvailable;
}
/**
* Get the audio format of either the trigger in event data or to use for capture of the
* rest of the utterance
*
* @return the audio format
*/
@Nullable public AudioFormat getCaptureFormat() {
return captureFormat;
}
/**
* Get Audio session ID to be used when capturing the utterance with an {@link AudioRecord}
* if {@link #isCaptureAvailable()} is true.
*
* @return The id of the capture session
*/
public int getCaptureSession() {
return captureSession;
}
/**
* Get the opaque data for use by system applications who know about voice engine
* internals, typically during enrollment.
*
* @return The data of the event
*/
public byte[] getData() {
return data;
}
/** @hide */
public static final Parcelable.Creator<RecognitionEvent> CREATOR
= new Parcelable.Creator<RecognitionEvent>() {
public RecognitionEvent createFromParcel(Parcel in) {
@@ -595,6 +727,7 @@ public class SoundTrigger {
}
};
/** @hide */
protected static RecognitionEvent fromParcel(Parcel in) {
int status = in.readInt();
int soundModelHandle = in.readInt();
@@ -619,12 +752,12 @@ public class SoundTrigger {
captureDelayMs, capturePreambleMs, triggerInData, captureFormat, data);
}
@Override
/** @hide */
public int describeContents() {
return 0;
}
@Override
/** @hide */
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(status);
dest.writeInt(soundModelHandle);
@@ -726,6 +859,8 @@ public class SoundTrigger {
* A RecognitionConfig is provided to
* {@link SoundTriggerModule#startRecognition(int, RecognitionConfig)} to configure the
* recognition request.
*
* @hide
*/
public static class RecognitionConfig implements Parcelable {
/** True if the DSP should capture the trigger sound and make it available for further
@@ -744,7 +879,7 @@ public class SoundTrigger {
public final byte[] data;
public RecognitionConfig(boolean captureRequested, boolean allowMultipleTriggers,
KeyphraseRecognitionExtra keyphrases[], byte[] data) {
KeyphraseRecognitionExtra[] keyphrases, byte[] data) {
this.captureRequested = captureRequested;
this.allowMultipleTriggers = allowMultipleTriggers;
this.keyphrases = keyphrases;
@@ -799,6 +934,8 @@ public class SoundTrigger {
* When used in a {@link RecognitionConfig} it indicates the minimum confidence level that
* should trigger a recognition.
* - The user ID is derived from the system ID {@link android.os.UserHandle#getIdentifier()}.
*
* @hide
*/
public static class ConfidenceLevel implements Parcelable {
public final int userId;
@@ -872,6 +1009,8 @@ public class SoundTrigger {
/**
* Additional data conveyed by a {@link KeyphraseRecognitionEvent}
* for a key phrase detection.
*
* @hide
*/
public static class KeyphraseRecognitionExtra implements Parcelable {
/** The keyphrase ID */
@@ -970,8 +1109,10 @@ public class SoundTrigger {
/**
* Specialized {@link RecognitionEvent} for a key phrase detection.
*
* @hide
*/
public static class KeyphraseRecognitionEvent extends RecognitionEvent {
public static class KeyphraseRecognitionEvent extends RecognitionEvent implements Parcelable {
/** Indicates if the key phrase is present in the buffered audio available for capture */
public final KeyphraseRecognitionExtra[] keyphraseExtras;
@@ -1091,8 +1232,10 @@ public class SoundTrigger {
/**
* Sub-class of RecognitionEvent specifically for sound-trigger based sound
* models(non-keyphrase). Currently does not contain any additional fields.
*
* @hide
*/
public static class GenericRecognitionEvent extends RecognitionEvent {
public static class GenericRecognitionEvent extends RecognitionEvent implements Parcelable {
public GenericRecognitionEvent(int status, int soundModelHandle,
boolean captureAvailable, int captureSession, int captureDelayMs,
int capturePreambleMs, boolean triggerInData, AudioFormat captureFormat,
@@ -1140,13 +1283,19 @@ public class SoundTrigger {
/**
* Status codes for {@link SoundModelEvent}
*/
/** Sound Model was updated */
/**
* Sound Model was updated
*
* @hide
*/
public static final int SOUNDMODEL_STATUS_UPDATED = 0;
/**
* A SoundModelEvent is provided by the
* {@link StatusListener#onSoundModelUpdate(SoundModelEvent)}
* callback when a sound model has been updated by the implementation
*
* @hide
*/
public static class SoundModelEvent implements Parcelable {
/** Status e.g {@link #SOUNDMODEL_STATUS_UPDATED} */
@@ -1231,9 +1380,17 @@ public class SoundTrigger {
* Native service state. {@link StatusListener#onServiceStateChange(int)}
*/
// Keep in sync with system/core/include/system/sound_trigger.h
/** Sound trigger service is enabled */
/**
* Sound trigger service is enabled
*
* @hide
*/
public static final int SERVICE_STATE_ENABLED = 0;
/** Sound trigger service is disabled */
/**
* Sound trigger service is disabled
*
* @hide
*/
public static final int SERVICE_STATE_DISABLED = 1;
/**
@@ -1245,6 +1402,8 @@ public class SoundTrigger {
* - {@link #STATUS_NO_INIT} if the native service cannot be reached
* - {@link #STATUS_BAD_VALUE} if modules is null
* - {@link #STATUS_DEAD_OBJECT} if the binder transaction to the native service fails
*
* @hide
*/
public static native int listModules(ArrayList <ModuleProperties> modules);
@@ -1256,6 +1415,8 @@ public class SoundTrigger {
* @param handler the Handler that will receive the callabcks. Can be null if default handler
* is OK.
* @return a valid sound module in case of success or null in case of error.
*
* @hide
*/
public static SoundTriggerModule attachModule(int moduleId,
StatusListener listener,
@@ -1270,6 +1431,8 @@ public class SoundTrigger {
/**
* Interface provided by the client application when attaching to a {@link SoundTriggerModule}
* to received recognition and error notifications.
*
* @hide
*/
public static interface StatusListener {
/**

View File

@@ -3754,7 +3754,8 @@
<!-- Must be required by system/priv apps when accessing the sound trigger
APIs given by {@link SoundTriggerManager}.
@hide <p>Not for use by third-party applications.</p> -->
@hide
@SystemApi -->
<permission android:name="android.permission.MANAGE_SOUND_TRIGGER"
android:protectionLevel="signature|privileged" />