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