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