Home | History | Annotate | Download | only in hardware
      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