diff options
Diffstat (limited to 'hifi/xaf/hifi-dpf/app/xa-factory.c')
-rw-r--r-- | hifi/xaf/hifi-dpf/app/xa-factory.c | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/hifi/xaf/hifi-dpf/app/xa-factory.c b/hifi/xaf/hifi-dpf/app/xa-factory.c new file mode 100644 index 00000000..b9e7d193 --- /dev/null +++ b/hifi/xaf/hifi-dpf/app/xa-factory.c @@ -0,0 +1,163 @@ +/******************************************************************************* +* 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-factory.c + * + * DSP processing framework core - component factory + * + ******************************************************************************/ + +#define MODULE_TAG FACTORY + +/******************************************************************************* + * Includes + ******************************************************************************/ + +#include "xf.h" +#include "audio/xa_type_def.h" + +/******************************************************************************* + * Tracing tags + ******************************************************************************/ + +/* ...general initialization sequence */ +TRACE_TAG(INIT, 1); + +/******************************************************************************* + * Local types definitions + ******************************************************************************/ + +/* ...component descriptor */ +typedef struct xf_component_id +{ + /* ...class id (string identifier) */ + const char *id; + + /* ...class constructor */ + xf_component_t * (*factory)(u32 core, xa_codec_func_t process); + + /* ...component API function */ + xa_codec_func_t *process; + +} xf_component_id_t; + +/******************************************************************************* + * External functions + ******************************************************************************/ + +/* ...components API functions */ +extern XA_ERRORCODE xa_pcm_codec(xa_codec_handle_t, WORD32, WORD32, pVOID); +extern XA_ERRORCODE xa_mp3_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID); +extern XA_ERRORCODE xa_aac_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID); +extern XA_ERRORCODE xa_aac_encoder(xa_codec_handle_t, WORD32, WORD32, pVOID); +extern XA_ERRORCODE xa_vorbis_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID); +extern XA_ERRORCODE xa_ac3_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID); +extern XA_ERRORCODE xa_ddplus71_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID); +extern XA_ERRORCODE xa_mixer(xa_codec_handle_t, WORD32, WORD32, pVOID); +extern XA_ERRORCODE xa_renderer(xa_codec_handle_t, WORD32, WORD32, pVOID); +extern XA_ERRORCODE xa_capturer(xa_codec_handle_t, WORD32, WORD32, pVOID); +extern XA_ERRORCODE xa_src_pp_fx(xa_codec_handle_t, WORD32, WORD32, pVOID); +extern XA_ERRORCODE xa_dts_hd_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID); +extern XA_ERRORCODE xa_dap_fx(xa_codec_handle_t, WORD32, WORD32, pVOID); + +/* ...component class factories */ +extern xf_component_t * xa_audio_codec_factory(u32 core, xa_codec_func_t process); +extern xf_component_t * xa_audio_fx_factory(u32 core, xa_codec_func_t process); +extern xf_component_t * xa_mixer_factory(u32 core, xa_codec_func_t process); +extern xf_component_t * xa_renderer_factory(u32 core,xa_codec_func_t process); + +/******************************************************************************* + * Local constants definitions + ******************************************************************************/ + +/* ...component class id */ +static const xf_component_id_t xf_component_id[] = +{ +#if XA_PCM + { "audio-decoder/pcm", xa_audio_codec_factory, xa_pcm_codec }, +#endif +#if XA_MP3_DECODER + { "audio-decoder/mp3", xa_audio_codec_factory, xa_mp3_decoder }, +#endif +#if XA_AAC_DECODER + { "audio-decoder/aac", xa_audio_codec_factory, xa_aac_decoder }, +#endif +#if XA_AC3_DECODER + { "audio-decoder/ac3", xa_audio_codec_factory, xa_ac3_decoder }, +#endif +#if XA_DDP71_DECODER + { "audio-decoder/ddplus71", xa_audio_codec_factory, xa_ddplus71_decoder }, +#endif +#if XA_DTS_HD_DECODER + { "audio-decoder/dts-hd", xa_audio_codec_factory, xa_dts_hd_decoder }, +#endif +#if XA_VORBIS_DECODER + { "audio-decoder/vorbis", xa_audio_codec_factory, xa_vorbis_decoder }, +#endif +#if XA_AAC_ENCODER + { "audio-encoder/aac", xa_audio_codec_factory, xa_aac_encoder }, +#endif +#if XA_SRC_PP_FX + { "audio-fx/src-pp", xa_audio_codec_factory, xa_src_pp_fx }, +#endif +#if XA_DAP_FX + { "audio-fx/dap", xa_audio_codec_factory, xa_dap_fx }, +#endif +#if XA_MIXER + { "mixer", xa_mixer_factory, xa_mixer }, +#endif +#if XA_RENDERER + { "renderer", xa_renderer_factory, xa_renderer }, +#endif +#if XA_CAPTURER + { "capturer", xa_capturer_factory, xa_capturer }, +#endif +}; + +/* ...number of items in the map */ +#define XF_COMPONENT_ID_MAX (sizeof(xf_component_id) / sizeof(xf_component_id[0])) + +/******************************************************************************* + * Enry points + ******************************************************************************/ + +xf_component_t * xf_component_factory(u32 core, xf_id_t id, u32 length) +{ + u32 i; + + /* ...find component-id in static map */ + for (i = 0; i < XF_COMPONENT_ID_MAX; i++) + { + /* ...symbolic search - not too good; would prefer GUIDs in some form */ + if (!strncmp(id, xf_component_id[i].id, length)) + { + /* ...pass control to specific class factory */ + return xf_component_id[i].factory(core, xf_component_id[i].process); + } + } + + /* ...component string id is not recognized */ + TRACE(ERROR, _b("Unknown component type: %s"), id); + + return NULL; +} |