/*
 * Copyright 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.hardware.soundtrigger@2.0;

import android.hardware.audio.common@2.0;

interface ISoundTriggerHwCallback {
    enum RecognitionStatus : uint32_t {
        SUCCESS  = 0,
        ABORT    = 1,
        FAILURE  = 2,
    };

    enum SoundModelStatus : uint32_t {
        UPDATED  = 0,
    };

    /**
     * Generic recognition event sent via recognition callback
     */
    struct RecognitionEvent {
        /** Recognition status e.g. SUCCESS */
        RecognitionStatus status;
        /** Sound model type for this event. e.g SoundModelType.TYPE_KEYPHRASE */
        SoundModelType    type;
        /** Handle of loaded sound model which triggered the event */
        SoundModelHandle  model;
        /** It is possible to capture audio from this */
        /** utterance buffered by the implementation */
        bool              captureAvailable;
        /** Audio session ID. framework use */
        int32_t           captureSession;
        /**
         * Delay in ms between end of model detection and start of audio
         * available for capture. A negative value is possible
         * (e.g. if key phrase is also available for capture */
        int32_t           captureDelayMs;
        /**
         * Duration in ms of audio captured before the start of the trigger.
         * 0 if none. */
        int32_t           capturePreambleMs;
        /** The opaque data is the capture of the trigger sound */
        bool              triggerInData;
        /**
         * Audio format of either the trigger in event data or to use for
         * capture of the rest of the utterance */
        AudioConfig       audioConfig;
        /** Opaque event data */
        vec<uint8_t>      data;
    };

    /**
     * Specialized recognition event for key phrase recognitions
     */
    struct PhraseRecognitionEvent {
        /** Common part of the recognition event */
        RecognitionEvent common;
        /** List of descriptors for each recognized key phrase */
        vec<PhraseRecognitionExtra> phraseExtras;
    };

    /**
     * Event sent via load sound model callback
     */
    struct ModelEvent {
         /** Sound model status e.g. SoundModelStatus.UPDATED */
        SoundModelStatus status;
        /** Loaded sound model that triggered the event */
        SoundModelHandle model;
        /** Opaque event data, passed transparently by the framework */
        vec<uint8_t>     data;
    };

    typedef int32_t CallbackCookie;

    /**
     * Callback method called by the HAL when the sound recognition triggers
     * @param event A RecognitionEvent structure containing detailed results
     *              of the recognition triggered
     * @param cookie The cookie passed by the framework when recognition was
     *               started (see ISoundtriggerHw.startRecognition()
     */
    recognitionCallback(RecognitionEvent event, CallbackCookie cookie);

    /**
     * Callback method called by the HAL when the sound recognition triggers
     * for a key phrase sound model.
     * @param event A RecognitionEvent structure containing detailed results
     *              of the recognition triggered
     * @param cookie The cookie passed by the framework when recognition was
     *               started (see ISoundtriggerHw.startRecognition()
     */
    phraseRecognitionCallback(PhraseRecognitionEvent event,
                              CallbackCookie cookie);
    /**
     * Callback method called by the HAL when the sound model loading completes
     * @param event A ModelEvent structure containing detailed results of the
     *              model loading operation
     * @param cookie The cookie passed by the framework when loading was
     *               initiated (see ISoundtriggerHw.loadSoundModel()
     */
    soundModelCallback(ModelEvent event, CallbackCookie cookie);
};
