/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.hardware.audio.effect@2.0; import android.hardware.audio.common@2.0; import IEffectBufferProviderCallback; interface IEffect { /** * Initialize effect engine--all configurations return to default. * * @return retval operation completion status. */ @entry @callflow(next={"*"}) init() generates (Result retval); /** * Apply new audio parameters configurations for input and output buffers. * The provider callbacks may be empty, but in this case the buffer * must be provided in the EffectConfig structure. * * @param config configuration descriptor. * @param inputBufferProvider optional buffer provider reference. * @param outputBufferProvider optional buffer provider reference. * @return retval operation completion status. */ @callflow(next={"*"}) setConfig(EffectConfig config, IEffectBufferProviderCallback inputBufferProvider, IEffectBufferProviderCallback outputBufferProvider) generates (Result retval); /** * Reset the effect engine. Keep configuration but resets state and buffer * content. * * @return retval operation completion status. */ @callflow(next={"*"}) reset() generates (Result retval); /** * Enable processing. * * @return retval operation completion status. */ @callflow(next={"prepareForProcessing"}) enable() generates (Result retval); /** * Disable processing. * * @return retval operation completion status. */ @callflow(next={"close"}) disable() generates (Result retval); /** * Set the rendering device the audio output path is connected to. The * effect implementation must set EFFECT_FLAG_DEVICE_IND flag in its * descriptor to receive this command when the device changes. * * Note: this method is only supported for effects inserted into * the output chain. * * @param device output device specification. * @return retval operation completion status. */ @callflow(next={"*"}) setDevice(AudioDevice device) generates (Result retval); /** * Set and get volume. Used by audio framework to delegate volume control to * effect engine. The effect implementation must set EFFECT_FLAG_VOLUME_CTRL * flag in its descriptor to receive this command. The effect engine must * return the volume that should be applied before the effect is * processed. The overall volume (the volume actually applied by the effect * engine multiplied by the returned value) should match the value indicated * in the command. * * @param volumes vector containing volume for each channel defined in * EffectConfig for output buffer expressed in 8.24 fixed * point format. * @return result updated volume values. * @return retval operation completion status. */ @callflow(next={"*"}) setAndGetVolume(vec volumes) generates (Result retval, vec result); /** * Notify the effect of the volume change. The effect implementation must * set EFFECT_FLAG_VOLUME_IND flag in its descriptor to receive this * command. * * @param volumes vector containing volume for each channel defined in * EffectConfig for output buffer expressed in 8.24 fixed * point format. * @return retval operation completion status. */ volumeChangeNotification(vec volumes) generates (Result retval); /** * Set the audio mode. The effect implementation must set * EFFECT_FLAG_AUDIO_MODE_IND flag in its descriptor to receive this command * when the audio mode changes. * * @param mode desired audio mode. * @return retval operation completion status. */ @callflow(next={"*"}) setAudioMode(AudioMode mode) generates (Result retval); /** * Apply new audio parameters configurations for input and output buffers of * reverse stream. An example of reverse stream is the echo reference * supplied to an Acoustic Echo Canceler. * * @param config configuration descriptor. * @param inputBufferProvider optional buffer provider reference. * @param outputBufferProvider optional buffer provider reference. * @return retval operation completion status. */ @callflow(next={"*"}) setConfigReverse(EffectConfig config, IEffectBufferProviderCallback inputBufferProvider, IEffectBufferProviderCallback outputBufferProvider) generates (Result retval); /** * Set the capture device the audio input path is connected to. The effect * implementation must set EFFECT_FLAG_DEVICE_IND flag in its descriptor to * receive this command when the device changes. * * Note: this method is only supported for effects inserted into * the input chain. * * @param device input device specification. * @return retval operation completion status. */ @callflow(next={"*"}) setInputDevice(AudioDevice device) generates (Result retval); /** * Read audio parameters configurations for input and output buffers. * * @return retval operation completion status. * @return config configuration descriptor. */ @callflow(next={"*"}) getConfig() generates (Result retval, EffectConfig config); /** * Read audio parameters configurations for input and output buffers of * reverse stream. * * @return retval operation completion status. * @return config configuration descriptor. */ @callflow(next={"*"}) getConfigReverse() generates (Result retval, EffectConfig config); /** * Queries for supported combinations of main and auxiliary channels * (e.g. for a multi-microphone noise suppressor). * * @param maxConfigs maximum number of the combinations to return. * @return retval absence of the feature support is indicated using * NOT_SUPPORTED code. RESULT_TOO_BIG is returned if * the number of supported combinations exceeds 'maxConfigs'. * @return result list of configuration descriptors. */ @callflow(next={"*"}) getSupportedAuxChannelsConfigs(uint32_t maxConfigs) generates (Result retval, vec result); /** * Retrieves the current configuration of main and auxiliary channels. * * @return retval absence of the feature support is indicated using * NOT_SUPPORTED code. * @return result configuration descriptor. */ @callflow(next={"*"}) getAuxChannelsConfig() generates (Result retval, EffectAuxChannelsConfig result); /** * Sets the current configuration of main and auxiliary channels. * * @return retval operation completion status; absence of the feature * support is indicated using NOT_SUPPORTED code. */ @callflow(next={"*"}) setAuxChannelsConfig(EffectAuxChannelsConfig config) generates (Result retval); /** * Set the audio source the capture path is configured for (Camcorder, voice * recognition...). * * Note: this method is only supported for effects inserted into * the input chain. * * @param source source descriptor. * @return retval operation completion status. */ @callflow(next={"*"}) setAudioSource(AudioSource source) generates (Result retval); /** * This command indicates if the playback thread the effect is attached to * is offloaded or not, and updates the I/O handle of the playback thread * the effect is attached to. * * @param param effect offload descriptor. * @return retval operation completion status. */ @callflow(next={"*"}) offload(EffectOffloadParameter param) generates (Result retval); /** * Returns the effect descriptor. * * @return retval operation completion status. * @return descriptor effect descriptor. */ @callflow(next={"*"}) getDescriptor() generates (Result retval, EffectDescriptor descriptor); /** * Set up required transports for passing audio buffers to the effect. * * The transport consists of shared memory and a message queue for reporting * effect processing operation status. The shared memory is set up * separately using 'setProcessBuffers' method. * * Processing is requested by setting 'REQUEST_PROCESS' or * 'REQUEST_PROCESS_REVERSE' EventFlags associated with the status message * queue. The result of processing may be one of the following: * OK if there were no errors during processing; * INVALID_ARGUMENTS if audio buffers are invalid; * INVALID_STATE if the engine has finished the disable phase; * NOT_INITIALIZED if the audio buffers were not set; * NOT_SUPPORTED if the requested processing type is not supported by * the effect. * * @return retval OK if both message queues were created successfully. * INVALID_STATE if the method was already called. * INVALID_ARGUMENTS if there was a problem setting up * the queue. * @return statusMQ a message queue used for passing status from the effect. */ @callflow(next={"setProcessBuffers"}) prepareForProcessing() generates (Result retval, fmq_sync statusMQ); /** * Set up input and output buffers for processing audio data. The effect * may modify both the input and the output buffer during the operation. * Buffers may be set multiple times during effect lifetime. * * The input and the output buffer may be reused between different effects, * and the input buffer may be used as an output buffer. Buffers are * distinguished using 'AudioBuffer.id' field. * * @param inBuffer input audio buffer. * @param outBuffer output audio buffer. * @return retval OK if both buffers were mapped successfully. * INVALID_ARGUMENTS if there was a problem with mapping * any of the buffers. */ @callflow(next={"*"}) setProcessBuffers(AudioBuffer inBuffer, AudioBuffer outBuffer) generates ( Result retval); /** * Execute a vendor specific command on the effect. The command code * and data, as well as result data are not interpreted by Android * Framework and are passed as-is between the application and the effect. * * The effect must use standard POSIX.1-2001 error codes for the operation * completion status. * * Use this method only if the effect is provided by a third party, and * there is no interface defined for it. This method only works for effects * implemented in software. * * @param commandId the ID of the command. * @param data command data. * @param resultMaxSize maximum size in bytes of the result; can be 0. * @return status command completion status. * @return result result data. */ command(uint32_t commandId, vec data, uint32_t resultMaxSize) generates (int32_t status, vec result); /** * Set a vendor-specific parameter and apply it immediately. The parameter * code and data are not interpreted by Android Framework and are passed * as-is between the application and the effect. * * The effect must use INVALID_ARGUMENTS return code if the parameter ID is * unknown or if provided parameter data is invalid. If the effect does not * support setting vendor-specific parameters, it must return NOT_SUPPORTED. * * Use this method only if the effect is provided by a third party, and * there is no interface defined for it. This method only works for effects * implemented in software. * * @param parameter identifying data of the parameter. * @param value the value of the parameter. * @return retval operation completion status. */ @callflow(next={"*"}) setParameter(vec parameter, vec value) generates (Result retval); /** * Get a vendor-specific parameter value. The parameter code and returned * data are not interpreted by Android Framework and are passed as-is * between the application and the effect. * * The effect must use INVALID_ARGUMENTS return code if the parameter ID is * unknown. If the effect does not support setting vendor-specific * parameters, it must return NOT_SUPPORTED. * * Use this method only if the effect is provided by a third party, and * there is no interface defined for it. This method only works for effects * implemented in software. * * @param parameter identifying data of the parameter. * @param valueMaxSize maximum size in bytes of the value. * @return retval operation completion status. * @return result the value of the parameter. */ @callflow(next={"*"}) getParameter(vec parameter, uint32_t valueMaxSize) generates (Result retval, vec value); /** * Get supported configs for a vendor-specific feature. The configs returned * are not interpreted by Android Framework and are passed as-is between the * application and the effect. * * The effect must use INVALID_ARGUMENTS return code if the feature ID is * unknown. If the effect does not support getting vendor-specific feature * configs, it must return NOT_SUPPORTED. If the feature is supported but * the total number of supported configurations exceeds the maximum number * indicated by the caller, the method must return RESULT_TOO_BIG. * * Use this method only if the effect is provided by a third party, and * there is no interface defined for it. This method only works for effects * implemented in software. * * @param featureId feature identifier. * @param maxConfigs maximum number of configs to return. * @param configSize size of each config in bytes. * @return retval operation completion status. * @return configsCount number of configs returned. * @return configsData data for all the configs returned. */ @callflow(next={"*"}) getSupportedConfigsForFeature( uint32_t featureId, uint32_t maxConfigs, uint32_t configSize) generates ( Result retval, uint32_t configsCount, vec configsData); /** * Get the current config for a vendor-specific feature. The config returned * is not interpreted by Android Framework and is passed as-is between the * application and the effect. * * The effect must use INVALID_ARGUMENTS return code if the feature ID is * unknown. If the effect does not support getting vendor-specific * feature configs, it must return NOT_SUPPORTED. * * Use this method only if the effect is provided by a third party, and * there is no interface defined for it. This method only works for effects * implemented in software. * * @param featureId feature identifier. * @param configSize size of the config in bytes. * @return retval operation completion status. * @return configData config data. */ @callflow(next={"*"}) getCurrentConfigForFeature(uint32_t featureId, uint32_t configSize) generates (Result retval, vec configData); /** * Set the current config for a vendor-specific feature. The config data * is not interpreted by Android Framework and is passed as-is between the * application and the effect. * * The effect must use INVALID_ARGUMENTS return code if the feature ID is * unknown. If the effect does not support getting vendor-specific * feature configs, it must return NOT_SUPPORTED. * * Use this method only if the effect is provided by a third party, and * there is no interface defined for it. This method only works for effects * implemented in software. * * @param featureId feature identifier. * @param configData config data. * @return retval operation completion status. */ setCurrentConfigForFeature(uint32_t featureId, vec configData) generates (Result retval); /** * Called by the framework to deinitialize the effect and free up * all the currently allocated resources. It is recommended to close * the effect on the client side as soon as it is becomes unused. * * @return retval OK in case the success. * INVALID_STATE if the effect was already closed. */ @exit close() generates (Result retval); };