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