/*
 * Copyright  2019 NXP
 * All rights reserved.
 *
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include "fsl_codec_adapter.h"
#include "fsl_codec_common.h"

/*******************************************************************************
 * Definitions
 ******************************************************************************/

/*******************************************************************************
 * Prototypes
 ******************************************************************************/

/*******************************************************************************
 * Variables
 ******************************************************************************/

/*******************************************************************************
 * Code
 ******************************************************************************/
/*!
 * brief Codec initilization.
 *
 * param handle codec handle.
 * param config codec configuration.
 * return kStatus_Success is success, else initial failed.
 */
status_t HAL_CODEC_Init(void *handle, void *config)
{
    assert((config != NULL) && (handle != NULL));

    codec_config_t *codecConfig = (codec_config_t *)config;
    status_t retVal             = kStatus_Success;

    switch (codecConfig->codecDevType)
    {
#ifdef CODEC_WM8904_ENABLE
        case kCODEC_WM8904:
            retVal = HAL_CODEC_WM8904_Init(handle, config);
            break;
#endif

#ifdef CODEC_WM8960_ENABLE
        case kCODEC_WM8960:
            retVal = HAL_CODEC_WM8960_Init(handle, config);
            break;
#endif

#ifdef CODEC_WM8524_ENABLE
        case kCODEC_WM8524:
            retVal = HAL_CODEC_WM8524_Init(handle, config);
            break;
#endif

#ifdef CODEC_SGTL5000_ENABLE
        case kCODEC_SGTL5000:
            retVal = HAL_CODEC_SGTL5000_Init(handle, config);
            break;
#endif

#ifdef CODEC_DA7212_ENABLE
        case kCODEC_DA7212:
            retVal = HAL_CODEC_DA7212_Init(handle, config);
            break;
#endif

#ifdef CODEC_CS42888_ENABLE
        case kCODEC_CS42888:
            retVal = HAL_CODEC_CS42888_Init(handle, config);
            break;
#endif

#ifdef CODEC_AK4497_ENABLE
        case kCODEC_AK4497:
            retVal = HAL_CODEC_AK4497_Init(handle, config);
            break;
#endif

#ifdef CODEC_AK4458_ENABLE
        case kCODEC_AK4458:
            retVal = HAL_CODEC_AK4458_Init(handle, config);
            break;
#endif

#ifdef CODEC_TFA9XXX_ENABLE
        case kCODEC_TFA9XXX:
            retVal = HAL_CODEC_TFA9XXX_Init(handle, config);
            break;
#endif

#ifdef CODEC_TFA9896_ENABLE
        case kCODEC_TFA9896:
            retVal = HAL_CODEC_TFA9896_Init(handle, config);
            break;
#endif
        default:
            return kStatus_InvalidArgument;
    }

    return retVal;
}

/*!
 * brief Codec de-initilization.
 *
 * param handle codec handle.
 * return kStatus_Success is success, else de-initial failed.
 */
status_t HAL_CODEC_Deinit(void *handle)
{
    assert(handle != NULL);
    status_t retVal = kStatus_Success;

    switch (((codec_handle_t *)handle)->codecConfig->codecDevType)
    {
#ifdef CODEC_WM8904_ENABLE
        case kCODEC_WM8904:
            retVal = HAL_CODEC_WM8904_Deinit(handle);
            break;
#endif

#ifdef CODEC_WM8960_ENABLE
        case kCODEC_WM8960:
            retVal = HAL_CODEC_WM8960_Deinit(handle);
            break;
#endif

#ifdef CODEC_WM8524_ENABLE
        case kCODEC_WM8524:
            retVal = HAL_CODEC_WM8524_Deinit(handle);
            break;
#endif

#ifdef CODEC_SGTL5000_ENABLE
        case kCODEC_SGTL5000:
            retVal = HAL_CODEC_SGTL5000_Deinit(handle);
            break;
#endif

#ifdef CODEC_DA7212_ENABLE
        case kCODEC_DA7212:
            retVal = HAL_CODEC_DA7212_Deinit(handle);
            break;
#endif

#ifdef CODEC_CS42888_ENABLE
        case kCODEC_CS42888:
            retVal = HAL_CODEC_CS42888_Deinit(handle);
            break;
#endif

#ifdef CODEC_AK4497_ENABLE
        case kCODEC_AK4497:
            retVal = HAL_CODEC_AK4497_Deinit(handle);
            break;
#endif

#ifdef CODEC_AK4458_ENABLE
        case kCODEC_AK4458:
            retVal = HAL_CODEC_AK4458_Deinit(handle);
            break;
#endif

#ifdef CODEC_TFA9XXX_ENABLE
        case kCODEC_TFA9XXX:
            retVal = HAL_CODEC_TFA9XXX_Deinit(handle);
            break;
#endif
        default:
            return kStatus_InvalidArgument;
    }

    return retVal;
}

/*!
 * brief set audio data format.
 *
 * param handle codec handle.
 * param mclk master clock frequency in HZ.
 * param sampleRate sample rate in HZ.
 * param bitWidth bit width.
 * return kStatus_Success is success, else configure failed.
 */
status_t HAL_CODEC_SetFormat(void *handle, uint32_t mclk, uint32_t sampleRate, uint32_t bitWidth)
{
    assert(handle != NULL);
    status_t retVal = kStatus_Success;

    switch (((codec_handle_t *)handle)->codecConfig->codecDevType)
    {
#ifdef CODEC_WM8904_ENABLE
        case kCODEC_WM8904:
            retVal = HAL_CODEC_WM8904_SetFormat(handle, mclk, sampleRate, bitWidth);
            break;
#endif

#ifdef CODEC_WM8960_ENABLE
        case kCODEC_WM8960:
            retVal = HAL_CODEC_WM8960_SetFormat(handle, mclk, sampleRate, bitWidth);
            break;
#endif

#ifdef CODEC_WM8524_ENABLE
        case kCODEC_WM8524:
            retVal = HAL_CODEC_WM8524_SetFormat(handle, mclk, sampleRate, bitWidth);
            break;
#endif

#ifdef CODEC_SGTL5000_ENABLE
        case kCODEC_SGTL5000:
            retVal = HAL_CODEC_SGTL5000_SetFormat(handle, mclk, sampleRate, bitWidth);
            break;
#endif

#ifdef CODEC_DA7212_ENABLE
        case kCODEC_DA7212:
            retVal = HAL_CODEC_DA7212_SetFormat(handle, mclk, sampleRate, bitWidth);
            break;
#endif

#ifdef CODEC_CS42888_ENABLE
        case kCODEC_CS42888:
            retVal = HAL_CODEC_CS42888_SetFormat(handle, mclk, sampleRate, bitWidth);
            break;
#endif

#ifdef CODEC_AK4497_ENABLE
        case kCODEC_AK4497:
            retVal = HAL_CODEC_AK4497_SetFormat(handle, mclk, sampleRate, bitWidth);
            break;
#endif

#ifdef CODEC_AK4458_ENABLE
        case kCODEC_AK4458:
            retVal = HAL_CODEC_AK4458_SetFormat(handle, mclk, sampleRate, bitWidth);
            break;
#endif

#ifdef CODEC_TFA9XXX_ENABLE
        case kCODEC_TFA9XXX:
            retVal = HAL_CODEC_TFA9XXX_SetFormat(handle, mclk, sampleRate, bitWidth);
            break;
#endif
        default:
            return kStatus_InvalidArgument;
    }

    return retVal;
}

/*!
 * brief set audio codec module volume.
 *
 * param handle codec handle.
 * param channel audio codec play channel, can be a value or combine value of _codec_play_channel.
 * param volume volume value, support 0 ~ 100, 0 is mute, 100 is the maximum volume value.
 * return kStatus_Success is success, else configure failed.
 */
status_t HAL_CODEC_SetVolume(void *handle, uint32_t playChannel, uint32_t volume)
{
    assert(handle != NULL);
    status_t retVal = kStatus_Success;

    switch (((codec_handle_t *)handle)->codecConfig->codecDevType)
    {
#ifdef CODEC_WM8904_ENABLE
        case kCODEC_WM8904:
            retVal = HAL_CODEC_WM8904_SetVolume(handle, playChannel, volume);
            break;
#endif

#ifdef CODEC_WM8960_ENABLE
        case kCODEC_WM8960:
            retVal = HAL_CODEC_WM8960_SetVolume(handle, playChannel, volume);
            break;
#endif

#ifdef CODEC_WM8524_ENABLE
        case kCODEC_WM8524:
            retVal = HAL_CODEC_WM8524_SetVolume(handle, playChannel, volume);
            break;
#endif

#ifdef CODEC_SGTL5000_ENABLE
        case kCODEC_SGTL5000:
            retVal = HAL_CODEC_SGTL5000_SetVolume(handle, playChannel, volume);
            break;
#endif

#ifdef CODEC_DA7212_ENABLE
        case kCODEC_DA7212:
            retVal = HAL_CODEC_DA7212_SetVolume(handle, playChannel, volume);
            break;
#endif

#ifdef CODEC_CS42888_ENABLE
        case kCODEC_CS42888:
            retVal = HAL_CODEC_CS42888_SetVolume(handle, playChannel, volume);
            break;
#endif

#ifdef CODEC_AK4497_ENABLE
        case kCODEC_AK4497:
            retVal = HAL_CODEC_AK4497_SetVolume(handle, playChannel, volume);
            break;
#endif

#ifdef CODEC_AK4458_ENABLE
        case kCODEC_AK4458:
            retVal = HAL_CODEC_AK4458_SetVolume(handle, playChannel, volume);
            break;
#endif

#ifdef CODEC_TFA9XXX_ENABLE
        case kCODEC_TFA9XXX:
            retVal = HAL_CODEC_TFA9XXX_SetVolume(handle, playChannel, volume);
            break;
#endif
        default:
            return kStatus_InvalidArgument;
    }

    return retVal;
}

/*!
 * brief set audio codec module mute.
 *
 * param handle codec handle.
 * param channel audio codec play channel, can be a value or combine value of _codec_play_channel.
 * param isMute true is mute, false is unmute.
 * return kStatus_Success is success, else configure failed.
 */
status_t HAL_CODEC_SetMute(void *handle, uint32_t playChannel, bool isMute)
{
    assert(handle != NULL);
    status_t retVal = kStatus_Success;

    switch (((codec_handle_t *)handle)->codecConfig->codecDevType)
    {
#ifdef CODEC_WM8904_ENABLE
        case kCODEC_WM8904:
            retVal = HAL_CODEC_WM8904_SetMute(handle, playChannel, isMute);
            break;
#endif

#ifdef CODEC_WM8960_ENABLE
        case kCODEC_WM8960:
            retVal = HAL_CODEC_WM8960_SetMute(handle, playChannel, isMute);
            break;
#endif

#ifdef CODEC_WM8524_ENABLE
        case kCODEC_WM8524:
            retVal = HAL_CODEC_WM8524_SetMute(handle, playChannel, isMute);
            break;
#endif

#ifdef CODEC_SGTL5000_ENABLE
        case kCODEC_SGTL5000:
            retVal = HAL_CODEC_SGTL5000_SetMute(handle, playChannel, isMute);
            break;
#endif

#ifdef CODEC_DA7212_ENABLE
        case kCODEC_DA7212:
            retVal = HAL_CODEC_DA7212_SetMute(handle, playChannel, isMute);
            break;
#endif

#ifdef CODEC_CS42888_ENABLE
        case kCODEC_CS42888:
            retVal = HAL_CODEC_CS42888_SetMute(handle, playChannel, isMute);
            break;
#endif

#ifdef CODEC_AK4497_ENABLE
        case kCODEC_AK4497:
            retVal = HAL_CODEC_AK4497_SetMute(handle, playChannel, isMute);
            break;
#endif

#ifdef CODEC_AK4458_ENABLE
        case kCODEC_AK4458:
            retVal = HAL_CODEC_AK4458_SetMute(handle, playChannel, isMute);
            break;
#endif

#ifdef CODEC_TFA9XXX_ENABLE
        case kCODEC_TFA9XXX:
            retVal = HAL_CODEC_TFA9XXX_SetMute(handle, playChannel, isMute);
            break;
#endif
        default:
            return kStatus_InvalidArgument;
    }

    return retVal;
}

/*!
 * brief set audio codec module power.
 *
 * param handle codec handle.
 * param module audio codec module.
 * param powerOn true is power on, false is power down.
 * return kStatus_Success is success, else configure failed.
 */
status_t HAL_CODEC_SetPower(void *handle, uint32_t module, bool powerOn)
{
    assert(handle != NULL);
    status_t retVal = kStatus_Success;

    switch (((codec_handle_t *)handle)->codecConfig->codecDevType)
    {
#ifdef CODEC_WM8904_ENABLE
        case kCODEC_WM8904:
            retVal = HAL_CODEC_WM8904_SetPower(handle, module, powerOn);
            break;
#endif

#ifdef CODEC_WM8960_ENABLE
        case kCODEC_WM8960:
            retVal = HAL_CODEC_WM8960_SetPower(handle, module, powerOn);
            break;
#endif

#ifdef CODEC_WM8524_ENABLE
        case kCODEC_WM8524:
            retVal = HAL_CODEC_WM8524_SetPower(handle, module, powerOn);
            break;
#endif

#ifdef CODEC_SGTL5000_ENABLE
        case kCODEC_SGTL5000:
            retVal = HAL_CODEC_SGTL5000_SetPower(handle, module, powerOn);
            break;
#endif

#ifdef CODEC_DA7212_ENABLE
        case kCODEC_DA7212:
            retVal = HAL_CODEC_DA7212_SetPower(handle, module, powerOn);
            break;
#endif

#ifdef CODEC_CS42888_ENABLE
        case kCODEC_CS42888:
            retVal = HAL_CODEC_CS42888_SetPower(handle, module, powerOn);
            break;
#endif

#ifdef CODEC_AK4497_ENABLE
        case kCODEC_AK4497:
            retVal = HAL_CODEC_AK4497_SetPower(handle, module, powerOn);
            break;
#endif

#ifdef CODEC_AK4458_ENABLE
        case kCODEC_AK4458:
            retVal = HAL_CODEC_AK4458_SetPower(handle, module, powerOn);
            break;
#endif

#ifdef CODEC_TFA9XXX_ENABLE
        case kCODEC_TFA9XXX:
            retVal = HAL_CODEC_TFA9XXX_SetPower(handle, module, powerOn);
            break;
#endif
        default:
            return kStatus_InvalidArgument;
    }

    return retVal;
}

/*!
 * brief codec set record source.
 *
 * param handle codec handle.
 * param source audio codec record source, can be a value or combine value of _codec_record_source.
 *
 * return kStatus_Success is success, else configure failed.
 */
status_t HAL_CODEC_SetRecord(void *handle, uint32_t recordSource)
{
    assert(handle != NULL);
    status_t retVal = kStatus_Success;

    switch (((codec_handle_t *)handle)->codecConfig->codecDevType)
    {
#ifdef CODEC_WM8904_ENABLE
        case kCODEC_WM8904:
            retVal = HAL_CODEC_WM8904_SetRecord(handle, recordSource);
            break;
#endif

#ifdef CODEC_WM8960_ENABLE
        case kCODEC_WM8960:
            retVal = HAL_CODEC_WM8960_SetRecord(handle, recordSource);
            break;
#endif

#ifdef CODEC_WM8524_ENABLE
        case kCODEC_WM8524:
            retVal = HAL_CODEC_WM8524_SetRecord(handle, recordSource);
            break;
#endif

#ifdef CODEC_SGTL5000_ENABLE
        case kCODEC_SGTL5000:
            retVal = HAL_CODEC_SGTL5000_SetRecord(handle, recordSource);
            break;
#endif

#ifdef CODEC_DA7212_ENABLE
        case kCODEC_DA7212:
            retVal = HAL_CODEC_DA7212_SetRecord(handle, recordSource);
            break;
#endif

#ifdef CODEC_CS42888_ENABLE
        case kCODEC_CS42888:
            retVal = HAL_CODEC_CS42888_SetRecord(handle, recordSource);
            break;
#endif

#ifdef CODEC_AK4497_ENABLE
        case kCODEC_AK4497:
            retVal = HAL_CODEC_AK4497_SetRecord(handle, recordSource);
            break;
#endif

#ifdef CODEC_AK4458_ENABLE
        case kCODEC_AK4458:
            retVal = HAL_CODEC_AK4458_SetRecord(handle, recordSource);
            break;
#endif

#ifdef CODEC_TFA9XXX_ENABLE
        case kCODEC_TFA9XXX:
            retVal = HAL_CODEC_TFA9XXX_SetRecord(handle, recordSource);
            break;
#endif
        default:
            return kStatus_InvalidArgument;
    }

    return retVal;
}

/*!
 * brief codec set record channel.
 *
 * param handle codec handle.
 * param leftRecordChannel audio codec record channel, reference _codec_record_channel, can be a value or combine value
 of member in _codec_record_channel.
 * param rightRecordChannel audio codec record channel, reference _codec_record_channel, can be a value combine of
 member in _codec_record_channel.

 * return kStatus_Success is success, else configure failed.
 */
status_t HAL_CODEC_SetRecordChannel(void *handle, uint32_t leftRecordChannel, uint32_t rightRecordChannel)
{
    assert(handle != NULL);
    status_t retVal = kStatus_Success;

    switch (((codec_handle_t *)handle)->codecConfig->codecDevType)
    {
#ifdef CODEC_WM8904_ENABLE
        case kCODEC_WM8904:
            retVal = HAL_CODEC_WM8904_SetRecordChannel(handle, leftRecordChannel, rightRecordChannel);
            break;
#endif

#ifdef CODEC_WM8960_ENABLE
        case kCODEC_WM8960:
            retVal = HAL_CODEC_WM8960_SetRecordChannel(handle, leftRecordChannel, rightRecordChannel);
            break;
#endif

#ifdef CODEC_WM8524_ENABLE
        case kCODEC_WM8524:
            retVal = HAL_CODEC_WM8524_SetRecordChannel(handle, leftRecordChannel, rightRecordChannel);
            break;
#endif

#ifdef CODEC_SGTL5000_ENABLE
        case kCODEC_SGTL5000:
            retVal = HAL_CODEC_SGTL5000_SetRecordChannel(handle, leftRecordChannel, rightRecordChannel);
            break;
#endif

#ifdef CODEC_DA7212_ENABLE
        case kCODEC_DA7212:
            retVal = HAL_CODEC_DA7212_SetRecordChannel(handle, leftRecordChannel, rightRecordChannel);
            break;
#endif

#ifdef CODEC_CS42888_ENABLE
        case kCODEC_CS42888:
            retVal = HAL_CODEC_CS42888_SetRecordChannel(handle, leftRecordChannel, rightRecordChannel);
            break;
#endif

#ifdef CODEC_AK4497_ENABLE
        case kCODEC_AK4497:
            retVal = HAL_CODEC_AK4497_SetRecordChannel(handle, leftRecordChannel, rightRecordChannel);
            break;
#endif

#ifdef CODEC_AK4458_ENABLE
        case kCODEC_AK4458:
            retVal = HAL_CODEC_AK4458_SetRecordChannel(handle, leftRecordChannel, rightRecordChannel);
            break;
#endif

#ifdef CODEC_TFA9XXX_ENABLE
        case kCODEC_TFA9XXX:
            retVal = HAL_CODEC_TFA9XXX_SetRecordChannel(handle, leftRecordChannel, rightRecordChannel);
            break;
#endif
        default:
            return kStatus_InvalidArgument;
    }

    return retVal;
}

/*!
 * brief codec set play source.
 *
 * param handle codec handle.
 * param playSource audio codec play source, can be a value or combine value of _codec_play_source.
 *
 * return kStatus_Success is success, else configure failed.
 */
status_t HAL_CODEC_SetPlay(void *handle, uint32_t playSource)
{
    assert(handle != NULL);
    status_t retVal = kStatus_Success;

    switch (((codec_handle_t *)handle)->codecConfig->codecDevType)
    {
#ifdef CODEC_WM8904_ENABLE
        case kCODEC_WM8904:
            retVal = HAL_CODEC_WM8904_SetPlay(handle, playSource);
            break;
#endif

#ifdef CODEC_WM8960_ENABLE
        case kCODEC_WM8960:
            retVal = HAL_CODEC_WM8960_SetPlay(handle, playSource);
            break;
#endif

#ifdef CODEC_WM8524_ENABLE
        case kCODEC_WM8524:
            retVal = HAL_CODEC_WM8524_SetPlay(handle, playSource);
            break;
#endif

#ifdef CODEC_SGTL5000_ENABLE
        case kCODEC_SGTL5000:
            retVal = HAL_CODEC_SGTL5000_SetPlay(handle, playSource);
            break;
#endif

#ifdef CODEC_DA7212_ENABLE
        case kCODEC_DA7212:
            retVal = HAL_CODEC_DA7212_SetPlay(handle, playSource);
            break;
#endif

#ifdef CODEC_CS42888_ENABLE
        case kCODEC_CS42888:
            retVal = HAL_CODEC_CS42888_SetPlay(handle, playSource);
            break;
#endif

#ifdef CODEC_AK4497_ENABLE
        case kCODEC_AK4497:
            retVal = HAL_CODEC_AK4497_SetPlay(handle, playSource);
            break;
#endif

#ifdef CODEC_AK4458_ENABLE
        case kCODEC_AK4458:
            retVal = HAL_CODEC_AK4458_SetPlay(handle, playSource);
            break;
#endif

#ifdef CODEC_TFA9XXX_ENABLE
        case kCODEC_TFA9XXX:
            retVal = HAL_CODEC_TFA9XXX_SetPlay(handle, playSource);
            break;
#endif
        default:
            return kStatus_InvalidArgument;
    }

    return retVal;
}

/*!
 * brief codec module control.
 *
 * This function is used for codec module control, support switch digital interface cmd, can be expand to support codec
 * module specific feature
 *
 * param handle codec handle.
 * param cmd module control cmd, reference _codec_module_ctrl_cmd.
 * param data value to write, when cmd is kCODEC_ModuleRecordSourceChannel, the data should be a value combine
 *  of channel and source, please reference macro CODEC_MODULE_RECORD_SOURCE_CHANNEL(source, LP, LN, RP, RN), reference
 *  codec specific driver for detail configurations.
 * return kStatus_Success is success, else configure failed.
 */
status_t HAL_CODEC_ModuleControl(void *handle, uint32_t cmd, uint32_t data)
{
    assert(handle != NULL);
    status_t retVal = kStatus_Success;

    switch (((codec_handle_t *)handle)->codecConfig->codecDevType)
    {
#ifdef CODEC_WM8904_ENABLE
        case kCODEC_WM8904:
            retVal = HAL_CODEC_WM8904_ModuleControl(handle, cmd, data);
            break;
#endif

#ifdef CODEC_WM8960_ENABLE
        case kCODEC_WM8960:
            retVal = HAL_CODEC_WM8960_ModuleControl(handle, cmd, data);
            break;
#endif

#ifdef CODEC_WM8524_ENABLE
        case kCODEC_WM8524:
            retVal = HAL_CODEC_WM8524_ModuleControl(handle, cmd, data);
            break;
#endif

#ifdef CODEC_SGTL5000_ENABLE
        case kCODEC_SGTL5000:
            retVal = HAL_CODEC_SGTL5000_ModuleControl(handle, cmd, data);
            break;
#endif

#ifdef CODEC_DA7212_ENABLE
        case kCODEC_DA7212:
            retVal = HAL_CODEC_DA7212_ModuleControl(handle, cmd, data);
            break;
#endif

#ifdef CODEC_CS42888_ENABLE
        case kCODEC_CS42888:
            retVal = HAL_CODEC_CS42888_ModuleControl(handle, cmd, data);
            break;
#endif

#ifdef CODEC_AK4497_ENABLE
        case kCODEC_AK4497:
            retVal = HAL_CODEC_AK4497_ModuleControl(handle, cmd, data);
            break;
#endif

#ifdef CODEC_AK4458_ENABLE
        case kCODEC_AK4458:
            retVal = HAL_CODEC_AK4458_ModuleControl(handle, cmd, data);
            break;
#endif

        default:
            return kStatus_InvalidArgument;
    }

    return retVal;
}
