472c7ed05f
Add the possibility to specify a target audio device when creating an audio effect by passing its audio port handle to createEffect API. Add new create_effect_3_1() function to audio_effect_library_t interface for interface version to 3.1. Bug: 136294538 Test: make Change-Id: Ia84eaf32f2a7c0cc73a43075c84902a395bafe58
354 lines
17 KiB
C
354 lines
17 KiB
C
/*
|
|
* Copyright (C) 2011 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.
|
|
*/
|
|
|
|
|
|
#ifndef ANDROID_AUDIO_EFFECT_H
|
|
#define ANDROID_AUDIO_EFFECT_H
|
|
|
|
#include <errno.h>
|
|
#include <stdint.h>
|
|
#include <strings.h>
|
|
#include <sys/cdefs.h>
|
|
#include <sys/types.h>
|
|
|
|
#include <cutils/bitops.h>
|
|
|
|
#include <system/audio_effect.h>
|
|
|
|
|
|
__BEGIN_DECLS
|
|
|
|
|
|
/////////////////////////////////////////////////
|
|
// Common Definitions
|
|
/////////////////////////////////////////////////
|
|
|
|
#define EFFECT_MAKE_API_VERSION(M, m) (((M)<<16) | ((m) & 0xFFFF))
|
|
#define EFFECT_API_VERSION_MAJOR(v) ((v)>>16)
|
|
#define EFFECT_API_VERSION_MINOR(v) ((m) & 0xFFFF)
|
|
|
|
|
|
/////////////////////////////////////////////////
|
|
// Effect control interface
|
|
/////////////////////////////////////////////////
|
|
|
|
// Effect control interface version 2.0
|
|
#define EFFECT_CONTROL_API_VERSION EFFECT_MAKE_API_VERSION(2,0)
|
|
|
|
// Effect control interface structure: effect_interface_s
|
|
// The effect control interface is exposed by each effect engine implementation. It consists of
|
|
// a set of functions controlling the configuration, activation and process of the engine.
|
|
// The functions are grouped in a structure of type effect_interface_s.
|
|
//
|
|
// Effect control interface handle: effect_handle_t
|
|
// The effect_handle_t serves two purposes regarding the implementation of the effect engine:
|
|
// - 1 it is the address of a pointer to an effect_interface_s structure where the functions
|
|
// of the effect control API for a particular effect are located.
|
|
// - 2 it is the address of the context of a particular effect instance.
|
|
// A typical implementation in the effect library would define a structure as follows:
|
|
// struct effect_module_s {
|
|
// const struct effect_interface_s *itfe;
|
|
// effect_config_t config;
|
|
// effect_context_t context;
|
|
// }
|
|
// The implementation of EffectCreate() function would then allocate a structure of this
|
|
// type and return its address as effect_handle_t
|
|
typedef struct effect_interface_s **effect_handle_t;
|
|
|
|
// Effect control interface definition
|
|
struct effect_interface_s {
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: process
|
|
//
|
|
// Description: Effect process function. Takes input samples as specified
|
|
// (count and location) in input buffer descriptor and output processed
|
|
// samples as specified in output buffer descriptor. If the buffer descriptor
|
|
// is not specified the function must use either the buffer or the
|
|
// buffer provider function installed by the EFFECT_CMD_SET_CONFIG command.
|
|
// The effect framework will call the process() function after the EFFECT_CMD_ENABLE
|
|
// command is received and until the EFFECT_CMD_DISABLE is received. When the engine
|
|
// receives the EFFECT_CMD_DISABLE command it should turn off the effect gracefully
|
|
// and when done indicate that it is OK to stop calling the process() function by
|
|
// returning the -ENODATA status.
|
|
//
|
|
// NOTE: the process() function implementation should be "real-time safe" that is
|
|
// it should not perform blocking calls: malloc/free, sleep, read/write/open/close,
|
|
// pthread_cond_wait/pthread_mutex_lock...
|
|
//
|
|
// Input:
|
|
// self: handle to the effect interface this function
|
|
// is called on.
|
|
// inBuffer: buffer descriptor indicating where to read samples to process.
|
|
// If NULL, use the configuration passed by EFFECT_CMD_SET_CONFIG command.
|
|
//
|
|
// outBuffer: buffer descriptor indicating where to write processed samples.
|
|
// If NULL, use the configuration passed by EFFECT_CMD_SET_CONFIG command.
|
|
//
|
|
// Output:
|
|
// returned value: 0 successful operation
|
|
// -ENODATA the engine has finished the disable phase and the framework
|
|
// can stop calling process()
|
|
// -EINVAL invalid interface handle or
|
|
// invalid input/output buffer description
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
int32_t (*process)(effect_handle_t self,
|
|
audio_buffer_t *inBuffer,
|
|
audio_buffer_t *outBuffer);
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: command
|
|
//
|
|
// Description: Send a command and receive a response to/from effect engine.
|
|
//
|
|
// Input:
|
|
// self: handle to the effect interface this function
|
|
// is called on.
|
|
// cmdCode: command code: the command can be a standardized command defined in
|
|
// effect_command_e (see below) or a proprietary command.
|
|
// cmdSize: size of command in bytes
|
|
// pCmdData: pointer to command data
|
|
// pReplyData: pointer to reply data
|
|
//
|
|
// Input/Output:
|
|
// replySize: maximum size of reply data as input
|
|
// actual size of reply data as output
|
|
//
|
|
// Output:
|
|
// returned value: 0 successful operation
|
|
// -EINVAL invalid interface handle or
|
|
// invalid command/reply size or format according to
|
|
// command code
|
|
// The return code should be restricted to indicate problems related to this API
|
|
// specification. Status related to the execution of a particular command should be
|
|
// indicated as part of the reply field.
|
|
//
|
|
// *pReplyData updated with command response
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
int32_t (*command)(effect_handle_t self,
|
|
uint32_t cmdCode,
|
|
uint32_t cmdSize,
|
|
void *pCmdData,
|
|
uint32_t *replySize,
|
|
void *pReplyData);
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: get_descriptor
|
|
//
|
|
// Description: Returns the effect descriptor
|
|
//
|
|
// Input:
|
|
// self: handle to the effect interface this function
|
|
// is called on.
|
|
//
|
|
// Input/Output:
|
|
// pDescriptor: address where to return the effect descriptor.
|
|
//
|
|
// Output:
|
|
// returned value: 0 successful operation.
|
|
// -EINVAL invalid interface handle or invalid pDescriptor
|
|
// *pDescriptor: updated with the effect descriptor.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
int32_t (*get_descriptor)(effect_handle_t self,
|
|
effect_descriptor_t *pDescriptor);
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: process_reverse
|
|
//
|
|
// Description: Process reverse stream function. This function is used to pass
|
|
// a reference stream to the effect engine. If the engine does not need a reference
|
|
// stream, this function pointer can be set to NULL.
|
|
// This function would typically implemented by an Echo Canceler.
|
|
//
|
|
// Input:
|
|
// self: handle to the effect interface this function
|
|
// is called on.
|
|
// inBuffer: buffer descriptor indicating where to read samples to process.
|
|
// If NULL, use the configuration passed by EFFECT_CMD_SET_CONFIG_REVERSE command.
|
|
//
|
|
// outBuffer: buffer descriptor indicating where to write processed samples.
|
|
// If NULL, use the configuration passed by EFFECT_CMD_SET_CONFIG_REVERSE command.
|
|
// If the buffer and buffer provider in the configuration received by
|
|
// EFFECT_CMD_SET_CONFIG_REVERSE are also NULL, do not return modified reverse
|
|
// stream data
|
|
//
|
|
// Output:
|
|
// returned value: 0 successful operation
|
|
// -ENODATA the engine has finished the disable phase and the framework
|
|
// can stop calling process_reverse()
|
|
// -EINVAL invalid interface handle or
|
|
// invalid input/output buffer description
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
int32_t (*process_reverse)(effect_handle_t self,
|
|
audio_buffer_t *inBuffer,
|
|
audio_buffer_t *outBuffer);
|
|
};
|
|
|
|
/////////////////////////////////////////////////
|
|
// Effect library interface
|
|
/////////////////////////////////////////////////
|
|
|
|
// Effect library interface version 3.0
|
|
// Note that EffectsFactory.c only checks the major version component, so changes to the minor
|
|
// number can only be used for fully backwards compatible changes
|
|
#define EFFECT_LIBRARY_API_VERSION EFFECT_MAKE_API_VERSION(3,0)
|
|
#define EFFECT_LIBRARY_API_VERSION_3_0 EFFECT_MAKE_API_VERSION(3,0)
|
|
#define EFFECT_LIBRARY_API_VERSION_3_1 EFFECT_MAKE_API_VERSION(3,1)
|
|
|
|
#define AUDIO_EFFECT_LIBRARY_TAG ((('A') << 24) | (('E') << 16) | (('L') << 8) | ('T'))
|
|
|
|
// Every effect library must have a data structure named AUDIO_EFFECT_LIBRARY_INFO_SYM
|
|
// and the fields of this data structure must begin with audio_effect_library_t
|
|
|
|
typedef struct audio_effect_library_s {
|
|
// tag must be initialized to AUDIO_EFFECT_LIBRARY_TAG
|
|
uint32_t tag;
|
|
// Version of the effect library API : 0xMMMMmmmm MMMM: Major, mmmm: minor
|
|
uint32_t version;
|
|
// Name of this library
|
|
const char *name;
|
|
// Author/owner/implementor of the library
|
|
const char *implementor;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: create_effect
|
|
//
|
|
// Description: Creates an effect engine of the specified implementation uuid and
|
|
// returns an effect control interface on this engine. The function will allocate the
|
|
// resources for an instance of the requested effect engine and return
|
|
// a handle on the effect control interface.
|
|
//
|
|
// Input:
|
|
// uuid: pointer to the effect uuid.
|
|
// sessionId: audio session to which this effect instance will be attached.
|
|
// All effects created with the same session ID are connected in series and process
|
|
// the same signal stream. Knowing that two effects are part of the same effect
|
|
// chain can help the library implement some kind of optimizations.
|
|
// ioId: identifies the output or input stream this effect is directed to in
|
|
// audio HAL.
|
|
// For future use especially with tunneled HW accelerated effects
|
|
//
|
|
// Input/Output:
|
|
// pHandle: address where to return the effect interface handle.
|
|
//
|
|
// Output:
|
|
// returned value: 0 successful operation.
|
|
// -ENODEV library failed to initialize
|
|
// -EINVAL invalid pEffectUuid or pHandle
|
|
// -ENOENT no effect with this uuid found
|
|
// *pHandle: updated with the effect interface handle.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
int32_t (*create_effect)(const effect_uuid_t *uuid,
|
|
int32_t sessionId,
|
|
int32_t ioId,
|
|
effect_handle_t *pHandle);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: release_effect
|
|
//
|
|
// Description: Releases the effect engine whose handle is given as argument.
|
|
// All resources allocated to this particular instance of the effect are
|
|
// released.
|
|
//
|
|
// Input:
|
|
// handle: handle on the effect interface to be released.
|
|
//
|
|
// Output:
|
|
// returned value: 0 successful operation.
|
|
// -ENODEV library failed to initialize
|
|
// -EINVAL invalid interface handle
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
int32_t (*release_effect)(effect_handle_t handle);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: get_descriptor
|
|
//
|
|
// Description: Returns the descriptor of the effect engine which implementation UUID is
|
|
// given as argument.
|
|
//
|
|
// Input/Output:
|
|
// uuid: pointer to the effect uuid.
|
|
// pDescriptor: address where to return the effect descriptor.
|
|
//
|
|
// Output:
|
|
// returned value: 0 successful operation.
|
|
// -ENODEV library failed to initialize
|
|
// -EINVAL invalid pDescriptor or uuid
|
|
// *pDescriptor: updated with the effect descriptor.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
int32_t (*get_descriptor)(const effect_uuid_t *uuid,
|
|
effect_descriptor_t *pDescriptor);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: create_effect_3_1
|
|
//
|
|
// Description: Creates an effect engine of the specified implementation uuid and
|
|
// returns an effect control interface on this engine. The function will allocate the
|
|
// resources for an instance of the requested effect engine and return
|
|
// a handle on the effect control interface.
|
|
//
|
|
// Input:
|
|
// uuid: pointer to the effect uuid.
|
|
// sessionId: audio session to which this effect instance will be attached.
|
|
// All effects created with the same session ID are connected in series and process
|
|
// the same signal stream. Knowing that two effects are part of the same effect
|
|
// chain can help the library implement some kind of optimizations.
|
|
// ioId: identifies the output or input stream this effect is directed to in
|
|
// audio HAL.
|
|
// For future use especially with tunneled HW accelerated effects
|
|
// deviceId: identifies the sink or source device this effect is directed to in
|
|
// audio HAL. Must be specified if sessionId is AUDIO_SESSION_DEVICE and is
|
|
// ignored otherwise.
|
|
// deviceId is the audio_port_handle_t used for the device when the audio
|
|
// patch is created at the audio HAL.
|
|
//
|
|
// Input/Output:
|
|
// pHandle: address where to return the effect interface handle.
|
|
//
|
|
// Output:
|
|
// returned value: 0 successful operation.
|
|
// -ENODEV library failed to initialize
|
|
// -EINVAL invalid pEffectUuid or pHandle
|
|
// -ENOENT no effect with this uuid found
|
|
// *pHandle: updated with the effect interface handle.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
int32_t (*create_effect_3_1)(const effect_uuid_t *uuid,
|
|
int32_t sessionId,
|
|
int32_t ioId,
|
|
int32_t deviceId,
|
|
effect_handle_t *pHandle);
|
|
|
|
} audio_effect_library_t;
|
|
|
|
// Name of the hal_module_info
|
|
#define AUDIO_EFFECT_LIBRARY_INFO_SYM AELI
|
|
|
|
// Name of the hal_module_info as a string
|
|
#define AUDIO_EFFECT_LIBRARY_INFO_SYM_AS_STR "AELI"
|
|
|
|
__END_DECLS
|
|
|
|
#endif // ANDROID_AUDIO_EFFECT_H
|