1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 
18 #ifndef ANDROID_AUDIO_EFFECT_H
19 #define ANDROID_AUDIO_EFFECT_H
20 
21 #include <errno.h>
22 #include <stdint.h>
23 #include <strings.h>
24 #include <sys/cdefs.h>
25 #include <sys/types.h>
26 
27 #include <cutils/bitops.h>
28 
29 #include <system/audio_effect.h>
30 
31 
32 __BEGIN_DECLS
33 
34 
35 /////////////////////////////////////////////////
36 //      Common Definitions
37 /////////////////////////////////////////////////
38 
39 #define EFFECT_MAKE_API_VERSION(M, m)  (((M)<<16) | ((m) & 0xFFFF))
40 #define EFFECT_API_VERSION_MAJOR(v)    ((v)>>16)
41 #define EFFECT_API_VERSION_MINOR(v)    ((m) & 0xFFFF)
42 
43 
44 /////////////////////////////////////////////////
45 //      Effect control interface
46 /////////////////////////////////////////////////
47 
48 // Effect control interface version 2.0
49 #define EFFECT_CONTROL_API_VERSION EFFECT_MAKE_API_VERSION(2,0)
50 
51 // Effect control interface structure: effect_interface_s
52 // The effect control interface is exposed by each effect engine implementation. It consists of
53 // a set of functions controlling the configuration, activation and process of the engine.
54 // The functions are grouped in a structure of type effect_interface_s.
55 //
56 // Effect control interface handle: effect_handle_t
57 // The effect_handle_t serves two purposes regarding the implementation of the effect engine:
58 // - 1 it is the address of a pointer to an effect_interface_s structure where the functions
59 // of the effect control API for a particular effect are located.
60 // - 2 it is the address of the context of a particular effect instance.
61 // A typical implementation in the effect library would define a structure as follows:
62 // struct effect_module_s {
63 //        const struct effect_interface_s *itfe;
64 //        effect_config_t config;
65 //        effect_context_t context;
66 // }
67 // The implementation of EffectCreate() function would then allocate a structure of this
68 // type and return its address as effect_handle_t
69 typedef struct effect_interface_s **effect_handle_t;
70 
71 // Effect control interface definition
72 struct effect_interface_s {
73     ////////////////////////////////////////////////////////////////////////////////
74     //
75     //    Function:       process
76     //
77     //    Description:    Effect process function. Takes input samples as specified
78     //          (count and location) in input buffer descriptor and output processed
79     //          samples as specified in output buffer descriptor. If the buffer descriptor
80     //          is not specified the function must use either the buffer or the
81     //          buffer provider function installed by the EFFECT_CMD_SET_CONFIG command.
82     //          The effect framework will call the process() function after the EFFECT_CMD_ENABLE
83     //          command is received and until the EFFECT_CMD_DISABLE is received. When the engine
84     //          receives the EFFECT_CMD_DISABLE command it should turn off the effect gracefully
85     //          and when done indicate that it is OK to stop calling the process() function by
86     //          returning the -ENODATA status.
87     //
88     //    NOTE: the process() function implementation should be "real-time safe" that is
89     //      it should not perform blocking calls: malloc/free, sleep, read/write/open/close,
90     //      pthread_cond_wait/pthread_mutex_lock...
91     //
92     //    Input:
93     //          self:       handle to the effect interface this function
94     //              is called on.
95     //          inBuffer:   buffer descriptor indicating where to read samples to process.
96     //              If NULL, use the configuration passed by EFFECT_CMD_SET_CONFIG command.
97     //
98     //          outBuffer:   buffer descriptor indicating where to write processed samples.
99     //              If NULL, use the configuration passed by EFFECT_CMD_SET_CONFIG command.
100     //
101     //    Output:
102     //        returned value:    0 successful operation
103     //                          -ENODATA the engine has finished the disable phase and the framework
104     //                                  can stop calling process()
105     //                          -EINVAL invalid interface handle or
106     //                                  invalid input/output buffer description
107     ////////////////////////////////////////////////////////////////////////////////
108     int32_t (*process)(effect_handle_t self,
109                        audio_buffer_t *inBuffer,
110                        audio_buffer_t *outBuffer);
111     ////////////////////////////////////////////////////////////////////////////////
112     //
113     //    Function:       command
114     //
115     //    Description:    Send a command and receive a response to/from effect engine.
116     //
117     //    Input:
118     //          self:       handle to the effect interface this function
119     //              is called on.
120     //          cmdCode:    command code: the command can be a standardized command defined in
121     //              effect_command_e (see below) or a proprietary command.
122     //          cmdSize:    size of command in bytes
123     //          pCmdData:   pointer to command data
124     //          pReplyData: pointer to reply data
125     //
126     //    Input/Output:
127     //          replySize: maximum size of reply data as input
128     //                      actual size of reply data as output
129     //
130     //    Output:
131     //          returned value: 0       successful operation
132     //                          -EINVAL invalid interface handle or
133     //                                  invalid command/reply size or format according to
134     //                                  command code
135     //              The return code should be restricted to indicate problems related to this API
136     //              specification. Status related to the execution of a particular command should be
137     //              indicated as part of the reply field.
138     //
139     //          *pReplyData updated with command response
140     //
141     ////////////////////////////////////////////////////////////////////////////////
142     int32_t (*command)(effect_handle_t self,
143                        uint32_t cmdCode,
144                        uint32_t cmdSize,
145                        void *pCmdData,
146                        uint32_t *replySize,
147                        void *pReplyData);
148     ////////////////////////////////////////////////////////////////////////////////
149     //
150     //    Function:        get_descriptor
151     //
152     //    Description:    Returns the effect descriptor
153     //
154     //    Input:
155     //          self:       handle to the effect interface this function
156     //              is called on.
157     //
158     //    Input/Output:
159     //          pDescriptor:    address where to return the effect descriptor.
160     //
161     //    Output:
162     //        returned value:    0          successful operation.
163     //                          -EINVAL     invalid interface handle or invalid pDescriptor
164     //        *pDescriptor:     updated with the effect descriptor.
165     //
166     ////////////////////////////////////////////////////////////////////////////////
167     int32_t (*get_descriptor)(effect_handle_t self,
168                               effect_descriptor_t *pDescriptor);
169     ////////////////////////////////////////////////////////////////////////////////
170     //
171     //    Function:       process_reverse
172     //
173     //    Description:    Process reverse stream function. This function is used to pass
174     //          a reference stream to the effect engine. If the engine does not need a reference
175     //          stream, this function pointer can be set to NULL.
176     //          This function would typically implemented by an Echo Canceler.
177     //
178     //    Input:
179     //          self:       handle to the effect interface this function
180     //              is called on.
181     //          inBuffer:   buffer descriptor indicating where to read samples to process.
182     //              If NULL, use the configuration passed by EFFECT_CMD_SET_CONFIG_REVERSE command.
183     //
184     //          outBuffer:   buffer descriptor indicating where to write processed samples.
185     //              If NULL, use the configuration passed by EFFECT_CMD_SET_CONFIG_REVERSE command.
186     //              If the buffer and buffer provider in the configuration received by
187     //              EFFECT_CMD_SET_CONFIG_REVERSE are also NULL, do not return modified reverse
188     //              stream data
189     //
190     //    Output:
191     //        returned value:    0 successful operation
192     //                          -ENODATA the engine has finished the disable phase and the framework
193     //                                  can stop calling process_reverse()
194     //                          -EINVAL invalid interface handle or
195     //                                  invalid input/output buffer description
196     ////////////////////////////////////////////////////////////////////////////////
197     int32_t (*process_reverse)(effect_handle_t self,
198                                audio_buffer_t *inBuffer,
199                                audio_buffer_t *outBuffer);
200 };
201 
202 /////////////////////////////////////////////////
203 //      Effect library interface
204 /////////////////////////////////////////////////
205 
206 // Effect library interface version 3.0
207 // Note that EffectsFactory.c only checks the major version component, so changes to the minor
208 // number can only be used for fully backwards compatible changes
209 #define EFFECT_LIBRARY_API_VERSION EFFECT_MAKE_API_VERSION(3,0)
210 
211 #define AUDIO_EFFECT_LIBRARY_TAG ((('A') << 24) | (('E') << 16) | (('L') << 8) | ('T'))
212 
213 // Every effect library must have a data structure named AUDIO_EFFECT_LIBRARY_INFO_SYM
214 // and the fields of this data structure must begin with audio_effect_library_t
215 
216 typedef struct audio_effect_library_s {
217     // tag must be initialized to AUDIO_EFFECT_LIBRARY_TAG
218     uint32_t tag;
219     // Version of the effect library API : 0xMMMMmmmm MMMM: Major, mmmm: minor
220     uint32_t version;
221     // Name of this library
222     const char *name;
223     // Author/owner/implementor of the library
224     const char *implementor;
225 
226     ////////////////////////////////////////////////////////////////////////////////
227     //
228     //    Function:        create_effect
229     //
230     //    Description:    Creates an effect engine of the specified implementation uuid and
231     //          returns an effect control interface on this engine. The function will allocate the
232     //          resources for an instance of the requested effect engine and return
233     //          a handle on the effect control interface.
234     //
235     //    Input:
236     //          uuid:    pointer to the effect uuid.
237     //          sessionId:  audio session to which this effect instance will be attached.
238     //              All effects created with the same session ID are connected in series and process
239     //              the same signal stream. Knowing that two effects are part of the same effect
240     //              chain can help the library implement some kind of optimizations.
241     //          ioId:   identifies the output or input stream this effect is directed to in
242     //              audio HAL.
243     //              For future use especially with tunneled HW accelerated effects
244     //
245     //    Input/Output:
246     //          pHandle:        address where to return the effect interface handle.
247     //
248     //    Output:
249     //        returned value:    0          successful operation.
250     //                          -ENODEV     library failed to initialize
251     //                          -EINVAL     invalid pEffectUuid or pHandle
252     //                          -ENOENT     no effect with this uuid found
253     //        *pHandle:         updated with the effect interface handle.
254     //
255     ////////////////////////////////////////////////////////////////////////////////
256     int32_t (*create_effect)(const effect_uuid_t *uuid,
257                              int32_t sessionId,
258                              int32_t ioId,
259                              effect_handle_t *pHandle);
260 
261     ////////////////////////////////////////////////////////////////////////////////
262     //
263     //    Function:        release_effect
264     //
265     //    Description:    Releases the effect engine whose handle is given as argument.
266     //          All resources allocated to this particular instance of the effect are
267     //          released.
268     //
269     //    Input:
270     //          handle:         handle on the effect interface to be released.
271     //
272     //    Output:
273     //        returned value:    0          successful operation.
274     //                          -ENODEV     library failed to initialize
275     //                          -EINVAL     invalid interface handle
276     //
277     ////////////////////////////////////////////////////////////////////////////////
278     int32_t (*release_effect)(effect_handle_t handle);
279 
280     ////////////////////////////////////////////////////////////////////////////////
281     //
282     //    Function:        get_descriptor
283     //
284     //    Description:    Returns the descriptor of the effect engine which implementation UUID is
285     //          given as argument.
286     //
287     //    Input/Output:
288     //          uuid:           pointer to the effect uuid.
289     //          pDescriptor:    address where to return the effect descriptor.
290     //
291     //    Output:
292     //        returned value:    0          successful operation.
293     //                          -ENODEV     library failed to initialize
294     //                          -EINVAL     invalid pDescriptor or uuid
295     //        *pDescriptor:     updated with the effect descriptor.
296     //
297     ////////////////////////////////////////////////////////////////////////////////
298     int32_t (*get_descriptor)(const effect_uuid_t *uuid,
299                               effect_descriptor_t *pDescriptor);
300 } audio_effect_library_t;
301 
302 // Name of the hal_module_info
303 #define AUDIO_EFFECT_LIBRARY_INFO_SYM         AELI
304 
305 // Name of the hal_module_info as a string
306 #define AUDIO_EFFECT_LIBRARY_INFO_SYM_AS_STR  "AELI"
307 
308 __END_DECLS
309 
310 #endif  // ANDROID_AUDIO_EFFECT_H
311