summaryrefslogtreecommitdiff
path: root/hifi/xaf/hifi-dpf/audio/xa-class-base.h
diff options
context:
space:
mode:
Diffstat (limited to 'hifi/xaf/hifi-dpf/audio/xa-class-base.h')
-rw-r--r--hifi/xaf/hifi-dpf/audio/xa-class-base.h263
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 */