/*
 * This file is auto-generated.  DO NOT MODIFY.
 * Using: out/host/linux-x86/bin/aidl --lang=java -Weverything -Wno-missing-permission-annotation --min_sdk_version current -pout/soong/.intermediates/system/hardware/interfaces/media/android.media.soundtrigger.types_interface/2/preprocessed.aidl -pout/soong/.intermediates/system/hardware/interfaces/media/android.media.audio.common.types_interface/3/preprocessed.aidl -pout/soong/.intermediates/frameworks/base/media/media_permission-aidl_interface/preprocessed.aidl --ninja -d out/soong/.intermediates/frameworks/base/media/soundtrigger_middleware-aidl-java-source/gen/android/media/soundtrigger_middleware/ISoundTriggerModule.java.d -o out/soong/.intermediates/frameworks/base/media/soundtrigger_middleware-aidl-java-source/gen -Nframeworks/base/media/aidl frameworks/base/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerModule.aidl
 */
package android.media.soundtrigger_middleware;
/**
 * A sound-trigger module.
 * 
 * This interface allows a client to operate a sound-trigger device, intended for low-power
 * detection of various sound patterns, represented by a "sound model".
 * 
 * Basic operation is to load a sound model (either a generic one or a "phrase" model), then
 * initiate recognition on this model. A trigger will be delivered asynchronously via a callback
 * provided by the caller earlier, when attaching to this interface.
 * 
 * In additon to recognition events, this module will also produce abort events in cases where
 * recognition has been externally preempted.
 * 
 * {@hide}
 */
public interface ISoundTriggerModule extends android.os.IInterface
{
  /** Default implementation for ISoundTriggerModule. */
  public static class Default implements android.media.soundtrigger_middleware.ISoundTriggerModule
  {
    /**
     * Load a sound model. Will return a handle to the model on success or will throw a
     * ServiceSpecificException with one of the {@link Status} error codes upon a recoverable error
     * (for example, lack of resources of loading a model at the time of call.
     * Model must eventually be unloaded using {@link #unloadModel(int)} prior to detaching.
     * 
     * May throw a ServiceSpecificException with an RESOURCE_CONTENTION status to indicate that
     * resources required for loading the model are currently consumed by other clients.
     */
    @Override public int loadModel(android.media.soundtrigger.SoundModel model) throws android.os.RemoteException
    {
      return 0;
    }
    /**
     * Load a phrase sound model. Will return a handle to the model on success or will throw a
     * ServiceSpecificException with one of the {@link Status} error codes upon a recoverable error
     * (for example, lack of resources of loading a model at the time of call.
     * Model must eventually be unloaded using unloadModel prior to detaching.
     * 
     * May throw a ServiceSpecificException with an RESOURCE_CONTENTION status to indicate that
     * resources required for loading the model are currently consumed by other clients.
     */
    @Override public int loadPhraseModel(android.media.soundtrigger.PhraseSoundModel model) throws android.os.RemoteException
    {
      return 0;
    }
    /**
     * Unload a model, previously loaded with loadModel or loadPhraseModel. After unloading, model
     * can no longer be used for recognition and the resources occupied by it are released.
     * Model must not be active at the time of unloading. Cient may call stopRecognition to ensure
     * that.
     */
    @Override public void unloadModel(int modelHandle) throws android.os.RemoteException
    {
    }
    /**
     * Initiate recognition on a previously loaded model.
     * Recognition event would eventually be delivered via the client-provided callback, typically
     * supplied during attachment to this interface.
     * 
     * Once a recognition event is passed to the client, the recognition automatically become
     * inactive, unless the event is of the RecognitionStatus.FORCED kind. Client can also shut down
     * the recognition explicitly, via stopRecognition.
     * 
     * May throw a ServiceSpecificException with an RESOURCE_CONTENTION status to indicate that
     * resources required for starting the model are currently consumed by other clients.
     * @return - A token delivered along with future recognition events.
     */
    @Override public android.os.IBinder startRecognition(int modelHandle, android.media.soundtrigger.RecognitionConfig config) throws android.os.RemoteException
    {
      return null;
    }
    /**
     * Stop a recognition of a previously active recognition. Will NOT generate a recognition event.
     * This call is idempotent - calling it on an inactive model has no effect. However, it must
     * only be used with a loaded model handle.
     */
    @Override public void stopRecognition(int modelHandle) throws android.os.RemoteException
    {
    }
    /**
     * Force generation of a recognition event. Handle must be that of a loaded model. If
     * recognition is inactive, will do nothing. If recognition is active, will asynchronously
     * deliever an event with RecognitionStatus.FORCED status and leave recognition in active state.
     * To avoid any race conditions, once an event signalling the automatic stopping of recognition
     * is sent, no more forced events will get sent (even if previously requested) until recognition
     * is explicitly started again.
     * 
     * Since not all module implementations support this feature, may throw a
     * ServiceSpecificException with an OPERATION_NOT_SUPPORTED status.
     */
    @Override public void forceRecognitionEvent(int modelHandle) throws android.os.RemoteException
    {
    }
    /**
     * Set a model specific parameter with the given value. This parameter
     * will keep its value for the duration the model is loaded regardless of starting and stopping
     * recognition. Once the model is unloaded, the value will be lost.
     * It is expected to check if the handle supports the parameter via the
     * queryModelParameterSupport API prior to calling this method.
     * 
     * @param modelHandle The sound model handle indicating which model to modify parameters
     * @param modelParam Parameter to set which will be validated against the
     *                   ModelParameter type.
     * @param value The value to set for the given model parameter
     */
    @Override public void setModelParameter(int modelHandle, int modelParam, int value) throws android.os.RemoteException
    {
    }
    /**
     * Get a model specific parameter. This parameter will keep its value
     * for the duration the model is loaded regardless of starting and stopping recognition.
     * Once the model is unloaded, the value will be lost. If the value is not set, a default
     * value is returned. See ModelParameter for parameter default values.
     * It is expected to check if the handle supports the parameter via the
     * queryModelParameterSupport API prior to calling this method.
     * 
     * @param modelHandle The sound model associated with given modelParam
     * @param modelParam Parameter to set which will be validated against the
     *                   ModelParameter type.
     * @return Value set to the requested parameter.
     */
    @Override public int getModelParameter(int modelHandle, int modelParam) throws android.os.RemoteException
    {
      return 0;
    }
    /**
     * Determine if parameter control is supported for the given model handle, and its valid value
     * range if it is.
     * 
     * @param modelHandle The sound model handle indicating which model to query
     * @param modelParam Parameter to set which will be validated against the
     *                   ModelParameter type.
     * @return If parameter is supported, the return value is its valid range, otherwise null.
     */
    @Override public android.media.soundtrigger.ModelParameterRange queryModelParameterSupport(int modelHandle, int modelParam) throws android.os.RemoteException
    {
      return null;
    }
    /**
     * Detach from the module, releasing any active resources.
     * This will ensure the client callback is no longer called after this call returns.
     * All models must have been unloaded prior to calling this method.
     */
    @Override public void detach() throws android.os.RemoteException
    {
    }
    @Override
    public android.os.IBinder asBinder() {
      return null;
    }
  }
  /** Local-side IPC implementation stub class. */
  public static abstract class Stub extends android.os.Binder implements android.media.soundtrigger_middleware.ISoundTriggerModule
  {
    /** Construct the stub at attach it to the interface. */
    @SuppressWarnings("this-escape")
    public Stub()
    {
      this.attachInterface(this, DESCRIPTOR);
    }
    /**
     * Cast an IBinder object into an android.media.soundtrigger_middleware.ISoundTriggerModule interface,
     * generating a proxy if needed.
     */
    public static android.media.soundtrigger_middleware.ISoundTriggerModule asInterface(android.os.IBinder obj)
    {
      if ((obj==null)) {
        return null;
      }
      android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
      if (((iin!=null)&&(iin instanceof android.media.soundtrigger_middleware.ISoundTriggerModule))) {
        return ((android.media.soundtrigger_middleware.ISoundTriggerModule)iin);
      }
      return new android.media.soundtrigger_middleware.ISoundTriggerModule.Stub.Proxy(obj);
    }
    @Override public android.os.IBinder asBinder()
    {
      return this;
    }
    @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
    {
      java.lang.String descriptor = DESCRIPTOR;
      if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
        data.enforceInterface(descriptor);
      }
      if (code == INTERFACE_TRANSACTION) {
        reply.writeString(descriptor);
        return true;
      }
      switch (code)
      {
        case TRANSACTION_loadModel:
        {
          android.media.soundtrigger.SoundModel _arg0;
          _arg0 = data.readTypedObject(android.media.soundtrigger.SoundModel.CREATOR);
          data.enforceNoDataAvail();
          int _result = this.loadModel(_arg0);
          reply.writeNoException();
          reply.writeInt(_result);
          break;
        }
        case TRANSACTION_loadPhraseModel:
        {
          android.media.soundtrigger.PhraseSoundModel _arg0;
          _arg0 = data.readTypedObject(android.media.soundtrigger.PhraseSoundModel.CREATOR);
          data.enforceNoDataAvail();
          int _result = this.loadPhraseModel(_arg0);
          reply.writeNoException();
          reply.writeInt(_result);
          break;
        }
        case TRANSACTION_unloadModel:
        {
          int _arg0;
          _arg0 = data.readInt();
          data.enforceNoDataAvail();
          this.unloadModel(_arg0);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_startRecognition:
        {
          int _arg0;
          _arg0 = data.readInt();
          android.media.soundtrigger.RecognitionConfig _arg1;
          _arg1 = data.readTypedObject(android.media.soundtrigger.RecognitionConfig.CREATOR);
          data.enforceNoDataAvail();
          android.os.IBinder _result = this.startRecognition(_arg0, _arg1);
          reply.writeNoException();
          reply.writeStrongBinder(_result);
          break;
        }
        case TRANSACTION_stopRecognition:
        {
          int _arg0;
          _arg0 = data.readInt();
          data.enforceNoDataAvail();
          this.stopRecognition(_arg0);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_forceRecognitionEvent:
        {
          int _arg0;
          _arg0 = data.readInt();
          data.enforceNoDataAvail();
          this.forceRecognitionEvent(_arg0);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_setModelParameter:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          int _arg2;
          _arg2 = data.readInt();
          data.enforceNoDataAvail();
          this.setModelParameter(_arg0, _arg1, _arg2);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_getModelParameter:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          data.enforceNoDataAvail();
          int _result = this.getModelParameter(_arg0, _arg1);
          reply.writeNoException();
          reply.writeInt(_result);
          break;
        }
        case TRANSACTION_queryModelParameterSupport:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          data.enforceNoDataAvail();
          android.media.soundtrigger.ModelParameterRange _result = this.queryModelParameterSupport(_arg0, _arg1);
          reply.writeNoException();
          reply.writeTypedObject(_result, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
          break;
        }
        case TRANSACTION_detach:
        {
          this.detach();
          reply.writeNoException();
          break;
        }
        default:
        {
          return super.onTransact(code, data, reply, flags);
        }
      }
      return true;
    }
    private static class Proxy implements android.media.soundtrigger_middleware.ISoundTriggerModule
    {
      private android.os.IBinder mRemote;
      Proxy(android.os.IBinder remote)
      {
        mRemote = remote;
      }
      @Override public android.os.IBinder asBinder()
      {
        return mRemote;
      }
      public java.lang.String getInterfaceDescriptor()
      {
        return DESCRIPTOR;
      }
      /**
       * Load a sound model. Will return a handle to the model on success or will throw a
       * ServiceSpecificException with one of the {@link Status} error codes upon a recoverable error
       * (for example, lack of resources of loading a model at the time of call.
       * Model must eventually be unloaded using {@link #unloadModel(int)} prior to detaching.
       * 
       * May throw a ServiceSpecificException with an RESOURCE_CONTENTION status to indicate that
       * resources required for loading the model are currently consumed by other clients.
       */
      @Override public int loadModel(android.media.soundtrigger.SoundModel model) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        int _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeTypedObject(model, 0);
          boolean _status = mRemote.transact(Stub.TRANSACTION_loadModel, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readInt();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Load a phrase sound model. Will return a handle to the model on success or will throw a
       * ServiceSpecificException with one of the {@link Status} error codes upon a recoverable error
       * (for example, lack of resources of loading a model at the time of call.
       * Model must eventually be unloaded using unloadModel prior to detaching.
       * 
       * May throw a ServiceSpecificException with an RESOURCE_CONTENTION status to indicate that
       * resources required for loading the model are currently consumed by other clients.
       */
      @Override public int loadPhraseModel(android.media.soundtrigger.PhraseSoundModel model) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        int _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeTypedObject(model, 0);
          boolean _status = mRemote.transact(Stub.TRANSACTION_loadPhraseModel, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readInt();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Unload a model, previously loaded with loadModel or loadPhraseModel. After unloading, model
       * can no longer be used for recognition and the resources occupied by it are released.
       * Model must not be active at the time of unloading. Cient may call stopRecognition to ensure
       * that.
       */
      @Override public void unloadModel(int modelHandle) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(modelHandle);
          boolean _status = mRemote.transact(Stub.TRANSACTION_unloadModel, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Initiate recognition on a previously loaded model.
       * Recognition event would eventually be delivered via the client-provided callback, typically
       * supplied during attachment to this interface.
       * 
       * Once a recognition event is passed to the client, the recognition automatically become
       * inactive, unless the event is of the RecognitionStatus.FORCED kind. Client can also shut down
       * the recognition explicitly, via stopRecognition.
       * 
       * May throw a ServiceSpecificException with an RESOURCE_CONTENTION status to indicate that
       * resources required for starting the model are currently consumed by other clients.
       * @return - A token delivered along with future recognition events.
       */
      @Override public android.os.IBinder startRecognition(int modelHandle, android.media.soundtrigger.RecognitionConfig config) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        android.os.IBinder _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(modelHandle);
          _data.writeTypedObject(config, 0);
          boolean _status = mRemote.transact(Stub.TRANSACTION_startRecognition, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readStrongBinder();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Stop a recognition of a previously active recognition. Will NOT generate a recognition event.
       * This call is idempotent - calling it on an inactive model has no effect. However, it must
       * only be used with a loaded model handle.
       */
      @Override public void stopRecognition(int modelHandle) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(modelHandle);
          boolean _status = mRemote.transact(Stub.TRANSACTION_stopRecognition, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Force generation of a recognition event. Handle must be that of a loaded model. If
       * recognition is inactive, will do nothing. If recognition is active, will asynchronously
       * deliever an event with RecognitionStatus.FORCED status and leave recognition in active state.
       * To avoid any race conditions, once an event signalling the automatic stopping of recognition
       * is sent, no more forced events will get sent (even if previously requested) until recognition
       * is explicitly started again.
       * 
       * Since not all module implementations support this feature, may throw a
       * ServiceSpecificException with an OPERATION_NOT_SUPPORTED status.
       */
      @Override public void forceRecognitionEvent(int modelHandle) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(modelHandle);
          boolean _status = mRemote.transact(Stub.TRANSACTION_forceRecognitionEvent, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Set a model specific parameter with the given value. This parameter
       * will keep its value for the duration the model is loaded regardless of starting and stopping
       * recognition. Once the model is unloaded, the value will be lost.
       * It is expected to check if the handle supports the parameter via the
       * queryModelParameterSupport API prior to calling this method.
       * 
       * @param modelHandle The sound model handle indicating which model to modify parameters
       * @param modelParam Parameter to set which will be validated against the
       *                   ModelParameter type.
       * @param value The value to set for the given model parameter
       */
      @Override public void setModelParameter(int modelHandle, int modelParam, int value) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(modelHandle);
          _data.writeInt(modelParam);
          _data.writeInt(value);
          boolean _status = mRemote.transact(Stub.TRANSACTION_setModelParameter, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Get a model specific parameter. This parameter will keep its value
       * for the duration the model is loaded regardless of starting and stopping recognition.
       * Once the model is unloaded, the value will be lost. If the value is not set, a default
       * value is returned. See ModelParameter for parameter default values.
       * It is expected to check if the handle supports the parameter via the
       * queryModelParameterSupport API prior to calling this method.
       * 
       * @param modelHandle The sound model associated with given modelParam
       * @param modelParam Parameter to set which will be validated against the
       *                   ModelParameter type.
       * @return Value set to the requested parameter.
       */
      @Override public int getModelParameter(int modelHandle, int modelParam) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        int _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(modelHandle);
          _data.writeInt(modelParam);
          boolean _status = mRemote.transact(Stub.TRANSACTION_getModelParameter, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readInt();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Determine if parameter control is supported for the given model handle, and its valid value
       * range if it is.
       * 
       * @param modelHandle The sound model handle indicating which model to query
       * @param modelParam Parameter to set which will be validated against the
       *                   ModelParameter type.
       * @return If parameter is supported, the return value is its valid range, otherwise null.
       */
      @Override public android.media.soundtrigger.ModelParameterRange queryModelParameterSupport(int modelHandle, int modelParam) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        android.media.soundtrigger.ModelParameterRange _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(modelHandle);
          _data.writeInt(modelParam);
          boolean _status = mRemote.transact(Stub.TRANSACTION_queryModelParameterSupport, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readTypedObject(android.media.soundtrigger.ModelParameterRange.CREATOR);
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Detach from the module, releasing any active resources.
       * This will ensure the client callback is no longer called after this call returns.
       * All models must have been unloaded prior to calling this method.
       */
      @Override public void detach() throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          boolean _status = mRemote.transact(Stub.TRANSACTION_detach, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
    }
    static final int TRANSACTION_loadModel = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    static final int TRANSACTION_loadPhraseModel = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
    static final int TRANSACTION_unloadModel = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
    static final int TRANSACTION_startRecognition = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3);
    static final int TRANSACTION_stopRecognition = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4);
    static final int TRANSACTION_forceRecognitionEvent = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5);
    static final int TRANSACTION_setModelParameter = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6);
    static final int TRANSACTION_getModelParameter = (android.os.IBinder.FIRST_CALL_TRANSACTION + 7);
    static final int TRANSACTION_queryModelParameterSupport = (android.os.IBinder.FIRST_CALL_TRANSACTION + 8);
    static final int TRANSACTION_detach = (android.os.IBinder.FIRST_CALL_TRANSACTION + 9);
  }
  /** @hide */
  public static final java.lang.String DESCRIPTOR = "android.media.soundtrigger_middleware.ISoundTriggerModule";
  /**
   * Load a sound model. Will return a handle to the model on success or will throw a
   * ServiceSpecificException with one of the {@link Status} error codes upon a recoverable error
   * (for example, lack of resources of loading a model at the time of call.
   * Model must eventually be unloaded using {@link #unloadModel(int)} prior to detaching.
   * 
   * May throw a ServiceSpecificException with an RESOURCE_CONTENTION status to indicate that
   * resources required for loading the model are currently consumed by other clients.
   */
  public int loadModel(android.media.soundtrigger.SoundModel model) throws android.os.RemoteException;
  /**
   * Load a phrase sound model. Will return a handle to the model on success or will throw a
   * ServiceSpecificException with one of the {@link Status} error codes upon a recoverable error
   * (for example, lack of resources of loading a model at the time of call.
   * Model must eventually be unloaded using unloadModel prior to detaching.
   * 
   * May throw a ServiceSpecificException with an RESOURCE_CONTENTION status to indicate that
   * resources required for loading the model are currently consumed by other clients.
   */
  public int loadPhraseModel(android.media.soundtrigger.PhraseSoundModel model) throws android.os.RemoteException;
  /**
   * Unload a model, previously loaded with loadModel or loadPhraseModel. After unloading, model
   * can no longer be used for recognition and the resources occupied by it are released.
   * Model must not be active at the time of unloading. Cient may call stopRecognition to ensure
   * that.
   */
  public void unloadModel(int modelHandle) throws android.os.RemoteException;
  /**
   * Initiate recognition on a previously loaded model.
   * Recognition event would eventually be delivered via the client-provided callback, typically
   * supplied during attachment to this interface.
   * 
   * Once a recognition event is passed to the client, the recognition automatically become
   * inactive, unless the event is of the RecognitionStatus.FORCED kind. Client can also shut down
   * the recognition explicitly, via stopRecognition.
   * 
   * May throw a ServiceSpecificException with an RESOURCE_CONTENTION status to indicate that
   * resources required for starting the model are currently consumed by other clients.
   * @return - A token delivered along with future recognition events.
   */
  public android.os.IBinder startRecognition(int modelHandle, android.media.soundtrigger.RecognitionConfig config) throws android.os.RemoteException;
  /**
   * Stop a recognition of a previously active recognition. Will NOT generate a recognition event.
   * This call is idempotent - calling it on an inactive model has no effect. However, it must
   * only be used with a loaded model handle.
   */
  public void stopRecognition(int modelHandle) throws android.os.RemoteException;
  /**
   * Force generation of a recognition event. Handle must be that of a loaded model. If
   * recognition is inactive, will do nothing. If recognition is active, will asynchronously
   * deliever an event with RecognitionStatus.FORCED status and leave recognition in active state.
   * To avoid any race conditions, once an event signalling the automatic stopping of recognition
   * is sent, no more forced events will get sent (even if previously requested) until recognition
   * is explicitly started again.
   * 
   * Since not all module implementations support this feature, may throw a
   * ServiceSpecificException with an OPERATION_NOT_SUPPORTED status.
   */
  public void forceRecognitionEvent(int modelHandle) throws android.os.RemoteException;
  /**
   * Set a model specific parameter with the given value. This parameter
   * will keep its value for the duration the model is loaded regardless of starting and stopping
   * recognition. Once the model is unloaded, the value will be lost.
   * It is expected to check if the handle supports the parameter via the
   * queryModelParameterSupport API prior to calling this method.
   * 
   * @param modelHandle The sound model handle indicating which model to modify parameters
   * @param modelParam Parameter to set which will be validated against the
   *                   ModelParameter type.
   * @param value The value to set for the given model parameter
   */
  public void setModelParameter(int modelHandle, int modelParam, int value) throws android.os.RemoteException;
  /**
   * Get a model specific parameter. This parameter will keep its value
   * for the duration the model is loaded regardless of starting and stopping recognition.
   * Once the model is unloaded, the value will be lost. If the value is not set, a default
   * value is returned. See ModelParameter for parameter default values.
   * It is expected to check if the handle supports the parameter via the
   * queryModelParameterSupport API prior to calling this method.
   * 
   * @param modelHandle The sound model associated with given modelParam
   * @param modelParam Parameter to set which will be validated against the
   *                   ModelParameter type.
   * @return Value set to the requested parameter.
   */
  public int getModelParameter(int modelHandle, int modelParam) throws android.os.RemoteException;
  /**
   * Determine if parameter control is supported for the given model handle, and its valid value
   * range if it is.
   * 
   * @param modelHandle The sound model handle indicating which model to query
   * @param modelParam Parameter to set which will be validated against the
   *                   ModelParameter type.
   * @return If parameter is supported, the return value is its valid range, otherwise null.
   */
  public android.media.soundtrigger.ModelParameterRange queryModelParameterSupport(int modelHandle, int modelParam) throws android.os.RemoteException;
  /**
   * Detach from the module, releasing any active resources.
   * This will ensure the client callback is no longer called after this call returns.
   * All models must have been unloaded prior to calling this method.
   */
  public void detach() throws android.os.RemoteException;
}
