blob: f4c50a20aa0e7dae7ac5ae2a0ef6112ca992fe5e [file] [log] [blame]
Kevin Rocard0349c2f2019-09-30 19:53:00 +01001/*
2 * Copyright (C) 2019 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
17package android.hardware.audio.effect@6.0;
18
19import android.hardware.audio.common@6.0;
20import IEffectBufferProviderCallback;
21
22interface IEffect {
23 /**
24 * Initialize effect engine--all configurations return to default.
25 *
26 * @return retval operation completion status.
27 */
28 @entry
29 init() generates (Result retval);
30
31 /**
32 * Apply new audio parameters configurations for input and output buffers.
33 * The provider callbacks may be empty, but in this case the buffer
34 * must be provided in the EffectConfig structure.
35 *
36 * @param config configuration descriptor.
37 * @param inputBufferProvider optional buffer provider reference.
38 * @param outputBufferProvider optional buffer provider reference.
39 * @return retval operation completion status.
40 */
41 setConfig(EffectConfig config,
42 IEffectBufferProviderCallback inputBufferProvider,
43 IEffectBufferProviderCallback outputBufferProvider)
44 generates (Result retval);
45
46 /**
47 * Reset the effect engine. Keep configuration but resets state and buffer
48 * content.
49 *
50 * @return retval operation completion status.
51 */
52 reset() generates (Result retval);
53
54 /**
55 * Enable processing.
56 *
57 * @return retval operation completion status.
58 */
59 @callflow(next={"prepareForProcessing"})
60 enable() generates (Result retval);
61
62 /**
63 * Disable processing.
64 *
65 * @return retval operation completion status.
66 */
67 @callflow(next={"close"})
68 disable() generates (Result retval);
69
70 /**
71 * Set the rendering device the audio output path is connected to. The
72 * effect implementation must set EFFECT_FLAG_DEVICE_IND flag in its
73 * descriptor to receive this command when the device changes.
74 *
75 * Note: this method is only supported for effects inserted into
76 * the output chain.
77 *
78 * @param device output device specification.
79 * @return retval operation completion status.
80 */
81 setDevice(bitfield<AudioDevice> device) generates (Result retval);
82
83 /**
84 * Set and get volume. Used by audio framework to delegate volume control to
85 * effect engine. The effect implementation must set EFFECT_FLAG_VOLUME_CTRL
86 * flag in its descriptor to receive this command. The effect engine must
87 * return the volume that should be applied before the effect is
88 * processed. The overall volume (the volume actually applied by the effect
89 * engine multiplied by the returned value) should match the value indicated
90 * in the command.
91 *
92 * @param volumes vector containing volume for each channel defined in
93 * EffectConfig for output buffer expressed in 8.24 fixed
94 * point format.
95 * @return result updated volume values.
96 * @return retval operation completion status.
97 */
98 setAndGetVolume(vec<uint32_t> volumes)
99 generates (Result retval, vec<uint32_t> result);
100
101 /**
102 * Notify the effect of the volume change. The effect implementation must
103 * set EFFECT_FLAG_VOLUME_IND flag in its descriptor to receive this
104 * command.
105 *
106 * @param volumes vector containing volume for each channel defined in
107 * EffectConfig for output buffer expressed in 8.24 fixed
108 * point format.
109 * @return retval operation completion status.
110 */
111 volumeChangeNotification(vec<uint32_t> volumes)
112 generates (Result retval);
113
114 /**
115 * Set the audio mode. The effect implementation must set
116 * EFFECT_FLAG_AUDIO_MODE_IND flag in its descriptor to receive this command
117 * when the audio mode changes.
118 *
119 * @param mode desired audio mode.
120 * @return retval operation completion status.
121 */
122 setAudioMode(AudioMode mode) generates (Result retval);
123
124 /**
125 * Apply new audio parameters configurations for input and output buffers of
126 * reverse stream. An example of reverse stream is the echo reference
127 * supplied to an Acoustic Echo Canceler.
128 *
129 * @param config configuration descriptor.
130 * @param inputBufferProvider optional buffer provider reference.
131 * @param outputBufferProvider optional buffer provider reference.
132 * @return retval operation completion status.
133 */
134 setConfigReverse(EffectConfig config,
135 IEffectBufferProviderCallback inputBufferProvider,
136 IEffectBufferProviderCallback outputBufferProvider)
137 generates (Result retval);
138
139 /**
140 * Set the capture device the audio input path is connected to. The effect
141 * implementation must set EFFECT_FLAG_DEVICE_IND flag in its descriptor to
142 * receive this command when the device changes.
143 *
144 * Note: this method is only supported for effects inserted into
145 * the input chain.
146 *
147 * @param device input device specification.
148 * @return retval operation completion status.
149 */
150 setInputDevice(bitfield<AudioDevice> device) generates (Result retval);
151
152 /**
153 * Read audio parameters configurations for input and output buffers.
154 *
155 * @return retval operation completion status.
156 * @return config configuration descriptor.
157 */
158 getConfig() generates (Result retval, EffectConfig config);
159
160 /**
161 * Read audio parameters configurations for input and output buffers of
162 * reverse stream.
163 *
164 * @return retval operation completion status.
165 * @return config configuration descriptor.
166 */
167 getConfigReverse() generates (Result retval, EffectConfig config);
168
169 /**
170 * Queries for supported combinations of main and auxiliary channels
171 * (e.g. for a multi-microphone noise suppressor).
172 *
173 * @param maxConfigs maximum number of the combinations to return.
174 * @return retval absence of the feature support is indicated using
175 * NOT_SUPPORTED code. RESULT_TOO_BIG is returned if
176 * the number of supported combinations exceeds 'maxConfigs'.
177 * @return result list of configuration descriptors.
178 */
179 getSupportedAuxChannelsConfigs(uint32_t maxConfigs)
180 generates (Result retval, vec<EffectAuxChannelsConfig> result);
181
182 /**
183 * Retrieves the current configuration of main and auxiliary channels.
184 *
185 * @return retval absence of the feature support is indicated using
186 * NOT_SUPPORTED code.
187 * @return result configuration descriptor.
188 */
189 getAuxChannelsConfig()
190 generates (Result retval, EffectAuxChannelsConfig result);
191
192 /**
193 * Sets the current configuration of main and auxiliary channels.
194 *
195 * @return retval operation completion status; absence of the feature
196 * support is indicated using NOT_SUPPORTED code.
197 */
198 setAuxChannelsConfig(EffectAuxChannelsConfig config)
199 generates (Result retval);
200
201 /**
202 * Set the audio source the capture path is configured for (Camcorder, voice
203 * recognition...).
204 *
205 * Note: this method is only supported for effects inserted into
206 * the input chain.
207 *
208 * @param source source descriptor.
209 * @return retval operation completion status.
210 */
211 setAudioSource(AudioSource source) generates (Result retval);
212
213 /**
214 * This command indicates if the playback thread the effect is attached to
215 * is offloaded or not, and updates the I/O handle of the playback thread
216 * the effect is attached to.
217 *
218 * @param param effect offload descriptor.
219 * @return retval operation completion status.
220 */
221 offload(EffectOffloadParameter param) generates (Result retval);
222
223 /**
224 * Returns the effect descriptor.
225 *
226 * @return retval operation completion status.
227 * @return descriptor effect descriptor.
228 */
229 getDescriptor() generates (Result retval, EffectDescriptor descriptor);
230
231 /**
232 * Set up required transports for passing audio buffers to the effect.
233 *
234 * The transport consists of shared memory and a message queue for reporting
235 * effect processing operation status. The shared memory is set up
236 * separately using 'setProcessBuffers' method.
237 *
238 * Processing is requested by setting 'REQUEST_PROCESS' or
239 * 'REQUEST_PROCESS_REVERSE' EventFlags associated with the status message
240 * queue. The result of processing may be one of the following:
241 * OK if there were no errors during processing;
242 * INVALID_ARGUMENTS if audio buffers are invalid;
243 * INVALID_STATE if the engine has finished the disable phase;
244 * NOT_INITIALIZED if the audio buffers were not set;
245 * NOT_SUPPORTED if the requested processing type is not supported by
246 * the effect.
247 *
248 * @return retval OK if both message queues were created successfully.
249 * INVALID_STATE if the method was already called.
250 * INVALID_ARGUMENTS if there was a problem setting up
251 * the queue.
252 * @return statusMQ a message queue used for passing status from the effect.
253 */
254 @callflow(next={"setProcessBuffers"})
255 prepareForProcessing() generates (Result retval, fmq_sync<Result> statusMQ);
256
257 /**
258 * Set up input and output buffers for processing audio data. The effect
259 * may modify both the input and the output buffer during the operation.
260 * Buffers may be set multiple times during effect lifetime.
261 *
262 * The input and the output buffer may be reused between different effects,
263 * and the input buffer may be used as an output buffer. Buffers are
264 * distinguished using 'AudioBuffer.id' field.
265 *
266 * @param inBuffer input audio buffer.
267 * @param outBuffer output audio buffer.
268 * @return retval OK if both buffers were mapped successfully.
269 * INVALID_ARGUMENTS if there was a problem with mapping
270 * any of the buffers.
271 */
272 setProcessBuffers(AudioBuffer inBuffer, AudioBuffer outBuffer)
273 generates (Result retval);
274
275 /**
276 * Execute a vendor specific command on the effect. The command code
277 * and data, as well as result data are not interpreted by Android
278 * Framework and are passed as-is between the application and the effect.
279 *
280 * The effect must use standard POSIX.1-2001 error codes for the operation
281 * completion status.
282 *
283 * Use this method only if the effect is provided by a third party, and
284 * there is no interface defined for it. This method only works for effects
285 * implemented in software.
286 *
287 * @param commandId the ID of the command.
288 * @param data command data.
289 * @param resultMaxSize maximum size in bytes of the result; can be 0.
290 * @return status command completion status.
291 * @return result result data.
292 */
293 command(uint32_t commandId, vec<uint8_t> data, uint32_t resultMaxSize)
294 generates (int32_t status, vec<uint8_t> result);
295
296 /**
297 * Set a vendor-specific parameter and apply it immediately. The parameter
298 * code and data are not interpreted by Android Framework and are passed
299 * as-is between the application and the effect.
300 *
301 * The effect must use INVALID_ARGUMENTS return code if the parameter ID is
302 * unknown or if provided parameter data is invalid. If the effect does not
303 * support setting vendor-specific parameters, it must return NOT_SUPPORTED.
304 *
305 * Use this method only if the effect is provided by a third party, and
306 * there is no interface defined for it. This method only works for effects
307 * implemented in software.
308 *
309 * @param parameter identifying data of the parameter.
310 * @param value the value of the parameter.
311 * @return retval operation completion status.
312 */
313 setParameter(vec<uint8_t> parameter, vec<uint8_t> value)
314 generates (Result retval);
315
316 /**
317 * Get a vendor-specific parameter value. The parameter code and returned
318 * data are not interpreted by Android Framework and are passed as-is
319 * between the application and the effect.
320 *
321 * The effect must use INVALID_ARGUMENTS return code if the parameter ID is
322 * unknown. If the effect does not support setting vendor-specific
323 * parameters, it must return NOT_SUPPORTED.
324 *
325 * Use this method only if the effect is provided by a third party, and
326 * there is no interface defined for it. This method only works for effects
327 * implemented in software.
328 *
329 * @param parameter identifying data of the parameter.
330 * @param valueMaxSize maximum size in bytes of the value.
331 * @return retval operation completion status.
332 * @return result the value of the parameter.
333 */
334 getParameter(vec<uint8_t> parameter, uint32_t valueMaxSize)
335 generates (Result retval, vec<uint8_t> value);
336
337 /**
338 * Get supported configs for a vendor-specific feature. The configs returned
339 * are not interpreted by Android Framework and are passed as-is between the
340 * application and the effect.
341 *
342 * The effect must use INVALID_ARGUMENTS return code if the feature ID is
343 * unknown. If the effect does not support getting vendor-specific feature
344 * configs, it must return NOT_SUPPORTED. If the feature is supported but
345 * the total number of supported configurations exceeds the maximum number
346 * indicated by the caller, the method must return RESULT_TOO_BIG.
347 *
348 * Use this method only if the effect is provided by a third party, and
349 * there is no interface defined for it. This method only works for effects
350 * implemented in software.
351 *
352 * @param featureId feature identifier.
353 * @param maxConfigs maximum number of configs to return.
354 * @param configSize size of each config in bytes.
355 * @return retval operation completion status.
356 * @return configsCount number of configs returned.
357 * @return configsData data for all the configs returned.
358 */
359 getSupportedConfigsForFeature(
360 uint32_t featureId,
361 uint32_t maxConfigs,
362 uint32_t configSize) generates (
363 Result retval,
364 uint32_t configsCount,
365 vec<uint8_t> configsData);
366
367 /**
368 * Get the current config for a vendor-specific feature. The config returned
369 * is not interpreted by Android Framework and is passed as-is between the
370 * application and the effect.
371 *
372 * The effect must use INVALID_ARGUMENTS return code if the feature ID is
373 * unknown. If the effect does not support getting vendor-specific
374 * feature configs, it must return NOT_SUPPORTED.
375 *
376 * Use this method only if the effect is provided by a third party, and
377 * there is no interface defined for it. This method only works for effects
378 * implemented in software.
379 *
380 * @param featureId feature identifier.
381 * @param configSize size of the config in bytes.
382 * @return retval operation completion status.
383 * @return configData config data.
384 */
385 getCurrentConfigForFeature(uint32_t featureId, uint32_t configSize)
386 generates (Result retval, vec<uint8_t> configData);
387
388 /**
389 * Set the current config for a vendor-specific feature. The config data
390 * is not interpreted by Android Framework and is passed as-is between the
391 * application and the effect.
392 *
393 * The effect must use INVALID_ARGUMENTS return code if the feature ID is
394 * unknown. If the effect does not support getting vendor-specific
395 * feature configs, it must return NOT_SUPPORTED.
396 *
397 * Use this method only if the effect is provided by a third party, and
398 * there is no interface defined for it. This method only works for effects
399 * implemented in software.
400 *
401 * @param featureId feature identifier.
402 * @param configData config data.
403 * @return retval operation completion status.
404 */
405 setCurrentConfigForFeature(uint32_t featureId, vec<uint8_t> configData)
406 generates (Result retval);
407
408 /**
409 * Called by the framework to deinitialize the effect and free up
Mikhail Naganov7623ed92019-11-14 13:57:15 -0800410 * all currently allocated resources. It is recommended to close
Kevin Rocard0349c2f2019-09-30 19:53:00 +0100411 * the effect on the client side as soon as it is becomes unused.
412 *
Mikhail Naganov7623ed92019-11-14 13:57:15 -0800413 * The client must ensure that this function is not called while
414 * audio data is being transferred through the effect's message queues.
415 *
Kevin Rocard0349c2f2019-09-30 19:53:00 +0100416 * @return retval OK in case the success.
417 * INVALID_STATE if the effect was already closed.
418 */
419 @exit
420 close() generates (Result retval);
421};