/******************************************************************************* * 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; }