Home | History | Annotate | Download | only in 2.0
      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 
     17 package android.hardware.audio.effect@2.0;
     18 
     19 import android.hardware.audio.common@2.0;
     20 import IEffectBufferProviderCallback;
     21 
     22 interface 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