You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
264 lines
12 KiB
264 lines
12 KiB
/*******************************************************************************
|
|
* 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 */
|