Revert "Audio V4: Split system and vendor Audio.h"
This reverts commit fc9e212f01
.
Reason for revert: Breaks multiple devices
Change-Id: I816671fd92246f85c97d00819858a74e36e2929d
This commit is contained in:
parent
fc9e212f01
commit
c6ec9486d8
9 changed files with 1989 additions and 15 deletions
|
@ -3,11 +3,13 @@
|
|||
cc_library_headers {
|
||||
name: "libhardware_headers",
|
||||
header_libs: [
|
||||
"libaudio_system_headers",
|
||||
"libsystem_headers",
|
||||
"libcutils_headers",
|
||||
"libbluetooth-types-header",
|
||||
],
|
||||
export_header_lib_headers: [
|
||||
"libaudio_system_headers",
|
||||
"libsystem_headers",
|
||||
"libcutils_headers",
|
||||
"libbluetooth-types-header",
|
||||
|
|
745
include/hardware/audio.h
Normal file
745
include/hardware/audio.h
Normal file
|
@ -0,0 +1,745 @@
|
|||
/*
|
||||
* 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_HAL_INTERFACE_H
|
||||
#define ANDROID_AUDIO_HAL_INTERFACE_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <strings.h>
|
||||
#include <sys/cdefs.h>
|
||||
#include <sys/types.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <cutils/bitops.h>
|
||||
|
||||
#include <hardware/hardware.h>
|
||||
#include <system/audio.h>
|
||||
#include <hardware/audio_effect.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* The id of this module
|
||||
*/
|
||||
#define AUDIO_HARDWARE_MODULE_ID "audio"
|
||||
|
||||
/**
|
||||
* Name of the audio devices to open
|
||||
*/
|
||||
#define AUDIO_HARDWARE_INTERFACE "audio_hw_if"
|
||||
|
||||
|
||||
/* Use version 0.1 to be compatible with first generation of audio hw module with version_major
|
||||
* hardcoded to 1. No audio module API change.
|
||||
*/
|
||||
#define AUDIO_MODULE_API_VERSION_0_1 HARDWARE_MODULE_API_VERSION(0, 1)
|
||||
#define AUDIO_MODULE_API_VERSION_CURRENT AUDIO_MODULE_API_VERSION_0_1
|
||||
|
||||
/* First generation of audio devices had version hardcoded to 0. all devices with versions < 1.0
|
||||
* will be considered of first generation API.
|
||||
*/
|
||||
#define AUDIO_DEVICE_API_VERSION_0_0 HARDWARE_DEVICE_API_VERSION(0, 0)
|
||||
#define AUDIO_DEVICE_API_VERSION_1_0 HARDWARE_DEVICE_API_VERSION(1, 0)
|
||||
#define AUDIO_DEVICE_API_VERSION_2_0 HARDWARE_DEVICE_API_VERSION(2, 0)
|
||||
#define AUDIO_DEVICE_API_VERSION_3_0 HARDWARE_DEVICE_API_VERSION(3, 0)
|
||||
#define AUDIO_DEVICE_API_VERSION_CURRENT AUDIO_DEVICE_API_VERSION_3_0
|
||||
/* Minimal audio HAL version supported by the audio framework */
|
||||
#define AUDIO_DEVICE_API_VERSION_MIN AUDIO_DEVICE_API_VERSION_2_0
|
||||
|
||||
/**************************************/
|
||||
|
||||
/**
|
||||
* standard audio parameters that the HAL may need to handle
|
||||
*/
|
||||
|
||||
/**
|
||||
* audio device parameters
|
||||
*/
|
||||
|
||||
/* TTY mode selection */
|
||||
#define AUDIO_PARAMETER_KEY_TTY_MODE "tty_mode"
|
||||
#define AUDIO_PARAMETER_VALUE_TTY_OFF "tty_off"
|
||||
#define AUDIO_PARAMETER_VALUE_TTY_VCO "tty_vco"
|
||||
#define AUDIO_PARAMETER_VALUE_TTY_HCO "tty_hco"
|
||||
#define AUDIO_PARAMETER_VALUE_TTY_FULL "tty_full"
|
||||
|
||||
/* Hearing Aid Compatibility - Telecoil (HAC-T) mode on/off */
|
||||
#define AUDIO_PARAMETER_KEY_HAC "HACSetting"
|
||||
#define AUDIO_PARAMETER_VALUE_HAC_ON "ON"
|
||||
#define AUDIO_PARAMETER_VALUE_HAC_OFF "OFF"
|
||||
|
||||
/* A2DP sink address set by framework */
|
||||
#define AUDIO_PARAMETER_A2DP_SINK_ADDRESS "a2dp_sink_address"
|
||||
|
||||
/* A2DP source address set by framework */
|
||||
#define AUDIO_PARAMETER_A2DP_SOURCE_ADDRESS "a2dp_source_address"
|
||||
|
||||
/* Bluetooth SCO wideband */
|
||||
#define AUDIO_PARAMETER_KEY_BT_SCO_WB "bt_wbs"
|
||||
|
||||
/**
|
||||
* audio stream parameters
|
||||
*/
|
||||
|
||||
/* Enable AANC */
|
||||
#define AUDIO_PARAMETER_KEY_AANC "aanc_enabled"
|
||||
|
||||
/**************************************/
|
||||
|
||||
/* common audio stream parameters and operations */
|
||||
struct audio_stream {
|
||||
|
||||
/**
|
||||
* Return the sampling rate in Hz - eg. 44100.
|
||||
*/
|
||||
uint32_t (*get_sample_rate)(const struct audio_stream *stream);
|
||||
|
||||
/* currently unused - use set_parameters with key
|
||||
* AUDIO_PARAMETER_STREAM_SAMPLING_RATE
|
||||
*/
|
||||
int (*set_sample_rate)(struct audio_stream *stream, uint32_t rate);
|
||||
|
||||
/**
|
||||
* Return size of input/output buffer in bytes for this stream - eg. 4800.
|
||||
* It should be a multiple of the frame size. See also get_input_buffer_size.
|
||||
*/
|
||||
size_t (*get_buffer_size)(const struct audio_stream *stream);
|
||||
|
||||
/**
|
||||
* Return the channel mask -
|
||||
* e.g. AUDIO_CHANNEL_OUT_STEREO or AUDIO_CHANNEL_IN_STEREO
|
||||
*/
|
||||
audio_channel_mask_t (*get_channels)(const struct audio_stream *stream);
|
||||
|
||||
/**
|
||||
* Return the audio format - e.g. AUDIO_FORMAT_PCM_16_BIT
|
||||
*/
|
||||
audio_format_t (*get_format)(const struct audio_stream *stream);
|
||||
|
||||
/* currently unused - use set_parameters with key
|
||||
* AUDIO_PARAMETER_STREAM_FORMAT
|
||||
*/
|
||||
int (*set_format)(struct audio_stream *stream, audio_format_t format);
|
||||
|
||||
/**
|
||||
* Put the audio hardware input/output into standby mode.
|
||||
* Driver should exit from standby mode at the next I/O operation.
|
||||
* Returns 0 on success and <0 on failure.
|
||||
*/
|
||||
int (*standby)(struct audio_stream *stream);
|
||||
|
||||
/** dump the state of the audio input/output device */
|
||||
int (*dump)(const struct audio_stream *stream, int fd);
|
||||
|
||||
/** Return the set of device(s) which this stream is connected to */
|
||||
audio_devices_t (*get_device)(const struct audio_stream *stream);
|
||||
|
||||
/**
|
||||
* Currently unused - set_device() corresponds to set_parameters() with key
|
||||
* AUDIO_PARAMETER_STREAM_ROUTING for both input and output.
|
||||
* AUDIO_PARAMETER_STREAM_INPUT_SOURCE is an additional information used by
|
||||
* input streams only.
|
||||
*/
|
||||
int (*set_device)(struct audio_stream *stream, audio_devices_t device);
|
||||
|
||||
/**
|
||||
* set/get audio stream parameters. The function accepts a list of
|
||||
* parameter key value pairs in the form: key1=value1;key2=value2;...
|
||||
*
|
||||
* Some keys are reserved for standard parameters (See AudioParameter class)
|
||||
*
|
||||
* If the implementation does not accept a parameter change while
|
||||
* the output is active but the parameter is acceptable otherwise, it must
|
||||
* return -ENOSYS.
|
||||
*
|
||||
* The audio flinger will put the stream in standby and then change the
|
||||
* parameter value.
|
||||
*/
|
||||
int (*set_parameters)(struct audio_stream *stream, const char *kv_pairs);
|
||||
|
||||
/*
|
||||
* Returns a pointer to a heap allocated string. The caller is responsible
|
||||
* for freeing the memory for it using free().
|
||||
*/
|
||||
char * (*get_parameters)(const struct audio_stream *stream,
|
||||
const char *keys);
|
||||
int (*add_audio_effect)(const struct audio_stream *stream,
|
||||
effect_handle_t effect);
|
||||
int (*remove_audio_effect)(const struct audio_stream *stream,
|
||||
effect_handle_t effect);
|
||||
};
|
||||
typedef struct audio_stream audio_stream_t;
|
||||
|
||||
/* type of asynchronous write callback events. Mutually exclusive */
|
||||
typedef enum {
|
||||
STREAM_CBK_EVENT_WRITE_READY, /* non blocking write completed */
|
||||
STREAM_CBK_EVENT_DRAIN_READY, /* drain completed */
|
||||
STREAM_CBK_EVENT_ERROR, /* stream hit some error, let AF take action */
|
||||
} stream_callback_event_t;
|
||||
|
||||
typedef int (*stream_callback_t)(stream_callback_event_t event, void *param, void *cookie);
|
||||
|
||||
/* type of drain requested to audio_stream_out->drain(). Mutually exclusive */
|
||||
typedef enum {
|
||||
AUDIO_DRAIN_ALL, /* drain() returns when all data has been played */
|
||||
AUDIO_DRAIN_EARLY_NOTIFY /* drain() returns a short time before all data
|
||||
from the current track has been played to
|
||||
give time for gapless track switch */
|
||||
} audio_drain_type_t;
|
||||
|
||||
/**
|
||||
* audio_stream_out is the abstraction interface for the audio output hardware.
|
||||
*
|
||||
* It provides information about various properties of the audio output
|
||||
* hardware driver.
|
||||
*/
|
||||
|
||||
struct audio_stream_out {
|
||||
/**
|
||||
* Common methods of the audio stream out. This *must* be the first member of audio_stream_out
|
||||
* as users of this structure will cast a audio_stream to audio_stream_out pointer in contexts
|
||||
* where it's known the audio_stream references an audio_stream_out.
|
||||
*/
|
||||
struct audio_stream common;
|
||||
|
||||
/**
|
||||
* Return the audio hardware driver estimated latency in milliseconds.
|
||||
*/
|
||||
uint32_t (*get_latency)(const struct audio_stream_out *stream);
|
||||
|
||||
/**
|
||||
* Use this method in situations where audio mixing is done in the
|
||||
* hardware. This method serves as a direct interface with hardware,
|
||||
* allowing you to directly set the volume as apposed to via the framework.
|
||||
* This method might produce multiple PCM outputs or hardware accelerated
|
||||
* codecs, such as MP3 or AAC.
|
||||
*/
|
||||
int (*set_volume)(struct audio_stream_out *stream, float left, float right);
|
||||
|
||||
/**
|
||||
* Write audio buffer to driver. Returns number of bytes written, or a
|
||||
* negative status_t. If at least one frame was written successfully prior to the error,
|
||||
* it is suggested that the driver return that successful (short) byte count
|
||||
* and then return an error in the subsequent call.
|
||||
*
|
||||
* If set_callback() has previously been called to enable non-blocking mode
|
||||
* the write() is not allowed to block. It must write only the number of
|
||||
* bytes that currently fit in the driver/hardware buffer and then return
|
||||
* this byte count. If this is less than the requested write size the
|
||||
* callback function must be called when more space is available in the
|
||||
* driver/hardware buffer.
|
||||
*/
|
||||
ssize_t (*write)(struct audio_stream_out *stream, const void* buffer,
|
||||
size_t bytes);
|
||||
|
||||
/* return the number of audio frames written by the audio dsp to DAC since
|
||||
* the output has exited standby
|
||||
*/
|
||||
int (*get_render_position)(const struct audio_stream_out *stream,
|
||||
uint32_t *dsp_frames);
|
||||
|
||||
/**
|
||||
* get the local time at which the next write to the audio driver will be presented.
|
||||
* The units are microseconds, where the epoch is decided by the local audio HAL.
|
||||
*/
|
||||
int (*get_next_write_timestamp)(const struct audio_stream_out *stream,
|
||||
int64_t *timestamp);
|
||||
|
||||
/**
|
||||
* set the callback function for notifying completion of non-blocking
|
||||
* write and drain.
|
||||
* Calling this function implies that all future write() and drain()
|
||||
* must be non-blocking and use the callback to signal completion.
|
||||
*/
|
||||
int (*set_callback)(struct audio_stream_out *stream,
|
||||
stream_callback_t callback, void *cookie);
|
||||
|
||||
/**
|
||||
* Notifies to the audio driver to stop playback however the queued buffers are
|
||||
* retained by the hardware. Useful for implementing pause/resume. Empty implementation
|
||||
* if not supported however should be implemented for hardware with non-trivial
|
||||
* latency. In the pause state audio hardware could still be using power. User may
|
||||
* consider calling suspend after a timeout.
|
||||
*
|
||||
* Implementation of this function is mandatory for offloaded playback.
|
||||
*/
|
||||
int (*pause)(struct audio_stream_out* stream);
|
||||
|
||||
/**
|
||||
* Notifies to the audio driver to resume playback following a pause.
|
||||
* Returns error if called without matching pause.
|
||||
*
|
||||
* Implementation of this function is mandatory for offloaded playback.
|
||||
*/
|
||||
int (*resume)(struct audio_stream_out* stream);
|
||||
|
||||
/**
|
||||
* Requests notification when data buffered by the driver/hardware has
|
||||
* been played. If set_callback() has previously been called to enable
|
||||
* non-blocking mode, the drain() must not block, instead it should return
|
||||
* quickly and completion of the drain is notified through the callback.
|
||||
* If set_callback() has not been called, the drain() must block until
|
||||
* completion.
|
||||
* If type==AUDIO_DRAIN_ALL, the drain completes when all previously written
|
||||
* data has been played.
|
||||
* If type==AUDIO_DRAIN_EARLY_NOTIFY, the drain completes shortly before all
|
||||
* data for the current track has played to allow time for the framework
|
||||
* to perform a gapless track switch.
|
||||
*
|
||||
* Drain must return immediately on stop() and flush() call
|
||||
*
|
||||
* Implementation of this function is mandatory for offloaded playback.
|
||||
*/
|
||||
int (*drain)(struct audio_stream_out* stream, audio_drain_type_t type );
|
||||
|
||||
/**
|
||||
* Notifies to the audio driver to flush the queued data. Stream must already
|
||||
* be paused before calling flush().
|
||||
*
|
||||
* Implementation of this function is mandatory for offloaded playback.
|
||||
*/
|
||||
int (*flush)(struct audio_stream_out* stream);
|
||||
|
||||
/**
|
||||
* Return a recent count of the number of audio frames presented to an external observer.
|
||||
* This excludes frames which have been written but are still in the pipeline.
|
||||
* The count is not reset to zero when output enters standby.
|
||||
* Also returns the value of CLOCK_MONOTONIC as of this presentation count.
|
||||
* The returned count is expected to be 'recent',
|
||||
* but does not need to be the most recent possible value.
|
||||
* However, the associated time should correspond to whatever count is returned.
|
||||
* Example: assume that N+M frames have been presented, where M is a 'small' number.
|
||||
* Then it is permissible to return N instead of N+M,
|
||||
* and the timestamp should correspond to N rather than N+M.
|
||||
* The terms 'recent' and 'small' are not defined.
|
||||
* They reflect the quality of the implementation.
|
||||
*
|
||||
* 3.0 and higher only.
|
||||
*/
|
||||
int (*get_presentation_position)(const struct audio_stream_out *stream,
|
||||
uint64_t *frames, struct timespec *timestamp);
|
||||
|
||||
/**
|
||||
* Called by the framework to start a stream operating in mmap mode.
|
||||
* create_mmap_buffer must be called before calling start()
|
||||
*
|
||||
* \note Function only implemented by streams operating in mmap mode.
|
||||
*
|
||||
* \param[in] stream the stream object.
|
||||
* \return 0 in case of success.
|
||||
* -ENOSYS if called out of sequence or on non mmap stream
|
||||
*/
|
||||
int (*start)(const struct audio_stream_out* stream);
|
||||
|
||||
/**
|
||||
* Called by the framework to stop a stream operating in mmap mode.
|
||||
* Must be called after start()
|
||||
*
|
||||
* \note Function only implemented by streams operating in mmap mode.
|
||||
*
|
||||
* \param[in] stream the stream object.
|
||||
* \return 0 in case of success.
|
||||
* -ENOSYS if called out of sequence or on non mmap stream
|
||||
*/
|
||||
int (*stop)(const struct audio_stream_out* stream);
|
||||
|
||||
/**
|
||||
* Called by the framework to retrieve information on the mmap buffer used for audio
|
||||
* samples transfer.
|
||||
*
|
||||
* \note Function only implemented by streams operating in mmap mode.
|
||||
*
|
||||
* \param[in] stream the stream object.
|
||||
* \param[in] min_size_frames minimum buffer size requested. The actual buffer
|
||||
* size returned in struct audio_mmap_buffer_info can be larger.
|
||||
* \param[out] info address at which the mmap buffer information should be returned.
|
||||
*
|
||||
* \return 0 if the buffer was allocated.
|
||||
* -ENODEV in case of initialization error
|
||||
* -EINVAL if the requested buffer size is too large
|
||||
* -ENOSYS if called out of sequence (e.g. buffer already allocated)
|
||||
*/
|
||||
int (*create_mmap_buffer)(const struct audio_stream_out *stream,
|
||||
int32_t min_size_frames,
|
||||
struct audio_mmap_buffer_info *info);
|
||||
|
||||
/**
|
||||
* Called by the framework to read current read/write position in the mmap buffer
|
||||
* with associated time stamp.
|
||||
*
|
||||
* \note Function only implemented by streams operating in mmap mode.
|
||||
*
|
||||
* \param[in] stream the stream object.
|
||||
* \param[out] position address at which the mmap read/write position should be returned.
|
||||
*
|
||||
* \return 0 if the position is successfully returned.
|
||||
* -ENODATA if the position cannot be retrieved
|
||||
* -ENOSYS if called before create_mmap_buffer()
|
||||
*/
|
||||
int (*get_mmap_position)(const struct audio_stream_out *stream,
|
||||
struct audio_mmap_position *position);
|
||||
};
|
||||
typedef struct audio_stream_out audio_stream_out_t;
|
||||
|
||||
struct audio_stream_in {
|
||||
/**
|
||||
* Common methods of the audio stream in. This *must* be the first member of audio_stream_in
|
||||
* as users of this structure will cast a audio_stream to audio_stream_in pointer in contexts
|
||||
* where it's known the audio_stream references an audio_stream_in.
|
||||
*/
|
||||
struct audio_stream common;
|
||||
|
||||
/** set the input gain for the audio driver. This method is for
|
||||
* for future use */
|
||||
int (*set_gain)(struct audio_stream_in *stream, float gain);
|
||||
|
||||
/** Read audio buffer in from audio driver. Returns number of bytes read, or a
|
||||
* negative status_t. If at least one frame was read prior to the error,
|
||||
* read should return that byte count and then return an error in the subsequent call.
|
||||
*/
|
||||
ssize_t (*read)(struct audio_stream_in *stream, void* buffer,
|
||||
size_t bytes);
|
||||
|
||||
/**
|
||||
* Return the amount of input frames lost in the audio driver since the
|
||||
* last call of this function.
|
||||
* Audio driver is expected to reset the value to 0 and restart counting
|
||||
* upon returning the current value by this function call.
|
||||
* Such loss typically occurs when the user space process is blocked
|
||||
* longer than the capacity of audio driver buffers.
|
||||
*
|
||||
* Unit: the number of input audio frames
|
||||
*/
|
||||
uint32_t (*get_input_frames_lost)(struct audio_stream_in *stream);
|
||||
|
||||
/**
|
||||
* Return a recent count of the number of audio frames received and
|
||||
* the clock time associated with that frame count.
|
||||
*
|
||||
* frames is the total frame count received. This should be as early in
|
||||
* the capture pipeline as possible. In general,
|
||||
* frames should be non-negative and should not go "backwards".
|
||||
*
|
||||
* time is the clock MONOTONIC time when frames was measured. In general,
|
||||
* time should be a positive quantity and should not go "backwards".
|
||||
*
|
||||
* The status returned is 0 on success, -ENOSYS if the device is not
|
||||
* ready/available, or -EINVAL if the arguments are null or otherwise invalid.
|
||||
*/
|
||||
int (*get_capture_position)(const struct audio_stream_in *stream,
|
||||
int64_t *frames, int64_t *time);
|
||||
|
||||
/**
|
||||
* Called by the framework to start a stream operating in mmap mode.
|
||||
* create_mmap_buffer must be called before calling start()
|
||||
*
|
||||
* \note Function only implemented by streams operating in mmap mode.
|
||||
*
|
||||
* \param[in] stream the stream object.
|
||||
* \return 0 in case off success.
|
||||
* -ENOSYS if called out of sequence or on non mmap stream
|
||||
*/
|
||||
int (*start)(const struct audio_stream_in* stream);
|
||||
|
||||
/**
|
||||
* Called by the framework to stop a stream operating in mmap mode.
|
||||
*
|
||||
* \note Function only implemented by streams operating in mmap mode.
|
||||
*
|
||||
* \param[in] stream the stream object.
|
||||
* \return 0 in case of success.
|
||||
* -ENOSYS if called out of sequence or on non mmap stream
|
||||
*/
|
||||
int (*stop)(const struct audio_stream_in* stream);
|
||||
|
||||
/**
|
||||
* Called by the framework to retrieve information on the mmap buffer used for audio
|
||||
* samples transfer.
|
||||
*
|
||||
* \note Function only implemented by streams operating in mmap mode.
|
||||
*
|
||||
* \param[in] stream the stream object.
|
||||
* \param[in] min_size_frames minimum buffer size requested. The actual buffer
|
||||
* size returned in struct audio_mmap_buffer_info can be larger.
|
||||
* \param[out] info address at which the mmap buffer information should be returned.
|
||||
*
|
||||
* \return 0 if the buffer was allocated.
|
||||
* -ENODEV in case of initialization error
|
||||
* -EINVAL if the requested buffer size is too large
|
||||
* -ENOSYS if called out of sequence (e.g. buffer already allocated)
|
||||
*/
|
||||
int (*create_mmap_buffer)(const struct audio_stream_in *stream,
|
||||
int32_t min_size_frames,
|
||||
struct audio_mmap_buffer_info *info);
|
||||
|
||||
/**
|
||||
* Called by the framework to read current read/write position in the mmap buffer
|
||||
* with associated time stamp.
|
||||
*
|
||||
* \note Function only implemented by streams operating in mmap mode.
|
||||
*
|
||||
* \param[in] stream the stream object.
|
||||
* \param[out] position address at which the mmap read/write position should be returned.
|
||||
*
|
||||
* \return 0 if the position is successfully returned.
|
||||
* -ENODATA if the position cannot be retreived
|
||||
* -ENOSYS if called before mmap_read_position()
|
||||
*/
|
||||
int (*get_mmap_position)(const struct audio_stream_in *stream,
|
||||
struct audio_mmap_position *position);
|
||||
};
|
||||
typedef struct audio_stream_in audio_stream_in_t;
|
||||
|
||||
/**
|
||||
* return the frame size (number of bytes per sample).
|
||||
*
|
||||
* Deprecated: use audio_stream_out_frame_size() or audio_stream_in_frame_size() instead.
|
||||
*/
|
||||
__attribute__((__deprecated__))
|
||||
static inline size_t audio_stream_frame_size(const struct audio_stream *s)
|
||||
{
|
||||
size_t chan_samp_sz;
|
||||
audio_format_t format = s->get_format(s);
|
||||
|
||||
if (audio_has_proportional_frames(format)) {
|
||||
chan_samp_sz = audio_bytes_per_sample(format);
|
||||
return popcount(s->get_channels(s)) * chan_samp_sz;
|
||||
}
|
||||
|
||||
return sizeof(int8_t);
|
||||
}
|
||||
|
||||
/**
|
||||
* return the frame size (number of bytes per sample) of an output stream.
|
||||
*/
|
||||
static inline size_t audio_stream_out_frame_size(const struct audio_stream_out *s)
|
||||
{
|
||||
size_t chan_samp_sz;
|
||||
audio_format_t format = s->common.get_format(&s->common);
|
||||
|
||||
if (audio_has_proportional_frames(format)) {
|
||||
chan_samp_sz = audio_bytes_per_sample(format);
|
||||
return audio_channel_count_from_out_mask(s->common.get_channels(&s->common)) * chan_samp_sz;
|
||||
}
|
||||
|
||||
return sizeof(int8_t);
|
||||
}
|
||||
|
||||
/**
|
||||
* return the frame size (number of bytes per sample) of an input stream.
|
||||
*/
|
||||
static inline size_t audio_stream_in_frame_size(const struct audio_stream_in *s)
|
||||
{
|
||||
size_t chan_samp_sz;
|
||||
audio_format_t format = s->common.get_format(&s->common);
|
||||
|
||||
if (audio_has_proportional_frames(format)) {
|
||||
chan_samp_sz = audio_bytes_per_sample(format);
|
||||
return audio_channel_count_from_in_mask(s->common.get_channels(&s->common)) * chan_samp_sz;
|
||||
}
|
||||
|
||||
return sizeof(int8_t);
|
||||
}
|
||||
|
||||
/**********************************************************************/
|
||||
|
||||
/**
|
||||
* Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
|
||||
* and the fields of this data structure must begin with hw_module_t
|
||||
* followed by module specific information.
|
||||
*/
|
||||
struct audio_module {
|
||||
struct hw_module_t common;
|
||||
};
|
||||
|
||||
struct audio_hw_device {
|
||||
/**
|
||||
* Common methods of the audio device. This *must* be the first member of audio_hw_device
|
||||
* as users of this structure will cast a hw_device_t to audio_hw_device pointer in contexts
|
||||
* where it's known the hw_device_t references an audio_hw_device.
|
||||
*/
|
||||
struct hw_device_t common;
|
||||
|
||||
/**
|
||||
* used by audio flinger to enumerate what devices are supported by
|
||||
* each audio_hw_device implementation.
|
||||
*
|
||||
* Return value is a bitmask of 1 or more values of audio_devices_t
|
||||
*
|
||||
* NOTE: audio HAL implementations starting with
|
||||
* AUDIO_DEVICE_API_VERSION_2_0 do not implement this function.
|
||||
* All supported devices should be listed in audio_policy.conf
|
||||
* file and the audio policy manager must choose the appropriate
|
||||
* audio module based on information in this file.
|
||||
*/
|
||||
uint32_t (*get_supported_devices)(const struct audio_hw_device *dev);
|
||||
|
||||
/**
|
||||
* check to see if the audio hardware interface has been initialized.
|
||||
* returns 0 on success, -ENODEV on failure.
|
||||
*/
|
||||
int (*init_check)(const struct audio_hw_device *dev);
|
||||
|
||||
/** set the audio volume of a voice call. Range is between 0.0 and 1.0 */
|
||||
int (*set_voice_volume)(struct audio_hw_device *dev, float volume);
|
||||
|
||||
/**
|
||||
* set the audio volume for all audio activities other than voice call.
|
||||
* Range between 0.0 and 1.0. If any value other than 0 is returned,
|
||||
* the software mixer will emulate this capability.
|
||||
*/
|
||||
int (*set_master_volume)(struct audio_hw_device *dev, float volume);
|
||||
|
||||
/**
|
||||
* Get the current master volume value for the HAL, if the HAL supports
|
||||
* master volume control. AudioFlinger will query this value from the
|
||||
* primary audio HAL when the service starts and use the value for setting
|
||||
* the initial master volume across all HALs. HALs which do not support
|
||||
* this method may leave it set to NULL.
|
||||
*/
|
||||
int (*get_master_volume)(struct audio_hw_device *dev, float *volume);
|
||||
|
||||
/**
|
||||
* set_mode is called when the audio mode changes. AUDIO_MODE_NORMAL mode
|
||||
* is for standard audio playback, AUDIO_MODE_RINGTONE when a ringtone is
|
||||
* playing, and AUDIO_MODE_IN_CALL when a call is in progress.
|
||||
*/
|
||||
int (*set_mode)(struct audio_hw_device *dev, audio_mode_t mode);
|
||||
|
||||
/* mic mute */
|
||||
int (*set_mic_mute)(struct audio_hw_device *dev, bool state);
|
||||
int (*get_mic_mute)(const struct audio_hw_device *dev, bool *state);
|
||||
|
||||
/* set/get global audio parameters */
|
||||
int (*set_parameters)(struct audio_hw_device *dev, const char *kv_pairs);
|
||||
|
||||
/*
|
||||
* Returns a pointer to a heap allocated string. The caller is responsible
|
||||
* for freeing the memory for it using free().
|
||||
*/
|
||||
char * (*get_parameters)(const struct audio_hw_device *dev,
|
||||
const char *keys);
|
||||
|
||||
/* Returns audio input buffer size according to parameters passed or
|
||||
* 0 if one of the parameters is not supported.
|
||||
* See also get_buffer_size which is for a particular stream.
|
||||
*/
|
||||
size_t (*get_input_buffer_size)(const struct audio_hw_device *dev,
|
||||
const struct audio_config *config);
|
||||
|
||||
/** This method creates and opens the audio hardware output stream.
|
||||
* The "address" parameter qualifies the "devices" audio device type if needed.
|
||||
* The format format depends on the device type:
|
||||
* - Bluetooth devices use the MAC address of the device in the form "00:11:22:AA:BB:CC"
|
||||
* - USB devices use the ALSA card and device numbers in the form "card=X;device=Y"
|
||||
* - Other devices may use a number or any other string.
|
||||
*/
|
||||
|
||||
int (*open_output_stream)(struct audio_hw_device *dev,
|
||||
audio_io_handle_t handle,
|
||||
audio_devices_t devices,
|
||||
audio_output_flags_t flags,
|
||||
struct audio_config *config,
|
||||
struct audio_stream_out **stream_out,
|
||||
const char *address);
|
||||
|
||||
void (*close_output_stream)(struct audio_hw_device *dev,
|
||||
struct audio_stream_out* stream_out);
|
||||
|
||||
/** This method creates and opens the audio hardware input stream */
|
||||
int (*open_input_stream)(struct audio_hw_device *dev,
|
||||
audio_io_handle_t handle,
|
||||
audio_devices_t devices,
|
||||
struct audio_config *config,
|
||||
struct audio_stream_in **stream_in,
|
||||
audio_input_flags_t flags,
|
||||
const char *address,
|
||||
audio_source_t source);
|
||||
|
||||
void (*close_input_stream)(struct audio_hw_device *dev,
|
||||
struct audio_stream_in *stream_in);
|
||||
|
||||
/** This method dumps the state of the audio hardware */
|
||||
int (*dump)(const struct audio_hw_device *dev, int fd);
|
||||
|
||||
/**
|
||||
* set the audio mute status for all audio activities. If any value other
|
||||
* than 0 is returned, the software mixer will emulate this capability.
|
||||
*/
|
||||
int (*set_master_mute)(struct audio_hw_device *dev, bool mute);
|
||||
|
||||
/**
|
||||
* Get the current master mute status for the HAL, if the HAL supports
|
||||
* master mute control. AudioFlinger will query this value from the primary
|
||||
* audio HAL when the service starts and use the value for setting the
|
||||
* initial master mute across all HALs. HALs which do not support this
|
||||
* method may leave it set to NULL.
|
||||
*/
|
||||
int (*get_master_mute)(struct audio_hw_device *dev, bool *mute);
|
||||
|
||||
/**
|
||||
* Routing control
|
||||
*/
|
||||
|
||||
/* Creates an audio patch between several source and sink ports.
|
||||
* The handle is allocated by the HAL and should be unique for this
|
||||
* audio HAL module. */
|
||||
int (*create_audio_patch)(struct audio_hw_device *dev,
|
||||
unsigned int num_sources,
|
||||
const struct audio_port_config *sources,
|
||||
unsigned int num_sinks,
|
||||
const struct audio_port_config *sinks,
|
||||
audio_patch_handle_t *handle);
|
||||
|
||||
/* Release an audio patch */
|
||||
int (*release_audio_patch)(struct audio_hw_device *dev,
|
||||
audio_patch_handle_t handle);
|
||||
|
||||
/* Fills the list of supported attributes for a given audio port.
|
||||
* As input, "port" contains the information (type, role, address etc...)
|
||||
* needed by the HAL to identify the port.
|
||||
* As output, "port" contains possible attributes (sampling rates, formats,
|
||||
* channel masks, gain controllers...) for this port.
|
||||
*/
|
||||
int (*get_audio_port)(struct audio_hw_device *dev,
|
||||
struct audio_port *port);
|
||||
|
||||
/* Set audio port configuration */
|
||||
int (*set_audio_port_config)(struct audio_hw_device *dev,
|
||||
const struct audio_port_config *config);
|
||||
|
||||
};
|
||||
typedef struct audio_hw_device audio_hw_device_t;
|
||||
|
||||
/** convenience API for opening and closing a supported device */
|
||||
|
||||
static inline int audio_hw_device_open(const struct hw_module_t* module,
|
||||
struct audio_hw_device** device)
|
||||
{
|
||||
return module->methods->open(module, AUDIO_HARDWARE_INTERFACE,
|
||||
TO_HW_DEVICE_T_OPEN(device));
|
||||
}
|
||||
|
||||
static inline int audio_hw_device_close(struct audio_hw_device* device)
|
||||
{
|
||||
return device->common.close(&device->common);
|
||||
}
|
||||
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif // ANDROID_AUDIO_INTERFACE_H
|
103
include/hardware/audio_alsaops.h
Normal file
103
include/hardware/audio_alsaops.h
Normal file
|
@ -0,0 +1,103 @@
|
|||
/*
|
||||
* Copyright (C) 2014 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.
|
||||
*/
|
||||
|
||||
/* This file contains shared utility functions to handle the tinyalsa
|
||||
* implementation for Android internal audio, generally in the hardware layer.
|
||||
* Some routines may log a fatal error on failure, as noted.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_AUDIO_ALSAOPS_H
|
||||
#define ANDROID_AUDIO_ALSAOPS_H
|
||||
|
||||
#include <log/log.h>
|
||||
|
||||
#include <system/audio.h>
|
||||
#include <tinyalsa/asoundlib.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
/* Converts audio_format to pcm_format.
|
||||
* Parameters:
|
||||
* format the audio_format_t to convert
|
||||
*
|
||||
* Logs a fatal error if format is not a valid convertible audio_format_t.
|
||||
*/
|
||||
static inline enum pcm_format pcm_format_from_audio_format(audio_format_t format)
|
||||
{
|
||||
switch (format) {
|
||||
#if HAVE_BIG_ENDIAN
|
||||
case AUDIO_FORMAT_PCM_16_BIT:
|
||||
return PCM_FORMAT_S16_BE;
|
||||
case AUDIO_FORMAT_PCM_24_BIT_PACKED:
|
||||
return PCM_FORMAT_S24_3BE;
|
||||
case AUDIO_FORMAT_PCM_32_BIT:
|
||||
return PCM_FORMAT_S32_BE;
|
||||
case AUDIO_FORMAT_PCM_8_24_BIT:
|
||||
return PCM_FORMAT_S24_BE;
|
||||
#else
|
||||
case AUDIO_FORMAT_PCM_16_BIT:
|
||||
return PCM_FORMAT_S16_LE;
|
||||
case AUDIO_FORMAT_PCM_24_BIT_PACKED:
|
||||
return PCM_FORMAT_S24_3LE;
|
||||
case AUDIO_FORMAT_PCM_32_BIT:
|
||||
return PCM_FORMAT_S32_LE;
|
||||
case AUDIO_FORMAT_PCM_8_24_BIT:
|
||||
return PCM_FORMAT_S24_LE;
|
||||
#endif
|
||||
case AUDIO_FORMAT_PCM_FLOAT: /* there is no equivalent for float */
|
||||
default:
|
||||
LOG_ALWAYS_FATAL("pcm_format_from_audio_format: invalid audio format %#x", format);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Converts pcm_format to audio_format.
|
||||
* Parameters:
|
||||
* format the pcm_format to convert
|
||||
*
|
||||
* Logs a fatal error if format is not a valid convertible pcm_format.
|
||||
*/
|
||||
static inline audio_format_t audio_format_from_pcm_format(enum pcm_format format)
|
||||
{
|
||||
switch (format) {
|
||||
#if HAVE_BIG_ENDIAN
|
||||
case PCM_FORMAT_S16_BE:
|
||||
return AUDIO_FORMAT_PCM_16_BIT;
|
||||
case PCM_FORMAT_S24_3BE:
|
||||
return AUDIO_FORMAT_PCM_24_BIT_PACKED;
|
||||
case PCM_FORMAT_S24_BE:
|
||||
return AUDIO_FORMAT_PCM_8_24_BIT;
|
||||
case PCM_FORMAT_S32_BE:
|
||||
return AUDIO_FORMAT_PCM_32_BIT;
|
||||
#else
|
||||
case PCM_FORMAT_S16_LE:
|
||||
return AUDIO_FORMAT_PCM_16_BIT;
|
||||
case PCM_FORMAT_S24_3LE:
|
||||
return AUDIO_FORMAT_PCM_24_BIT_PACKED;
|
||||
case PCM_FORMAT_S24_LE:
|
||||
return AUDIO_FORMAT_PCM_8_24_BIT;
|
||||
case PCM_FORMAT_S32_LE:
|
||||
return AUDIO_FORMAT_PCM_32_BIT;
|
||||
#endif
|
||||
default:
|
||||
LOG_ALWAYS_FATAL("audio_format_from_pcm_format: invalid pcm format %#x", format);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* ANDROID_AUDIO_ALSAOPS_H */
|
310
include/hardware/audio_effect.h
Normal file
310
include/hardware/audio_effect.h
Normal file
|
@ -0,0 +1,310 @@
|
|||
/*
|
||||
* 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 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);
|
||||
} 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
|
457
include/hardware/audio_policy.h
Normal file
457
include/hardware/audio_policy.h
Normal file
|
@ -0,0 +1,457 @@
|
|||
/*
|
||||
* 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_POLICY_INTERFACE_H
|
||||
#define ANDROID_AUDIO_POLICY_INTERFACE_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/cdefs.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <hardware/hardware.h>
|
||||
|
||||
#include <system/audio.h>
|
||||
#include <system/audio_policy.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* The id of this module
|
||||
*/
|
||||
#define AUDIO_POLICY_HARDWARE_MODULE_ID "audio_policy"
|
||||
|
||||
/**
|
||||
* Name of the audio devices to open
|
||||
*/
|
||||
#define AUDIO_POLICY_INTERFACE "policy"
|
||||
|
||||
/* ---------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* The audio_policy and audio_policy_service_ops structs define the
|
||||
* communication interfaces between the platform specific audio policy manager
|
||||
* and Android generic audio policy manager.
|
||||
* The platform specific audio policy manager must implement methods of the
|
||||
* audio_policy struct.
|
||||
* This implementation makes use of the audio_policy_service_ops to control
|
||||
* the activity and configuration of audio input and output streams.
|
||||
*
|
||||
* The platform specific audio policy manager is in charge of the audio
|
||||
* routing and volume control policies for a given platform.
|
||||
* The main roles of this module are:
|
||||
* - keep track of current system state (removable device connections, phone
|
||||
* state, user requests...).
|
||||
* System state changes and user actions are notified to audio policy
|
||||
* manager with methods of the audio_policy.
|
||||
*
|
||||
* - process get_output() queries received when AudioTrack objects are
|
||||
* created: Those queries return a handler on an output that has been
|
||||
* selected, configured and opened by the audio policy manager and that
|
||||
* must be used by the AudioTrack when registering to the AudioFlinger
|
||||
* with the createTrack() method.
|
||||
* When the AudioTrack object is released, a release_output() query
|
||||
* is received and the audio policy manager can decide to close or
|
||||
* reconfigure the output depending on other streams using this output and
|
||||
* current system state.
|
||||
*
|
||||
* - similarly process get_input() and release_input() queries received from
|
||||
* AudioRecord objects and configure audio inputs.
|
||||
* - process volume control requests: the stream volume is converted from
|
||||
* an index value (received from UI) to a float value applicable to each
|
||||
* output as a function of platform specific settings and current output
|
||||
* route (destination device). It also make sure that streams are not
|
||||
* muted if not allowed (e.g. camera shutter sound in some countries).
|
||||
*/
|
||||
|
||||
/* XXX: this should be defined OUTSIDE of frameworks/base */
|
||||
struct effect_descriptor_s;
|
||||
|
||||
struct audio_policy {
|
||||
/*
|
||||
* configuration functions
|
||||
*/
|
||||
|
||||
/* indicate a change in device connection status */
|
||||
int (*set_device_connection_state)(struct audio_policy *pol,
|
||||
audio_devices_t device,
|
||||
audio_policy_dev_state_t state,
|
||||
const char *device_address);
|
||||
|
||||
/* retrieve a device connection status */
|
||||
audio_policy_dev_state_t (*get_device_connection_state)(
|
||||
const struct audio_policy *pol,
|
||||
audio_devices_t device,
|
||||
const char *device_address);
|
||||
|
||||
/* indicate a change in phone state. Valid phones states are defined
|
||||
* by audio_mode_t */
|
||||
void (*set_phone_state)(struct audio_policy *pol, audio_mode_t state);
|
||||
|
||||
/* deprecated, never called (was "indicate a change in ringer mode") */
|
||||
void (*set_ringer_mode)(struct audio_policy *pol, uint32_t mode,
|
||||
uint32_t mask);
|
||||
|
||||
/* force using a specific device category for the specified usage */
|
||||
void (*set_force_use)(struct audio_policy *pol,
|
||||
audio_policy_force_use_t usage,
|
||||
audio_policy_forced_cfg_t config);
|
||||
|
||||
/* retrieve current device category forced for a given usage */
|
||||
audio_policy_forced_cfg_t (*get_force_use)(const struct audio_policy *pol,
|
||||
audio_policy_force_use_t usage);
|
||||
|
||||
/* if can_mute is true, then audio streams that are marked ENFORCED_AUDIBLE
|
||||
* can still be muted. */
|
||||
void (*set_can_mute_enforced_audible)(struct audio_policy *pol,
|
||||
bool can_mute);
|
||||
|
||||
/* check proper initialization */
|
||||
int (*init_check)(const struct audio_policy *pol);
|
||||
|
||||
/*
|
||||
* Audio routing query functions
|
||||
*/
|
||||
|
||||
/* request an output appropriate for playback of the supplied stream type and
|
||||
* parameters */
|
||||
audio_io_handle_t (*get_output)(struct audio_policy *pol,
|
||||
audio_stream_type_t stream,
|
||||
uint32_t samplingRate,
|
||||
audio_format_t format,
|
||||
audio_channel_mask_t channelMask,
|
||||
audio_output_flags_t flags,
|
||||
const audio_offload_info_t *offloadInfo);
|
||||
|
||||
/* indicates to the audio policy manager that the output starts being used
|
||||
* by corresponding stream. */
|
||||
int (*start_output)(struct audio_policy *pol,
|
||||
audio_io_handle_t output,
|
||||
audio_stream_type_t stream,
|
||||
audio_session_t session);
|
||||
|
||||
/* indicates to the audio policy manager that the output stops being used
|
||||
* by corresponding stream. */
|
||||
int (*stop_output)(struct audio_policy *pol,
|
||||
audio_io_handle_t output,
|
||||
audio_stream_type_t stream,
|
||||
audio_session_t session);
|
||||
|
||||
/* releases the output. */
|
||||
void (*release_output)(struct audio_policy *pol, audio_io_handle_t output);
|
||||
|
||||
/* request an input appropriate for record from the supplied device with
|
||||
* supplied parameters. */
|
||||
audio_io_handle_t (*get_input)(struct audio_policy *pol, audio_source_t inputSource,
|
||||
uint32_t samplingRate,
|
||||
audio_format_t format,
|
||||
audio_channel_mask_t channelMask,
|
||||
audio_in_acoustics_t acoustics);
|
||||
|
||||
/* indicates to the audio policy manager that the input starts being used */
|
||||
int (*start_input)(struct audio_policy *pol, audio_io_handle_t input);
|
||||
|
||||
/* indicates to the audio policy manager that the input stops being used. */
|
||||
int (*stop_input)(struct audio_policy *pol, audio_io_handle_t input);
|
||||
|
||||
/* releases the input. */
|
||||
void (*release_input)(struct audio_policy *pol, audio_io_handle_t input);
|
||||
|
||||
/*
|
||||
* volume control functions
|
||||
*/
|
||||
|
||||
/* initialises stream volume conversion parameters by specifying volume
|
||||
* index range. The index range for each stream is defined by AudioService. */
|
||||
void (*init_stream_volume)(struct audio_policy *pol,
|
||||
audio_stream_type_t stream,
|
||||
int index_min,
|
||||
int index_max);
|
||||
|
||||
/* sets the new stream volume at a level corresponding to the supplied
|
||||
* index. The index is within the range specified by init_stream_volume() */
|
||||
int (*set_stream_volume_index)(struct audio_policy *pol,
|
||||
audio_stream_type_t stream,
|
||||
int index);
|
||||
|
||||
/* retrieve current volume index for the specified stream */
|
||||
int (*get_stream_volume_index)(const struct audio_policy *pol,
|
||||
audio_stream_type_t stream,
|
||||
int *index);
|
||||
|
||||
/* sets the new stream volume at a level corresponding to the supplied
|
||||
* index for the specified device.
|
||||
* The index is within the range specified by init_stream_volume() */
|
||||
int (*set_stream_volume_index_for_device)(struct audio_policy *pol,
|
||||
audio_stream_type_t stream,
|
||||
int index,
|
||||
audio_devices_t device);
|
||||
|
||||
/* retrieve current volume index for the specified stream for the specified device */
|
||||
int (*get_stream_volume_index_for_device)(const struct audio_policy *pol,
|
||||
audio_stream_type_t stream,
|
||||
int *index,
|
||||
audio_devices_t device);
|
||||
|
||||
/* return the strategy corresponding to a given stream type */
|
||||
uint32_t (*get_strategy_for_stream)(const struct audio_policy *pol,
|
||||
audio_stream_type_t stream);
|
||||
|
||||
/* return the enabled output devices for the given stream type */
|
||||
audio_devices_t (*get_devices_for_stream)(const struct audio_policy *pol,
|
||||
audio_stream_type_t stream);
|
||||
|
||||
/* Audio effect management */
|
||||
audio_io_handle_t (*get_output_for_effect)(struct audio_policy *pol,
|
||||
const struct effect_descriptor_s *desc);
|
||||
|
||||
int (*register_effect)(struct audio_policy *pol,
|
||||
const struct effect_descriptor_s *desc,
|
||||
audio_io_handle_t output,
|
||||
uint32_t strategy,
|
||||
audio_session_t session,
|
||||
int id);
|
||||
|
||||
int (*unregister_effect)(struct audio_policy *pol, int id);
|
||||
|
||||
int (*set_effect_enabled)(struct audio_policy *pol, int id, bool enabled);
|
||||
|
||||
bool (*is_stream_active)(const struct audio_policy *pol,
|
||||
audio_stream_type_t stream,
|
||||
uint32_t in_past_ms);
|
||||
|
||||
bool (*is_stream_active_remotely)(const struct audio_policy *pol,
|
||||
audio_stream_type_t stream,
|
||||
uint32_t in_past_ms);
|
||||
|
||||
bool (*is_source_active)(const struct audio_policy *pol,
|
||||
audio_source_t source);
|
||||
|
||||
/* dump state */
|
||||
int (*dump)(const struct audio_policy *pol, int fd);
|
||||
|
||||
/* check if offload is possible for given sample rate, bitrate, duration, ... */
|
||||
bool (*is_offload_supported)(const struct audio_policy *pol,
|
||||
const audio_offload_info_t *info);
|
||||
};
|
||||
|
||||
|
||||
struct audio_policy_service_ops {
|
||||
/*
|
||||
* Audio output Control functions
|
||||
*/
|
||||
|
||||
/* Opens an audio output with the requested parameters.
|
||||
*
|
||||
* The parameter values can indicate to use the default values in case the
|
||||
* audio policy manager has no specific requirements for the output being
|
||||
* opened.
|
||||
*
|
||||
* When the function returns, the parameter values reflect the actual
|
||||
* values used by the audio hardware output stream.
|
||||
*
|
||||
* The audio policy manager can check if the proposed parameters are
|
||||
* suitable or not and act accordingly.
|
||||
*/
|
||||
audio_io_handle_t (*open_output)(void *service,
|
||||
audio_devices_t *pDevices,
|
||||
uint32_t *pSamplingRate,
|
||||
audio_format_t *pFormat,
|
||||
audio_channel_mask_t *pChannelMask,
|
||||
uint32_t *pLatencyMs,
|
||||
audio_output_flags_t flags);
|
||||
|
||||
/* creates a special output that is duplicated to the two outputs passed as
|
||||
* arguments. The duplication is performed by
|
||||
* a special mixer thread in the AudioFlinger.
|
||||
*/
|
||||
audio_io_handle_t (*open_duplicate_output)(void *service,
|
||||
audio_io_handle_t output1,
|
||||
audio_io_handle_t output2);
|
||||
|
||||
/* closes the output stream */
|
||||
int (*close_output)(void *service, audio_io_handle_t output);
|
||||
|
||||
/* suspends the output.
|
||||
*
|
||||
* When an output is suspended, the corresponding audio hardware output
|
||||
* stream is placed in standby and the AudioTracks attached to the mixer
|
||||
* thread are still processed but the output mix is discarded.
|
||||
*/
|
||||
int (*suspend_output)(void *service, audio_io_handle_t output);
|
||||
|
||||
/* restores a suspended output. */
|
||||
int (*restore_output)(void *service, audio_io_handle_t output);
|
||||
|
||||
/* */
|
||||
/* Audio input Control functions */
|
||||
/* */
|
||||
|
||||
/* opens an audio input
|
||||
* deprecated - new implementations should use open_input_on_module,
|
||||
* and the acoustics parameter is ignored
|
||||
*/
|
||||
audio_io_handle_t (*open_input)(void *service,
|
||||
audio_devices_t *pDevices,
|
||||
uint32_t *pSamplingRate,
|
||||
audio_format_t *pFormat,
|
||||
audio_channel_mask_t *pChannelMask,
|
||||
audio_in_acoustics_t acoustics);
|
||||
|
||||
/* closes an audio input */
|
||||
int (*close_input)(void *service, audio_io_handle_t input);
|
||||
|
||||
/* */
|
||||
/* misc control functions */
|
||||
/* */
|
||||
|
||||
/* set a stream volume for a particular output.
|
||||
*
|
||||
* For the same user setting, a given stream type can have different
|
||||
* volumes for each output (destination device) it is attached to.
|
||||
*/
|
||||
int (*set_stream_volume)(void *service,
|
||||
audio_stream_type_t stream,
|
||||
float volume,
|
||||
audio_io_handle_t output,
|
||||
int delay_ms);
|
||||
|
||||
/* invalidate a stream type, causing a reroute to an unspecified new output */
|
||||
int (*invalidate_stream)(void *service,
|
||||
audio_stream_type_t stream);
|
||||
|
||||
/* function enabling to send proprietary informations directly from audio
|
||||
* policy manager to audio hardware interface. */
|
||||
void (*set_parameters)(void *service,
|
||||
audio_io_handle_t io_handle,
|
||||
const char *kv_pairs,
|
||||
int delay_ms);
|
||||
|
||||
/* function enabling to receive proprietary informations directly from
|
||||
* audio hardware interface to audio policy manager.
|
||||
*
|
||||
* Returns a pointer to a heap allocated string. The caller is responsible
|
||||
* for freeing the memory for it using free().
|
||||
*/
|
||||
|
||||
char * (*get_parameters)(void *service, audio_io_handle_t io_handle,
|
||||
const char *keys);
|
||||
|
||||
/* request the playback of a tone on the specified stream.
|
||||
* used for instance to replace notification sounds when playing over a
|
||||
* telephony device during a phone call.
|
||||
*/
|
||||
int (*start_tone)(void *service,
|
||||
audio_policy_tone_t tone,
|
||||
audio_stream_type_t stream);
|
||||
|
||||
int (*stop_tone)(void *service);
|
||||
|
||||
/* set down link audio volume. */
|
||||
int (*set_voice_volume)(void *service,
|
||||
float volume,
|
||||
int delay_ms);
|
||||
|
||||
/* move effect to the specified output */
|
||||
int (*move_effects)(void *service,
|
||||
audio_session_t session,
|
||||
audio_io_handle_t src_output,
|
||||
audio_io_handle_t dst_output);
|
||||
|
||||
/* loads an audio hw module.
|
||||
*
|
||||
* The module name passed is the base name of the HW module library, e.g "primary" or "a2dp".
|
||||
* The function returns a handle on the module that will be used to specify a particular
|
||||
* module when calling open_output_on_module() or open_input_on_module()
|
||||
*/
|
||||
audio_module_handle_t (*load_hw_module)(void *service,
|
||||
const char *name);
|
||||
|
||||
/* Opens an audio output on a particular HW module.
|
||||
*
|
||||
* Same as open_output() but specifying a specific HW module on which the output must be opened.
|
||||
*/
|
||||
audio_io_handle_t (*open_output_on_module)(void *service,
|
||||
audio_module_handle_t module,
|
||||
audio_devices_t *pDevices,
|
||||
uint32_t *pSamplingRate,
|
||||
audio_format_t *pFormat,
|
||||
audio_channel_mask_t *pChannelMask,
|
||||
uint32_t *pLatencyMs,
|
||||
audio_output_flags_t flags,
|
||||
const audio_offload_info_t *offloadInfo);
|
||||
|
||||
/* Opens an audio input on a particular HW module.
|
||||
*
|
||||
* Same as open_input() but specifying a specific HW module on which the input must be opened.
|
||||
* Also removed deprecated acoustics parameter
|
||||
*/
|
||||
audio_io_handle_t (*open_input_on_module)(void *service,
|
||||
audio_module_handle_t module,
|
||||
audio_devices_t *pDevices,
|
||||
uint32_t *pSamplingRate,
|
||||
audio_format_t *pFormat,
|
||||
audio_channel_mask_t *pChannelMask);
|
||||
|
||||
};
|
||||
|
||||
/**********************************************************************/
|
||||
|
||||
/**
|
||||
* Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
|
||||
* and the fields of this data structure must begin with hw_module_t
|
||||
* followed by module specific information.
|
||||
*/
|
||||
typedef struct audio_policy_module {
|
||||
struct hw_module_t common;
|
||||
} audio_policy_module_t;
|
||||
|
||||
struct audio_policy_device {
|
||||
/**
|
||||
* Common methods of the audio policy device. This *must* be the first member of
|
||||
* audio_policy_device as users of this structure will cast a hw_device_t to
|
||||
* audio_policy_device pointer in contexts where it's known the hw_device_t references an
|
||||
* audio_policy_device.
|
||||
*/
|
||||
struct hw_device_t common;
|
||||
|
||||
int (*create_audio_policy)(const struct audio_policy_device *device,
|
||||
struct audio_policy_service_ops *aps_ops,
|
||||
void *service,
|
||||
struct audio_policy **ap);
|
||||
|
||||
int (*destroy_audio_policy)(const struct audio_policy_device *device,
|
||||
struct audio_policy *ap);
|
||||
};
|
||||
|
||||
/** convenience API for opening and closing a supported device */
|
||||
|
||||
static inline int audio_policy_dev_open(const hw_module_t* module,
|
||||
struct audio_policy_device** device)
|
||||
{
|
||||
return module->methods->open(module, AUDIO_POLICY_INTERFACE,
|
||||
(hw_device_t**)device);
|
||||
}
|
||||
|
||||
static inline int audio_policy_dev_close(struct audio_policy_device* device)
|
||||
{
|
||||
return device->common.close(&device->common);
|
||||
}
|
||||
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif // ANDROID_AUDIO_POLICY_INTERFACE_H
|
|
@ -23,10 +23,7 @@ cc_library_shared {
|
|||
relative_install_path: "hw",
|
||||
proprietary: true,
|
||||
srcs: ["audio_hw.c"],
|
||||
header_libs: [
|
||||
"libhardware_headers",
|
||||
"android.hardware.audio.common.legacy@2.0",
|
||||
],
|
||||
header_libs: ["libhardware_headers"],
|
||||
shared_libs: [
|
||||
"liblog",
|
||||
],
|
||||
|
@ -44,10 +41,21 @@ cc_library_shared {
|
|||
relative_install_path: "hw",
|
||||
proprietary: true,
|
||||
srcs: ["audio_hw.c"],
|
||||
header_libs: [
|
||||
"libhardware_headers",
|
||||
"android.hardware.audio.common.legacy@2.0",
|
||||
],
|
||||
header_libs: ["libhardware_headers"],
|
||||
shared_libs: [
|
||||
"liblog",
|
||||
],
|
||||
cflags: ["-Wall", "-Werror", "-Wno-unused-parameter"],
|
||||
}
|
||||
|
||||
// The stub audio policy HAL module that can be used as a skeleton for
|
||||
// new implementations.
|
||||
cc_library_shared {
|
||||
name: "audio_policy.stub",
|
||||
relative_install_path: "hw",
|
||||
proprietary: true,
|
||||
srcs: ["audio_policy.c"],
|
||||
header_libs: ["libhardware_headers"],
|
||||
shared_libs: [
|
||||
"liblog",
|
||||
],
|
||||
|
|
350
modules/audio/audio_policy.c
Normal file
350
modules/audio/audio_policy.c
Normal file
|
@ -0,0 +1,350 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#define LOG_TAG "audio_policy_default"
|
||||
//#define LOG_NDEBUG 0
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <hardware/hardware.h>
|
||||
#include <system/audio.h>
|
||||
#include <system/audio_policy.h>
|
||||
#include <hardware/audio_policy.h>
|
||||
|
||||
struct default_ap_module {
|
||||
struct audio_policy_module module;
|
||||
};
|
||||
|
||||
struct default_ap_device {
|
||||
struct audio_policy_device device;
|
||||
};
|
||||
|
||||
struct default_audio_policy {
|
||||
struct audio_policy policy;
|
||||
|
||||
struct audio_policy_service_ops *aps_ops;
|
||||
void *service;
|
||||
};
|
||||
|
||||
static int ap_set_device_connection_state(struct audio_policy *pol,
|
||||
audio_devices_t device,
|
||||
audio_policy_dev_state_t state,
|
||||
const char *device_address)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static audio_policy_dev_state_t ap_get_device_connection_state(
|
||||
const struct audio_policy *pol,
|
||||
audio_devices_t device,
|
||||
const char *device_address)
|
||||
{
|
||||
return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
|
||||
}
|
||||
|
||||
static void ap_set_phone_state(struct audio_policy *pol, audio_mode_t state)
|
||||
{
|
||||
}
|
||||
|
||||
// deprecated, never called
|
||||
static void ap_set_ringer_mode(struct audio_policy *pol, uint32_t mode,
|
||||
uint32_t mask)
|
||||
{
|
||||
}
|
||||
|
||||
static void ap_set_force_use(struct audio_policy *pol,
|
||||
audio_policy_force_use_t usage,
|
||||
audio_policy_forced_cfg_t config)
|
||||
{
|
||||
}
|
||||
|
||||
/* retreive current device category forced for a given usage */
|
||||
static audio_policy_forced_cfg_t ap_get_force_use(
|
||||
const struct audio_policy *pol,
|
||||
audio_policy_force_use_t usage)
|
||||
{
|
||||
return AUDIO_POLICY_FORCE_NONE;
|
||||
}
|
||||
|
||||
/* if can_mute is true, then audio streams that are marked ENFORCED_AUDIBLE
|
||||
* can still be muted. */
|
||||
static void ap_set_can_mute_enforced_audible(struct audio_policy *pol,
|
||||
bool can_mute)
|
||||
{
|
||||
}
|
||||
|
||||
static int ap_init_check(const struct audio_policy *pol)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static audio_io_handle_t ap_get_output(struct audio_policy *pol,
|
||||
audio_stream_type_t stream,
|
||||
uint32_t sampling_rate,
|
||||
audio_format_t format,
|
||||
audio_channel_mask_t channelMask,
|
||||
audio_output_flags_t flags,
|
||||
const audio_offload_info_t *info)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ap_start_output(struct audio_policy *pol, audio_io_handle_t output,
|
||||
audio_stream_type_t stream, int session)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static int ap_stop_output(struct audio_policy *pol, audio_io_handle_t output,
|
||||
audio_stream_type_t stream, int session)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static void ap_release_output(struct audio_policy *pol,
|
||||
audio_io_handle_t output)
|
||||
{
|
||||
}
|
||||
|
||||
static audio_io_handle_t ap_get_input(struct audio_policy *pol, audio_source_t inputSource,
|
||||
uint32_t sampling_rate,
|
||||
audio_format_t format,
|
||||
audio_channel_mask_t channelMask,
|
||||
audio_in_acoustics_t acoustics)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ap_start_input(struct audio_policy *pol, audio_io_handle_t input)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static int ap_stop_input(struct audio_policy *pol, audio_io_handle_t input)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static void ap_release_input(struct audio_policy *pol, audio_io_handle_t input)
|
||||
{
|
||||
}
|
||||
|
||||
static void ap_init_stream_volume(struct audio_policy *pol,
|
||||
audio_stream_type_t stream, int index_min,
|
||||
int index_max)
|
||||
{
|
||||
}
|
||||
|
||||
static int ap_set_stream_volume_index(struct audio_policy *pol,
|
||||
audio_stream_type_t stream,
|
||||
int index)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static int ap_get_stream_volume_index(const struct audio_policy *pol,
|
||||
audio_stream_type_t stream,
|
||||
int *index)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static int ap_set_stream_volume_index_for_device(struct audio_policy *pol,
|
||||
audio_stream_type_t stream,
|
||||
int index,
|
||||
audio_devices_t device)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static int ap_get_stream_volume_index_for_device(const struct audio_policy *pol,
|
||||
audio_stream_type_t stream,
|
||||
int *index,
|
||||
audio_devices_t device)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static uint32_t ap_get_strategy_for_stream(const struct audio_policy *pol,
|
||||
audio_stream_type_t stream)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static audio_devices_t ap_get_devices_for_stream(const struct audio_policy *pol,
|
||||
audio_stream_type_t stream)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static audio_io_handle_t ap_get_output_for_effect(struct audio_policy *pol,
|
||||
const struct effect_descriptor_s *desc)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ap_register_effect(struct audio_policy *pol,
|
||||
const struct effect_descriptor_s *desc,
|
||||
audio_io_handle_t output,
|
||||
uint32_t strategy,
|
||||
int session,
|
||||
int id)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static int ap_unregister_effect(struct audio_policy *pol, int id)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static int ap_set_effect_enabled(struct audio_policy *pol, int id, bool enabled)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static bool ap_is_stream_active(const struct audio_policy *pol, audio_stream_type_t stream,
|
||||
uint32_t in_past_ms)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static int ap_dump(const struct audio_policy *pol, int fd)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static bool ap_is_offload_supported(const struct audio_policy *pol,
|
||||
const audio_offload_info_t *info)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static int create_default_ap(const struct audio_policy_device *device,
|
||||
struct audio_policy_service_ops *aps_ops,
|
||||
void *service,
|
||||
struct audio_policy **ap)
|
||||
{
|
||||
struct default_audio_policy *dap;
|
||||
|
||||
*ap = NULL;
|
||||
|
||||
if (!service || !aps_ops)
|
||||
return -EINVAL;
|
||||
|
||||
dap = (struct default_audio_policy *)calloc(1, sizeof(*dap));
|
||||
if (!dap)
|
||||
return -ENOMEM;
|
||||
|
||||
dap->policy.set_device_connection_state = ap_set_device_connection_state;
|
||||
dap->policy.get_device_connection_state = ap_get_device_connection_state;
|
||||
dap->policy.set_phone_state = ap_set_phone_state;
|
||||
dap->policy.set_ringer_mode = ap_set_ringer_mode;
|
||||
dap->policy.set_force_use = ap_set_force_use;
|
||||
dap->policy.get_force_use = ap_get_force_use;
|
||||
dap->policy.set_can_mute_enforced_audible =
|
||||
ap_set_can_mute_enforced_audible;
|
||||
dap->policy.init_check = ap_init_check;
|
||||
dap->policy.get_output = ap_get_output;
|
||||
dap->policy.start_output = ap_start_output;
|
||||
dap->policy.stop_output = ap_stop_output;
|
||||
dap->policy.release_output = ap_release_output;
|
||||
dap->policy.get_input = ap_get_input;
|
||||
dap->policy.start_input = ap_start_input;
|
||||
dap->policy.stop_input = ap_stop_input;
|
||||
dap->policy.release_input = ap_release_input;
|
||||
dap->policy.init_stream_volume = ap_init_stream_volume;
|
||||
dap->policy.set_stream_volume_index = ap_set_stream_volume_index;
|
||||
dap->policy.get_stream_volume_index = ap_get_stream_volume_index;
|
||||
dap->policy.set_stream_volume_index_for_device = ap_set_stream_volume_index_for_device;
|
||||
dap->policy.get_stream_volume_index_for_device = ap_get_stream_volume_index_for_device;
|
||||
dap->policy.get_strategy_for_stream = ap_get_strategy_for_stream;
|
||||
dap->policy.get_devices_for_stream = ap_get_devices_for_stream;
|
||||
dap->policy.get_output_for_effect = ap_get_output_for_effect;
|
||||
dap->policy.register_effect = ap_register_effect;
|
||||
dap->policy.unregister_effect = ap_unregister_effect;
|
||||
dap->policy.set_effect_enabled = ap_set_effect_enabled;
|
||||
dap->policy.is_stream_active = ap_is_stream_active;
|
||||
dap->policy.dump = ap_dump;
|
||||
|
||||
dap->policy.is_offload_supported = ap_is_offload_supported;
|
||||
|
||||
dap->service = service;
|
||||
dap->aps_ops = aps_ops;
|
||||
|
||||
*ap = &dap->policy;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int destroy_default_ap(const struct audio_policy_device *ap_dev,
|
||||
struct audio_policy *ap)
|
||||
{
|
||||
free(ap);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int default_ap_dev_close(hw_device_t* device)
|
||||
{
|
||||
free(device);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int default_ap_dev_open(const hw_module_t* module, const char* name,
|
||||
hw_device_t** device)
|
||||
{
|
||||
struct default_ap_device *dev;
|
||||
|
||||
*device = NULL;
|
||||
|
||||
if (strcmp(name, AUDIO_POLICY_INTERFACE) != 0)
|
||||
return -EINVAL;
|
||||
|
||||
dev = (struct default_ap_device *)calloc(1, sizeof(*dev));
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
dev->device.common.tag = HARDWARE_DEVICE_TAG;
|
||||
dev->device.common.version = 0;
|
||||
dev->device.common.module = (hw_module_t *)module;
|
||||
dev->device.common.close = default_ap_dev_close;
|
||||
dev->device.create_audio_policy = create_default_ap;
|
||||
dev->device.destroy_audio_policy = destroy_default_ap;
|
||||
|
||||
*device = &dev->device.common;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct hw_module_methods_t default_ap_module_methods = {
|
||||
.open = default_ap_dev_open,
|
||||
};
|
||||
|
||||
struct default_ap_module HAL_MODULE_INFO_SYM = {
|
||||
.module = {
|
||||
.common = {
|
||||
.tag = HARDWARE_MODULE_TAG,
|
||||
.version_major = 1,
|
||||
.version_minor = 0,
|
||||
.id = AUDIO_POLICY_HARDWARE_MODULE_ID,
|
||||
.name = "Default audio policy HAL",
|
||||
.author = "The Android Open Source Project",
|
||||
.methods = &default_ap_module_methods,
|
||||
},
|
||||
},
|
||||
};
|
|
@ -17,15 +17,16 @@ cc_library_shared {
|
|||
relative_install_path: "hw",
|
||||
vendor: true,
|
||||
srcs: ["audio_hw.cpp"],
|
||||
|
||||
include_dirs: [
|
||||
"system/media/audio_utils/include",
|
||||
],
|
||||
shared_libs: [
|
||||
"liblog",
|
||||
"libcutils",
|
||||
"libutils",
|
||||
"libnbaio_mono@2.0",
|
||||
"libaudioutils",
|
||||
"libnbaio_mono",
|
||||
],
|
||||
static_libs: ["libmedia_helper@2.0"],
|
||||
static_libs: ["libmedia_helper"],
|
||||
|
||||
cflags: ["-Wno-unused-parameter"],
|
||||
|
||||
|
|
|
@ -25,7 +25,5 @@ cc_library_shared {
|
|||
"libalsautils",
|
||||
],
|
||||
cflags: ["-Wno-unused-parameter"],
|
||||
header_libs: [
|
||||
"android.hardware.audio.common.legacy@2.0",
|
||||
],
|
||||
header_libs: ["libhardware_headers"],
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue