diff options
Diffstat (limited to 'hifi/xaf/hifi-dpf/audio/xa-class-base.h')
-rw-r--r-- | hifi/xaf/hifi-dpf/audio/xa-class-base.h | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/hifi/xaf/hifi-dpf/audio/xa-class-base.h b/hifi/xaf/hifi-dpf/audio/xa-class-base.h new file mode 100644 index 00000000..252044d4 --- /dev/null +++ b/hifi/xaf/hifi-dpf/audio/xa-class-base.h @@ -0,0 +1,263 @@ +/******************************************************************************* +* 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 */ |