1 /*******************************************************************************
2 * Copyright (C) 2018 Cadence Design Systems, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining
5 * a copy of this software and associated documentation files (the
6 * "Software"), to use this Software with Cadence processor cores only and
7 * not with any other processors and platforms, subject to
8 * the following conditions:
9 *
10 * The above copyright notice and this permission notice shall be included
11 * in all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
15 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
16 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
17 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
18 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
19 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 
21 ******************************************************************************/
22 
23 /*******************************************************************************
24  * xa-factory.c
25  *
26  * DSP processing framework core - component factory
27  *
28  ******************************************************************************/
29 
30 #define MODULE_TAG                      FACTORY
31 
32 /*******************************************************************************
33  * Includes
34  ******************************************************************************/
35 
36 #include "xf.h"
37 #include "audio/xa_type_def.h"
38 
39 /*******************************************************************************
40  * Tracing tags
41  ******************************************************************************/
42 
43 /* ...general initialization sequence */
44 TRACE_TAG(INIT, 1);
45 
46 /*******************************************************************************
47  * Local types definitions
48  ******************************************************************************/
49 
50 /* ...component descriptor */
51 typedef struct xf_component_id
52 {
53     /* ...class id (string identifier) */
54     const char         *id;
55 
56     /* ...class constructor */
57     xf_component_t *  (*factory)(u32 core, xa_codec_func_t process);
58 
59     /* ...component API function */
60     xa_codec_func_t    *process;
61 
62 }   xf_component_id_t;
63 
64 /*******************************************************************************
65  * External functions
66  ******************************************************************************/
67 
68 /* ...components API functions */
69 extern XA_ERRORCODE xa_pcm_codec(xa_codec_handle_t, WORD32, WORD32, pVOID);
70 extern XA_ERRORCODE xa_mp3_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID);
71 extern XA_ERRORCODE xa_aac_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID);
72 extern XA_ERRORCODE xa_aac_encoder(xa_codec_handle_t, WORD32, WORD32, pVOID);
73 extern XA_ERRORCODE xa_vorbis_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID);
74 extern XA_ERRORCODE xa_ac3_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID);
75 extern XA_ERRORCODE xa_ddplus71_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID);
76 extern XA_ERRORCODE xa_mixer(xa_codec_handle_t, WORD32, WORD32, pVOID);
77 extern XA_ERRORCODE xa_renderer(xa_codec_handle_t, WORD32, WORD32, pVOID);
78 extern XA_ERRORCODE xa_capturer(xa_codec_handle_t, WORD32, WORD32, pVOID);
79 extern XA_ERRORCODE xa_src_pp_fx(xa_codec_handle_t, WORD32, WORD32, pVOID);
80 extern XA_ERRORCODE xa_dts_hd_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID);
81 extern XA_ERRORCODE xa_dap_fx(xa_codec_handle_t, WORD32, WORD32, pVOID);
82 
83 /* ...component class factories */
84 extern xf_component_t * xa_audio_codec_factory(u32 core, xa_codec_func_t process);
85 extern xf_component_t * xa_audio_fx_factory(u32 core, xa_codec_func_t process);
86 extern xf_component_t * xa_mixer_factory(u32 core, xa_codec_func_t process);
87 extern xf_component_t * xa_renderer_factory(u32 core,xa_codec_func_t process);
88 
89 /*******************************************************************************
90  * Local constants definitions
91  ******************************************************************************/
92 
93 /* ...component class id */
94 static const xf_component_id_t xf_component_id[] =
95 {
96 #if XA_PCM
97     { "audio-decoder/pcm",      xa_audio_codec_factory,     xa_pcm_codec },
98 #endif
99 #if XA_MP3_DECODER
100     { "audio-decoder/mp3",      xa_audio_codec_factory,     xa_mp3_decoder },
101 #endif
102 #if XA_AAC_DECODER
103     { "audio-decoder/aac",      xa_audio_codec_factory,     xa_aac_decoder },
104 #endif
105 #if XA_AC3_DECODER
106     { "audio-decoder/ac3",      xa_audio_codec_factory,     xa_ac3_decoder },
107 #endif
108 #if XA_DDP71_DECODER
109     { "audio-decoder/ddplus71", xa_audio_codec_factory,     xa_ddplus71_decoder },
110 #endif
111 #if XA_DTS_HD_DECODER
112     { "audio-decoder/dts-hd",   xa_audio_codec_factory,     xa_dts_hd_decoder },
113 #endif
114 #if XA_VORBIS_DECODER
115     { "audio-decoder/vorbis",   xa_audio_codec_factory,     xa_vorbis_decoder },
116 #endif
117 #if XA_AAC_ENCODER
118     { "audio-encoder/aac",      xa_audio_codec_factory,     xa_aac_encoder },
119 #endif
120 #if XA_SRC_PP_FX
121     { "audio-fx/src-pp",        xa_audio_codec_factory,     xa_src_pp_fx },
122 #endif
123 #if XA_DAP_FX
124     { "audio-fx/dap",           xa_audio_codec_factory,     xa_dap_fx },
125 #endif
126 #if XA_MIXER
127     { "mixer",                  xa_mixer_factory,           xa_mixer },
128 #endif
129 #if XA_RENDERER
130     { "renderer",               xa_renderer_factory,        xa_renderer },
131 #endif
132 #if XA_CAPTURER
133     { "capturer",               xa_capturer_factory,        xa_capturer },
134 #endif
135 };
136 
137 /* ...number of items in the map */
138 #define XF_COMPONENT_ID_MAX     (sizeof(xf_component_id) / sizeof(xf_component_id[0]))
139 
140 /*******************************************************************************
141  * Enry points
142  ******************************************************************************/
143 
xf_component_factory(u32 core,xf_id_t id,u32 length)144 xf_component_t * xf_component_factory(u32 core, xf_id_t id, u32 length)
145 {
146     u32     i;
147 
148     /* ...find component-id in static map */
149     for (i = 0; i < XF_COMPONENT_ID_MAX; i++)
150     {
151         /* ...symbolic search - not too good; would prefer GUIDs in some form */
152         if (!strncmp(id, xf_component_id[i].id, length))
153         {
154             /* ...pass control to specific class factory */
155             return xf_component_id[i].factory(core, xf_component_id[i].process);
156         }
157     }
158 
159     /* ...component string id is not recognized */
160     TRACE(ERROR, _b("Unknown component type: %s"), id);
161 
162     return NULL;
163 }
164