/*
 * Copyright (c) 2021 Arm Limited. All rights reserved.
 * SPDX-License-Identifier: Apache-2.0
 *
 * 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.
 */
#ifndef NOISE_REDUCTION_EVT_HANDLER_HPP
#define NOISE_REDUCTION_EVT_HANDLER_HPP

#include "AppContext.hpp"
#include "Model.hpp"

namespace arm {
namespace app {

    /**
     * @brief       Handles the inference event for noise reduction.
     * @param[in]   ctx         pointer to the application context
     * @param[in]   runAll      flag to request classification of all the available audio clips
     * @return      True or false based on execution success
     **/
    bool NoiseReductionHandler(ApplicationContext& ctx, bool runAll);

    /**
     * @brief           Dumps the output tensors to a memory address.
     * This functionality is required for RNNoise use case as we want to
     * save the inference output to a file. Dumping out tensors to a
     * memory location will allow the Arm FVP or MPS3 to extract the
     * contents of this memory location to a file. This file could then
     * be used by an offline post-processing script.
     *
     * @param[in]   model       reference to a model
     * @param[in]   memAddress  memory address at which the dump will start
     * @param[in]   memSize     maximum size (in bytes) of the dump.
     *
     * @return  number of bytes written to memory.
     */
    size_t DumpOutputTensorsToMemory(Model& model, uint8_t* memAddress,
                                    size_t memSize);

    /**
     * @brief Dumps the audio file header.
     * This functionality is required for RNNoise use case as we want to
     * save the inference output to a file. Dumping out the header to a
     * memory location will allow the Arm FVP or MPS3 to extract the
     * contents of this memory location to a file. 
     * The header contains the following information 
     * int32_t filenameLength: filename length
     * uint8_t[] filename: the string containing the file name (without trailing \0)
     * int32_t dumpSizeByte: audiofile buffer size in bytes
     *
     * @param[in]   filename    the file name
     * @param[in]   dumpSize    the size of the audio file (int elements)
     * @param[in]   memAddress  memory address at which the dump will start
     * @param[in]   memSize     maximum size (in bytes) of the dump.
     *
     * @return  number of bytes written to memory.
     */
    size_t DumpDenoisedAudioHeader(const char* filename, size_t dumpSize,
                                   uint8_t* memAddress, size_t memSize);

    /**
     * @brief Write a EOF marker at the end of the dump memory.
     *
     * @param[in]   memAddress  memory address at which the dump will start
     * @param[in]   memSize     maximum size (in bytes) of the dump.
     *
     * @return  number of bytes written to memory.
     */
    size_t DumpDenoisedAudioFooter(uint8_t *memAddress, size_t memSize);

    /**
     * @brief Dump the audio data to the memory
     *
     * @param[in]   audioFrame  The vector containg the audio data
     * @param[in]   memAddress  memory address at which the dump will start
     * @param[in]   memSize     maximum size (in bytes) of the dump.
     *
     * @return  number of bytes written to memory.
     */
    size_t DumpOutputDenoisedAudioFrame(const std::vector<int16_t> &audioFrame,
                                        uint8_t *memAddress, size_t memSize);

} /* namespace app */
} /* namespace arm */

#endif /* NOISE_REDUCTION_EVT_HANDLER_HPP */