/*******************************************************************************
* Copyright (C) 2018 Cadence Design Systems, Inc.
* 
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to use this Software with Cadence processor cores only and 
* not with any other processors and platforms, subject to
* the following conditions:
* 
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

******************************************************************************/

/*******************************************************************************
 * xa-class-base.h
 *
 * Generic Xtensa Audio codecs interfaces
 *
 ******************************************************************************/

#ifndef __XA_CLASS_BASE_H
#define __XA_CLASS_BASE_H

/*******************************************************************************
 * Includes
 ******************************************************************************/

/* ...audio-specific API */
#include "audio/xa_type_def.h"
#include "audio/xa_error_standards.h"
#include "audio/xa_apicmd_standards.h"
#include "audio/xa_memory_standards.h"

/*******************************************************************************
 * Generic codec structure
 ******************************************************************************/

typedef struct XACodecBase XACodecBase;

/* ...memory buffer initialization */
typedef XA_ERRORCODE  (*xa_codec_memtab_f)(XACodecBase *codec, WORD32 i, WORD32 type, WORD32 size, WORD32 align, u32 core);

/* ...preprocessing operation */
typedef XA_ERRORCODE  (*xa_codec_preprocess_f)(XACodecBase *);

/* ...postprocessing operation */
typedef XA_ERRORCODE  (*xa_codec_postprocess_f)(XACodecBase *, int);

/* ...parameter setting function */
typedef XA_ERRORCODE  (*xa_codec_setparam_f)(XACodecBase *, WORD32, pVOID p);

/* ...parameter retrival function */
typedef XA_ERRORCODE  (*xa_codec_getparam_f)(XACodecBase *, WORD32, pVOID p);

/*******************************************************************************
 * Codec instance structure
 ******************************************************************************/

struct XACodecBase
{
    /***************************************************************************
     * Control data
     **************************************************************************/

    /* ...generic component handle */
    xf_component_t          component;

    /* ...codec API entry point (function) */
    xa_codec_func_t        *process;

    /* ...codec API handle, passed to *process */
    xf_mm_buffer_t          api;

    /* ...memory table buffer */
    xf_mm_buffer_t          mem_tabs;

    /* ...persistent memory buffer */
    xf_mm_buffer_t          persist;

    /* ...scratch memory pointer */
    void                   *scratch;

    /* ...codec control state */
    u32                     state;

    /***************************************************************************
     * Codec-specific methods
     **************************************************************************/

    /* ...memory buffer initialization */
    xa_codec_memtab_f       memtab;
 
    /* ...preprocessing function */
    xa_codec_preprocess_f   preprocess;

    /* ...postprocessing function */
    xa_codec_postprocess_f  postprocess;

    /* ...configuration parameter setting function */
    xa_codec_setparam_f     setparam;

    /* ...configuration parameter retrieval function */
    xa_codec_getparam_f     getparam;
    
    /* ...command-processing table */
    XA_ERRORCODE (* const * command)(XACodecBase *, xf_message_t *);
    
    /* ...command-processing table size */
    u32                     command_num;
};

/*******************************************************************************
 * Base codec execution flags
 ******************************************************************************/

/* ...codec static initialization completed */
#define XA_BASE_FLAG_POSTINIT           (1 << 0)

/* ...codec runtime initialization sequence */
#define XA_BASE_FLAG_RUNTIME_INIT       (1 << 1)

/* ...codec steady execution state */
#define XA_BASE_FLAG_EXECUTION          (1 << 2)

/* ...execution stage completed */
#define XA_BASE_FLAG_COMPLETED          (1 << 3)

/* ...data processing scheduling flag */
#define XA_BASE_FLAG_SCHEDULE           (1 << 4)

/* ...base codec flags accessor */
#define __XA_BASE_FLAGS(flags)          ((flags) & ((1 << 5) - 1))

/* ...custom execution flag */
#define __XA_BASE_FLAG(f)               ((f) << 5)

/*******************************************************************************
 * Local macros definitions
 ******************************************************************************/

/* ...audio-framework API function execution */
#define XA_CHK(cond)                            \
({                                              \
    XA_ERRORCODE  __e = (cond);                 \
    if (__e != XA_NO_ERROR)                     \
    {                                           \
        if (XA_ERROR_SEVERITY(__e))             \
        {                                       \
            TRACE(ERROR, _x("error: %X"), __e); \
            return __e;                         \
        }                                       \
        TRACE(WARNING, _x("warning: %X"), __e); \
    }                                           \
    __e;                                        \
})

/* ...low-level codec API function execution */
#define XA_API(codec, cmd, idx, pv)                                                         \
({                                                                                          \
    XA_ERRORCODE  __e;                                                                      \
    __e = (codec)->process((xa_codec_handle_t)(codec)->api.addr, (cmd), (idx), (pv));       \
    if (__e != XA_NO_ERROR)                                                                 \
    {                                                                                       \
        if (XA_ERROR_SEVERITY(__e))                                                         \
        {                                                                                   \
            TRACE(ERROR, _x("[%p]:(%d, %d, %p): %X"), (codec), (cmd), (idx), (pv), __e);    \
            return __e;                                                                     \
        }                                                                                   \
        TRACE(WARNING, _x("%X"), __e);                                                      \
    }                                                                                       \
    __e;                                                                                    \
})

#define XA_API_NORET(codec, cmd, idx, pv)                                                   \
({                                                                                          \
    XA_ERRORCODE  __e;                                                                      \
    __e = (codec)->process((xa_codec_handle_t)(codec)->api.addr, (cmd), (idx), (pv));       \
    if (__e != XA_NO_ERROR)                                                                 \
    {                                                                                       \
        if (XA_ERROR_SEVERITY(__e))                                                         \
        {                                                                                   \
            TRACE(ERROR, _x("[%p]:(%d, %d, %p): %X"), (codec), (cmd), (idx), (pv), __e);    \
        }                                                                                   \
        TRACE(WARNING, _x("%X"), __e);                                                      \
    }                                                                                       \
    __e;                                                                                    \
})

/* ...codec hook invocation */
#define CODEC_API(codec, func, ...)                                 \
({                                                                  \
    XA_ERRORCODE    __e = (codec)->func((codec), ##__VA_ARGS__);    \
                                                                    \
    if (__e != XA_NO_ERROR)                                         \
    {                                                               \
        if (XA_ERROR_SEVERITY(__e))                                 \
        {                                                           \
            /* ...actual error is reported by the codec */          \
            TRACE(ERROR, _x("[%p]: " #func ": %X"), (codec), __e);  \
            return __e;                                             \
        }                                                           \
                                                                    \
        TRACE(WARNING, _x("warning: %X"), __e);                     \
    }                                                               \
    __e;                                                            \
})

/* ...allocate local memory on specific core */
#define XMALLOC(p, size, align, core)                                           \
do                                                                              \
{                                                                               \
    if (xf_mm_alloc_buffer((size), (align), (core), (p)) != 0)                  \
    {                                                                           \
        TRACE(ERROR, _x("Failed to allocate %d bytes of memory"), (size));      \
        return XA_API_FATAL_MEM_ALLOC;                                          \
    }                                                                           \
                                                                                \
    if (((u32)((p)->addr) & ((align) - 1)) != 0)                                \
    {                                                                           \
        TRACE(ERROR, _x("Invalid %d-algnment: %p"), (align), (p)->addr);        \
        return XA_API_FATAL_MEM_ALIGN;                                          \
    }                                                                           \
}                                                                               \
while (0)

/*******************************************************************************
 * Public API
 ******************************************************************************/

/* ...SET-PARAM processing */
extern XA_ERRORCODE xa_base_set_param(XACodecBase *base, xf_message_t *m);

/* ...GET-PARAM-EXT message processing */
extern XA_ERRORCODE xa_base_set_param_ext(XACodecBase *base, xf_message_t *m);

/* ...GET-PARAM message processing */
extern XA_ERRORCODE xa_base_get_param(XACodecBase *base, xf_message_t *m);

/* ...GET-PARAM-EXT message processing */
extern XA_ERRORCODE xa_base_get_param_ext(XACodecBase *base, xf_message_t *m);

/* ...data processing scheduling */
extern void xa_base_schedule(XACodecBase *base, u32 dts);

/* ...cancel internal scheduling message */
extern void xa_base_cancel(XACodecBase *base);

/* ...base codec factory */
extern XACodecBase * xa_base_factory(u32 core, u32 size, xa_codec_func_t process);

/* ...base codec destructor */
extern void xa_base_destroy(XACodecBase *base, u32 size, u32 core);

#endif  /* __XA_CLASS_BASE_H */
