audio.h revision 73b8a7414afa5ee3f006468f287695d9c2054d76
1f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/* 2f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Copyright (C) 2011 The Android Open Source Project 3f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * 4f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Licensed under the Apache License, Version 2.0 (the "License"); 5f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * you may not use this file except in compliance with the License. 6f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * You may obtain a copy of the License at 7f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * 8f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * http://www.apache.org/licenses/LICENSE-2.0 9f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * 10f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Unless required by applicable law or agreed to in writing, software 11f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * distributed under the License is distributed on an "AS IS" BASIS, 12f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * See the License for the specific language governing permissions and 14f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * limitations under the License. 15f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 16f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 17f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 18f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#ifndef ANDROID_AUDIO_HAL_INTERFACE_H 19f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#define ANDROID_AUDIO_HAL_INTERFACE_H 20f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 21f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#include <stdint.h> 22f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#include <strings.h> 23f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#include <sys/cdefs.h> 24f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#include <sys/types.h> 25f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 26f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#include <cutils/bitops.h> 27f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 28f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#include <hardware/hardware.h> 29aa21172bcd4c332eec78d34ffdafd8cc0178ea95Dima Zavin#include <system/audio.h> 30f3008aa707c1c302e8c8f9c8b759f170d972ddceEric Laurent#include <hardware/audio_effect.h> 31f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 32f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin__BEGIN_DECLS 33f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 34f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/** 35f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * The id of this module 36f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 37f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#define AUDIO_HARDWARE_MODULE_ID "audio" 38f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 39f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/** 40f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Name of the audio devices to open 41f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 42f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#define AUDIO_HARDWARE_INTERFACE "audio_hw_if" 43f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 4455786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent 4555786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent/* Use version 0.1 to be compatible with first generation of audio hw module with version_major 4655786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent * hardcoded to 1. No audio module API change. 4755786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent */ 4855786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent#define AUDIO_MODULE_API_VERSION_0_1 HARDWARE_MODULE_API_VERSION(0, 1) 4955786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent#define AUDIO_MODULE_API_VERSION_CURRENT AUDIO_MODULE_API_VERSION_0_1 5055786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent 5155786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent/* First generation of audio devices had version hardcoded to 0. all devices with versions < 1.0 5255786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent * will be considered of first generation API. 5355786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent */ 5455786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent#define AUDIO_DEVICE_API_VERSION_0_0 HARDWARE_DEVICE_API_VERSION(0, 0) 5555786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent#define AUDIO_DEVICE_API_VERSION_1_0 HARDWARE_DEVICE_API_VERSION(1, 0) 5685e08e26258711f2fd672d9a920d88bf91410f6bEric Laurent#define AUDIO_DEVICE_API_VERSION_2_0 HARDWARE_DEVICE_API_VERSION(2, 0) 5773b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent#define AUDIO_DEVICE_API_VERSION_3_0 HARDWARE_DEVICE_API_VERSION(3, 0) 5873b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent#define AUDIO_DEVICE_API_VERSION_CURRENT AUDIO_DEVICE_API_VERSION_3_0 59447cae749c7bb4906bc21c645df5eb7e6d664027Eric Laurent/* Minimal audio HAL version supported by the audio framework */ 60447cae749c7bb4906bc21c645df5eb7e6d664027Eric Laurent#define AUDIO_DEVICE_API_VERSION_MIN AUDIO_DEVICE_API_VERSION_2_0 6155786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent 62431fc78c112646f43d6d6f51b06d45d248d2f317Eric Laurent/** 63431fc78c112646f43d6d6f51b06d45d248d2f317Eric Laurent * List of known audio HAL modules. This is the base name of the audio HAL 64431fc78c112646f43d6d6f51b06d45d248d2f317Eric Laurent * library composed of the "audio." prefix, one of the base names below and 65431fc78c112646f43d6d6f51b06d45d248d2f317Eric Laurent * a suffix specific to the device. 66431fc78c112646f43d6d6f51b06d45d248d2f317Eric Laurent * e.g: audio.primary.goldfish.so or audio.a2dp.default.so 67431fc78c112646f43d6d6f51b06d45d248d2f317Eric Laurent */ 68431fc78c112646f43d6d6f51b06d45d248d2f317Eric Laurent 69431fc78c112646f43d6d6f51b06d45d248d2f317Eric Laurent#define AUDIO_HARDWARE_MODULE_ID_PRIMARY "primary" 70431fc78c112646f43d6d6f51b06d45d248d2f317Eric Laurent#define AUDIO_HARDWARE_MODULE_ID_A2DP "a2dp" 71431fc78c112646f43d6d6f51b06d45d248d2f317Eric Laurent#define AUDIO_HARDWARE_MODULE_ID_USB "usb" 7288b79cb001d1c733275c7cad490c32b143f78860Jean-Michel Trivi#define AUDIO_HARDWARE_MODULE_ID_REMOTE_SUBMIX "r_submix" 73f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald#define AUDIO_HARDWARE_MODULE_ID_CODEC_OFFLOAD "codec_offload" 74431fc78c112646f43d6d6f51b06d45d248d2f317Eric Laurent 75f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/**************************************/ 76f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 7770e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent/** 7870e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent * standard audio parameters that the HAL may need to handle 7970e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent */ 8070e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent 8170e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent/** 8270e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent * audio device parameters 8370e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent */ 8470e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent 85ed9928c76d107d02452a25a0d62803197c47f673Eric Laurent/* BT SCO Noise Reduction + Echo Cancellation parameters */ 86ed9928c76d107d02452a25a0d62803197c47f673Eric Laurent#define AUDIO_PARAMETER_KEY_BT_NREC "bt_headset_nrec" 87ed9928c76d107d02452a25a0d62803197c47f673Eric Laurent#define AUDIO_PARAMETER_VALUE_ON "on" 88ed9928c76d107d02452a25a0d62803197c47f673Eric Laurent#define AUDIO_PARAMETER_VALUE_OFF "off" 89ed9928c76d107d02452a25a0d62803197c47f673Eric Laurent 9070e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent/* TTY mode selection */ 9170e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent#define AUDIO_PARAMETER_KEY_TTY_MODE "tty_mode" 9270e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent#define AUDIO_PARAMETER_VALUE_TTY_OFF "tty_off" 9370e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent#define AUDIO_PARAMETER_VALUE_TTY_VCO "tty_vco" 9470e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent#define AUDIO_PARAMETER_VALUE_TTY_HCO "tty_hco" 9570e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent#define AUDIO_PARAMETER_VALUE_TTY_FULL "tty_full" 9670e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent 97a70c5d0cafe1ef9e4531627d3d009e80b9a8eec4Eric Laurent/* A2DP sink address set by framework */ 98a70c5d0cafe1ef9e4531627d3d009e80b9a8eec4Eric Laurent#define AUDIO_PARAMETER_A2DP_SINK_ADDRESS "a2dp_sink_address" 99a70c5d0cafe1ef9e4531627d3d009e80b9a8eec4Eric Laurent 10034afb68c0cd1de315f0250f6a95b9dba234133aeGlenn Kasten/* Screen state */ 10134afb68c0cd1de315f0250f6a95b9dba234133aeGlenn Kasten#define AUDIO_PARAMETER_KEY_SCREEN_STATE "screen_state" 10234afb68c0cd1de315f0250f6a95b9dba234133aeGlenn Kasten 103d930d92c9730b13ba14e46aff588d6b7252e68c9Glenn Kasten/* Bluetooth SCO wideband */ 104d930d92c9730b13ba14e46aff588d6b7252e68c9Glenn Kasten#define AUDIO_PARAMETER_KEY_BT_SCO_WB "bt_wbs" 105d930d92c9730b13ba14e46aff588d6b7252e68c9Glenn Kasten 10670e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent/** 10770e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent * audio stream parameters 10870e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent */ 10970e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent 1100cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten#define AUDIO_PARAMETER_STREAM_ROUTING "routing" // audio_devices_t 1110cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten#define AUDIO_PARAMETER_STREAM_FORMAT "format" // audio_format_t 1120cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten#define AUDIO_PARAMETER_STREAM_CHANNELS "channels" // audio_channel_mask_t 1130cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten#define AUDIO_PARAMETER_STREAM_FRAME_COUNT "frame_count" // size_t 1140cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten#define AUDIO_PARAMETER_STREAM_INPUT_SOURCE "input_source" // audio_source_t 1150cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten#define AUDIO_PARAMETER_STREAM_SAMPLING_RATE "sampling_rate" // uint32_t 11657dde28fb80e1a166db283296812f5fb078ca24aDima Zavin 11741eeb4fe9f0a043dc207111893dbea26827217a6Eric Laurent/* Query supported formats. The response is a '|' separated list of strings from 11841eeb4fe9f0a043dc207111893dbea26827217a6Eric Laurent * audio_format_t enum e.g: "sup_formats=AUDIO_FORMAT_PCM_16_BIT" */ 11941eeb4fe9f0a043dc207111893dbea26827217a6Eric Laurent#define AUDIO_PARAMETER_STREAM_SUP_FORMATS "sup_formats" 12041eeb4fe9f0a043dc207111893dbea26827217a6Eric Laurent/* Query supported channel masks. The response is a '|' separated list of strings from 12141eeb4fe9f0a043dc207111893dbea26827217a6Eric Laurent * audio_channel_mask_t enum e.g: "sup_channels=AUDIO_CHANNEL_OUT_STEREO|AUDIO_CHANNEL_OUT_MONO" */ 12241eeb4fe9f0a043dc207111893dbea26827217a6Eric Laurent#define AUDIO_PARAMETER_STREAM_SUP_CHANNELS "sup_channels" 12341eeb4fe9f0a043dc207111893dbea26827217a6Eric Laurent/* Query supported sampling rates. The response is a '|' separated list of integer values e.g: 12441eeb4fe9f0a043dc207111893dbea26827217a6Eric Laurent * "sup_sampling_rates=44100|48000" */ 12541eeb4fe9f0a043dc207111893dbea26827217a6Eric Laurent#define AUDIO_PARAMETER_STREAM_SUP_SAMPLING_RATES "sup_sampling_rates" 12641eeb4fe9f0a043dc207111893dbea26827217a6Eric Laurent 127f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald/** 128f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * audio codec parameters 129f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald */ 130f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald 131f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald#define AUDIO_OFFLOAD_CODEC_PARAMS "music_offload_codec_param" 132f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald#define AUDIO_OFFLOAD_CODEC_BIT_PER_SAMPLE "music_offload_bit_per_sample" 133f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald#define AUDIO_OFFLOAD_CODEC_BIT_RATE "music_offload_bit_rate" 134f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald#define AUDIO_OFFLOAD_CODEC_AVG_BIT_RATE "music_offload_avg_bit_rate" 135f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald#define AUDIO_OFFLOAD_CODEC_ID "music_offload_codec_id" 136f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald#define AUDIO_OFFLOAD_CODEC_BLOCK_ALIGN "music_offload_block_align" 137f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald#define AUDIO_OFFLOAD_CODEC_SAMPLE_RATE "music_offload_sample_rate" 138f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald#define AUDIO_OFFLOAD_CODEC_ENCODE_OPTION "music_offload_encode_option" 139f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald#define AUDIO_OFFLOAD_CODEC_NUM_CHANNEL "music_offload_num_channels" 140f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald#define AUDIO_OFFLOAD_CODEC_DOWN_SAMPLING "music_offload_down_sampling" 141f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald#define AUDIO_OFFLOAD_CODEC_DELAY_SAMPLES "delay_samples" 142f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald#define AUDIO_OFFLOAD_CODEC_PADDING_SAMPLES "padding_samples" 14355786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent 14470e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent/**************************************/ 14570e8110fcf2c35d1ac67f0eb4a2702014a16719bEric Laurent 146f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald/* common audio stream configuration parameters 147f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * You should memset() the entire structure to zero before use to 148f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * ensure forward compatibility 149f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald */ 15055786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurentstruct audio_config { 15155786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent uint32_t sample_rate; 15255786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent audio_channel_mask_t channel_mask; 15355786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent audio_format_t format; 154f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald audio_offload_info_t offload_info; 15555786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent}; 15655786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurenttypedef struct audio_config audio_config_t; 15755786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent 158f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/* common audio stream parameters and operations */ 159f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavinstruct audio_stream { 160f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 161f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** 1620cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * Return the sampling rate in Hz - eg. 44100. 163f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 164f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin uint32_t (*get_sample_rate)(const struct audio_stream *stream); 16557dde28fb80e1a166db283296812f5fb078ca24aDima Zavin 16657dde28fb80e1a166db283296812f5fb078ca24aDima Zavin /* currently unused - use set_parameters with key 16757dde28fb80e1a166db283296812f5fb078ca24aDima Zavin * AUDIO_PARAMETER_STREAM_SAMPLING_RATE 16857dde28fb80e1a166db283296812f5fb078ca24aDima Zavin */ 169f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*set_sample_rate)(struct audio_stream *stream, uint32_t rate); 170f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 171f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** 1720cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * Return size of input/output buffer in bytes for this stream - eg. 4800. 1730cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * It should be a multiple of the frame size. See also get_input_buffer_size. 174f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 175f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin size_t (*get_buffer_size)(const struct audio_stream *stream); 176f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 177f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** 1780cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * Return the channel mask - 179f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * e.g. AUDIO_CHANNEL_OUT_STEREO or AUDIO_CHANNEL_IN_STEREO 180f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 18155786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent audio_channel_mask_t (*get_channels)(const struct audio_stream *stream); 182f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 183f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** 1840cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * Return the audio format - e.g. AUDIO_FORMAT_PCM_16_BIT 185f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 186fe79eb3f06967f863a637e546eb4421d0da2283bGlenn Kasten audio_format_t (*get_format)(const struct audio_stream *stream); 18757dde28fb80e1a166db283296812f5fb078ca24aDima Zavin 18857dde28fb80e1a166db283296812f5fb078ca24aDima Zavin /* currently unused - use set_parameters with key 18957dde28fb80e1a166db283296812f5fb078ca24aDima Zavin * AUDIO_PARAMETER_STREAM_FORMAT 19057dde28fb80e1a166db283296812f5fb078ca24aDima Zavin */ 191fe79eb3f06967f863a637e546eb4421d0da2283bGlenn Kasten int (*set_format)(struct audio_stream *stream, audio_format_t format); 192f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 193f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** 194f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Put the audio hardware input/output into standby mode. 1950cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * Driver should exit from standby mode at the next I/O operation. 196f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Returns 0 on success and <0 on failure. 197f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 198f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*standby)(struct audio_stream *stream); 199f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 200f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** dump the state of the audio input/output device */ 201f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*dump)(const struct audio_stream *stream, int fd); 202f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 2030cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten /** Return the set of device(s) which this stream is connected to */ 204f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin audio_devices_t (*get_device)(const struct audio_stream *stream); 2050cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten 2060cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten /** 2070cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * Currently unused - set_device() corresponds to set_parameters() with key 2080cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * AUDIO_PARAMETER_STREAM_ROUTING for both input and output. 2090cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * AUDIO_PARAMETER_STREAM_INPUT_SOURCE is an additional information used by 2100cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * input streams only. 2110cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten */ 212f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*set_device)(struct audio_stream *stream, audio_devices_t device); 213f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 214f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** 215f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * set/get audio stream parameters. The function accepts a list of 216f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * parameter key value pairs in the form: key1=value1;key2=value2;... 217f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * 218f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Some keys are reserved for standard parameters (See AudioParameter class) 219f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * 220f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * If the implementation does not accept a parameter change while 221f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * the output is active but the parameter is acceptable otherwise, it must 222f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * return -ENOSYS. 223f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * 224f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * The audio flinger will put the stream in standby and then change the 225f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * parameter value. 226f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 227f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*set_parameters)(struct audio_stream *stream, const char *kv_pairs); 228f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 229f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /* 230f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Returns a pointer to a heap allocated string. The caller is responsible 2310cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * for freeing the memory for it using free(). 232f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 233f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin char * (*get_parameters)(const struct audio_stream *stream, 234f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin const char *keys); 235f3008aa707c1c302e8c8f9c8b759f170d972ddceEric Laurent int (*add_audio_effect)(const struct audio_stream *stream, 236f3008aa707c1c302e8c8f9c8b759f170d972ddceEric Laurent effect_handle_t effect); 237f3008aa707c1c302e8c8f9c8b759f170d972ddceEric Laurent int (*remove_audio_effect)(const struct audio_stream *stream, 238f3008aa707c1c302e8c8f9c8b759f170d972ddceEric Laurent effect_handle_t effect); 239f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin}; 240f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavintypedef struct audio_stream audio_stream_t; 241f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 242f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald/* type of asynchronous write callback events. Mutually exclusive */ 243f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgeraldtypedef enum { 244f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald STREAM_CBK_EVENT_WRITE_READY, /* non blocking write completed */ 245f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald STREAM_CBK_EVENT_DRAIN_READY /* drain completed */ 246f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald} stream_callback_event_t; 247f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald 248f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgeraldtypedef int (*stream_callback_t)(stream_callback_event_t event, void *param, void *cookie); 249f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald 250f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald/* type of drain requested to audio_stream_out->drain(). Mutually exclusive */ 251f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgeraldtypedef enum { 252f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald AUDIO_DRAIN_ALL, /* drain() returns when all data has been played */ 253f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald AUDIO_DRAIN_EARLY_NOTIFY /* drain() returns a short time before all data 254f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald from the current track has been played to 255f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald give time for gapless track switch */ 256f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald} audio_drain_type_t; 257f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald 258f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/** 259f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * audio_stream_out is the abstraction interface for the audio output hardware. 260f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * 261f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * It provides information about various properties of the audio output 262f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * hardware driver. 263f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 264f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 265f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavinstruct audio_stream_out { 26684d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles /** 26784d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles * Common methods of the audio stream out. This *must* be the first member of audio_stream_out 26884d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles * as users of this structure will cast a audio_stream to audio_stream_out pointer in contexts 26984d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles * where it's known the audio_stream references an audio_stream_out. 27084d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles */ 271f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin struct audio_stream common; 272f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 273f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** 2740cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * Return the audio hardware driver estimated latency in milliseconds. 275f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 276f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin uint32_t (*get_latency)(const struct audio_stream_out *stream); 277f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 278f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** 279f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Use this method in situations where audio mixing is done in the 280f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * hardware. This method serves as a direct interface with hardware, 281f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * allowing you to directly set the volume as apposed to via the framework. 282f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * This method might produce multiple PCM outputs or hardware accelerated 283f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * codecs, such as MP3 or AAC. 284f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 285f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*set_volume)(struct audio_stream_out *stream, float left, float right); 286f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 287f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** 2880cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * Write audio buffer to driver. Returns number of bytes written, or a 2890cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * negative status_t. If at least one frame was written successfully prior to the error, 2900cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * it is suggested that the driver return that successful (short) byte count 2910cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * and then return an error in the subsequent call. 292f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * 293f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * If set_callback() has previously been called to enable non-blocking mode 294f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * the write() is not allowed to block. It must write only the number of 295f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * bytes that currently fit in the driver/hardware buffer and then return 296f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * this byte count. If this is less than the requested write size the 297f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * callback function must be called when more space is available in the 298f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * driver/hardware buffer. 299f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 300f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin ssize_t (*write)(struct audio_stream_out *stream, const void* buffer, 301f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin size_t bytes); 302f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 303f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /* return the number of audio frames written by the audio dsp to DAC since 304f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * the output has exited standby 305f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 306f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*get_render_position)(const struct audio_stream_out *stream, 307f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin uint32_t *dsp_frames); 3085ad38a901dcca2961f3ed35ae0b206c13bc515cdMike J. Chen 3095ad38a901dcca2961f3ed35ae0b206c13bc515cdMike J. Chen /** 3100cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * get the local time at which the next write to the audio driver will be presented. 3110cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * The units are microseconds, where the epoch is decided by the local audio HAL. 3125ad38a901dcca2961f3ed35ae0b206c13bc515cdMike J. Chen */ 3135ad38a901dcca2961f3ed35ae0b206c13bc515cdMike J. Chen int (*get_next_write_timestamp)(const struct audio_stream_out *stream, 3145ad38a901dcca2961f3ed35ae0b206c13bc515cdMike J. Chen int64_t *timestamp); 3155ad38a901dcca2961f3ed35ae0b206c13bc515cdMike J. Chen 316f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald /** 317f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * set the callback function for notifying completion of non-blocking 318f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * write and drain. 319f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * Calling this function implies that all future write() and drain() 320f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * must be non-blocking and use the callback to signal completion. 321f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald */ 322f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald int (*set_callback)(struct audio_stream_out *stream, 323f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald stream_callback_t callback, void *cookie); 324f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald 325f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald /** 326f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * Notifies to the audio driver to stop playback however the queued buffers are 327f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * retained by the hardware. Useful for implementing pause/resume. Empty implementation 328f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * if not supported however should be implemented for hardware with non-trivial 329f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * latency. In the pause state audio hardware could still be using power. User may 330f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * consider calling suspend after a timeout. 331f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * 332f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * Implementation of this function is mandatory for offloaded playback. 333f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald */ 334f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald int (*pause)(struct audio_stream_out* stream); 335f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald 336f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald /** 337f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * Notifies to the audio driver to resume playback following a pause. 338f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * Returns error if called without matching pause. 339f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * 340f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * Implementation of this function is mandatory for offloaded playback. 341f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald */ 342f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald int (*resume)(struct audio_stream_out* stream); 343f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald 344f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald /** 345f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * Requests notification when data buffered by the driver/hardware has 346f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * been played. If set_callback() has previously been called to enable 347f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * non-blocking mode, the drain() must not block, instead it should return 348f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * quickly and completion of the drain is notified through the callback. 349f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * If set_callback() has not been called, the drain() must block until 350f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * completion. 351f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * If type==AUDIO_DRAIN_ALL, the drain completes when all previously written 352f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * data has been played. 353f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * If type==AUDIO_DRAIN_EARLY_NOTIFY, the drain completes shortly before all 354f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * data for the current track has played to allow time for the framework 355f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * to perform a gapless track switch. 356f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * 357f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * Drain must return immediately on stop() and flush() call 358f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * 359f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * Implementation of this function is mandatory for offloaded playback. 360f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald */ 361f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald int (*drain)(struct audio_stream_out* stream, audio_drain_type_t type ); 362f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald 363f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald /** 364f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * Notifies to the audio driver to flush the queued data. Stream must already 365f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * be paused before calling flush(). 366f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * 367f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald * Implementation of this function is mandatory for offloaded playback. 368f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald */ 369f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald int (*flush)(struct audio_stream_out* stream); 370e25f9ed3469859ba0b94585549097b8b82dca8b4Glenn Kasten 371e25f9ed3469859ba0b94585549097b8b82dca8b4Glenn Kasten /** 37222a06b752f7c350f8d8eaec029c9df69d708126fGlenn Kasten * Return a recent count of the number of audio frames presented to an external observer. 373e25f9ed3469859ba0b94585549097b8b82dca8b4Glenn Kasten * This excludes frames which have been written but are still in the pipeline. 374e25f9ed3469859ba0b94585549097b8b82dca8b4Glenn Kasten * The count is not reset to zero when output enters standby. 375e25f9ed3469859ba0b94585549097b8b82dca8b4Glenn Kasten * Also returns the value of CLOCK_MONOTONIC as of this presentation count. 37622a06b752f7c350f8d8eaec029c9df69d708126fGlenn Kasten * The returned count is expected to be 'recent', 37722a06b752f7c350f8d8eaec029c9df69d708126fGlenn Kasten * but does not need to be the most recent possible value. 37822a06b752f7c350f8d8eaec029c9df69d708126fGlenn Kasten * However, the associated time should correspond to whatever count is returned. 37922a06b752f7c350f8d8eaec029c9df69d708126fGlenn Kasten * Example: assume that N+M frames have been presented, where M is a 'small' number. 38022a06b752f7c350f8d8eaec029c9df69d708126fGlenn Kasten * Then it is permissible to return N instead of N+M, 38122a06b752f7c350f8d8eaec029c9df69d708126fGlenn Kasten * and the timestamp should correspond to N rather than N+M. 38222a06b752f7c350f8d8eaec029c9df69d708126fGlenn Kasten * The terms 'recent' and 'small' are not defined. 38322a06b752f7c350f8d8eaec029c9df69d708126fGlenn Kasten * They reflect the quality of the implementation. 384e25f9ed3469859ba0b94585549097b8b82dca8b4Glenn Kasten * 385e25f9ed3469859ba0b94585549097b8b82dca8b4Glenn Kasten * 3.0 and higher only. 386e25f9ed3469859ba0b94585549097b8b82dca8b4Glenn Kasten */ 387e25f9ed3469859ba0b94585549097b8b82dca8b4Glenn Kasten int (*get_presentation_position)(const struct audio_stream_out *stream, 388e25f9ed3469859ba0b94585549097b8b82dca8b4Glenn Kasten uint64_t *frames, struct timespec *timestamp); 389e25f9ed3469859ba0b94585549097b8b82dca8b4Glenn Kasten 390f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin}; 391f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavintypedef struct audio_stream_out audio_stream_out_t; 392f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 393f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavinstruct audio_stream_in { 39484d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles /** 39584d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles * Common methods of the audio stream in. This *must* be the first member of audio_stream_in 39684d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles * as users of this structure will cast a audio_stream to audio_stream_in pointer in contexts 39784d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles * where it's known the audio_stream references an audio_stream_in. 39884d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles */ 399f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin struct audio_stream common; 400f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 401f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** set the input gain for the audio driver. This method is for 402f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * for future use */ 403f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*set_gain)(struct audio_stream_in *stream, float gain); 404f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 4050cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten /** Read audio buffer in from audio driver. Returns number of bytes read, or a 4060cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * negative status_t. If at least one frame was read prior to the error, 4070cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * read should return that byte count and then return an error in the subsequent call. 4080cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten */ 409f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin ssize_t (*read)(struct audio_stream_in *stream, void* buffer, 410f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin size_t bytes); 411f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 412f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** 413f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Return the amount of input frames lost in the audio driver since the 414f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * last call of this function. 415f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Audio driver is expected to reset the value to 0 and restart counting 416f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * upon returning the current value by this function call. 417f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Such loss typically occurs when the user space process is blocked 418f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * longer than the capacity of audio driver buffers. 419f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * 420f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Unit: the number of input audio frames 421f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 422f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin uint32_t (*get_input_frames_lost)(struct audio_stream_in *stream); 423f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin}; 424f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavintypedef struct audio_stream_in audio_stream_in_t; 425f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 426f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/** 427f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * return the frame size (number of bytes per sample). 428f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 42948915acb392773c1fcb86e2711eab468410a0baaGlenn Kastenstatic inline size_t audio_stream_frame_size(const struct audio_stream *s) 430f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin{ 431a26cbac8a0f71ba59a89e250caaa1155f0179751Glenn Kasten size_t chan_samp_sz; 432f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald audio_format_t format = s->get_format(s); 433f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 434f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald if (audio_is_linear_pcm(format)) { 435f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald chan_samp_sz = audio_bytes_per_sample(format); 436f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald return popcount(s->get_channels(s)) * chan_samp_sz; 437f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin } 438f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 439f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald return sizeof(int8_t); 440f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin} 441f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 442f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 443f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/**********************************************************************/ 444f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 445f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/** 446f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM 447f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * and the fields of this data structure must begin with hw_module_t 448f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * followed by module specific information. 449f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 450f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavinstruct audio_module { 451f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin struct hw_module_t common; 452f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin}; 453f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 454f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavinstruct audio_hw_device { 45584d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles /** 45684d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles * Common methods of the audio device. This *must* be the first member of audio_hw_device 45784d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles * as users of this structure will cast a hw_device_t to audio_hw_device pointer in contexts 45884d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles * where it's known the hw_device_t references an audio_hw_device. 45984d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles */ 460f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin struct hw_device_t common; 461f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 462f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** 463f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * used by audio flinger to enumerate what devices are supported by 464f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * each audio_hw_device implementation. 465f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * 466f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Return value is a bitmask of 1 or more values of audio_devices_t 46785e08e26258711f2fd672d9a920d88bf91410f6bEric Laurent * 46885e08e26258711f2fd672d9a920d88bf91410f6bEric Laurent * NOTE: audio HAL implementations starting with 46985e08e26258711f2fd672d9a920d88bf91410f6bEric Laurent * AUDIO_DEVICE_API_VERSION_2_0 do not implement this function. 47085e08e26258711f2fd672d9a920d88bf91410f6bEric Laurent * All supported devices should be listed in audio_policy.conf 47185e08e26258711f2fd672d9a920d88bf91410f6bEric Laurent * file and the audio policy manager must choose the appropriate 47285e08e26258711f2fd672d9a920d88bf91410f6bEric Laurent * audio module based on information in this file. 473f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 474f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin uint32_t (*get_supported_devices)(const struct audio_hw_device *dev); 475f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 476f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** 477f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * check to see if the audio hardware interface has been initialized. 478f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * returns 0 on success, -ENODEV on failure. 479f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 480f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*init_check)(const struct audio_hw_device *dev); 481f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 482f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** set the audio volume of a voice call. Range is between 0.0 and 1.0 */ 483f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*set_voice_volume)(struct audio_hw_device *dev, float volume); 484f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 485f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** 486f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * set the audio volume for all audio activities other than voice call. 487f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Range between 0.0 and 1.0. If any value other than 0 is returned, 488f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * the software mixer will emulate this capability. 489f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 490f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*set_master_volume)(struct audio_hw_device *dev, float volume); 491f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 492f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** 4935ad38a901dcca2961f3ed35ae0b206c13bc515cdMike J. Chen * Get the current master volume value for the HAL, if the HAL supports 4945ad38a901dcca2961f3ed35ae0b206c13bc515cdMike J. Chen * master volume control. AudioFlinger will query this value from the 4955ad38a901dcca2961f3ed35ae0b206c13bc515cdMike J. Chen * primary audio HAL when the service starts and use the value for setting 4965ad38a901dcca2961f3ed35ae0b206c13bc515cdMike J. Chen * the initial master volume across all HALs. HALs which do not support 49747bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman * this method may leave it set to NULL. 4985ad38a901dcca2961f3ed35ae0b206c13bc515cdMike J. Chen */ 4995ad38a901dcca2961f3ed35ae0b206c13bc515cdMike J. Chen int (*get_master_volume)(struct audio_hw_device *dev, float *volume); 5005ad38a901dcca2961f3ed35ae0b206c13bc515cdMike J. Chen 5015ad38a901dcca2961f3ed35ae0b206c13bc515cdMike J. Chen /** 5026df641e269639dbb81bb1c19f47d3b9e5e3ff7d7Glenn Kasten * set_mode is called when the audio mode changes. AUDIO_MODE_NORMAL mode 503f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * is for standard audio playback, AUDIO_MODE_RINGTONE when a ringtone is 504f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * playing, and AUDIO_MODE_IN_CALL when a call is in progress. 505f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 5066df641e269639dbb81bb1c19f47d3b9e5e3ff7d7Glenn Kasten int (*set_mode)(struct audio_hw_device *dev, audio_mode_t mode); 507f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 508f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /* mic mute */ 509f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*set_mic_mute)(struct audio_hw_device *dev, bool state); 510f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*get_mic_mute)(const struct audio_hw_device *dev, bool *state); 511f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 512f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /* set/get global audio parameters */ 513f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*set_parameters)(struct audio_hw_device *dev, const char *kv_pairs); 514f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 515f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /* 516f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Returns a pointer to a heap allocated string. The caller is responsible 5170cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * for freeing the memory for it using free(). 518f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 519f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin char * (*get_parameters)(const struct audio_hw_device *dev, 520f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin const char *keys); 521f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 522f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /* Returns audio input buffer size according to parameters passed or 5230cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * 0 if one of the parameters is not supported. 5240cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten * See also get_buffer_size which is for a particular stream. 525f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */ 526f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin size_t (*get_input_buffer_size)(const struct audio_hw_device *dev, 52755786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent const struct audio_config *config); 528f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 529f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** This method creates and opens the audio hardware output stream */ 53055786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent int (*open_output_stream)(struct audio_hw_device *dev, 53155786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent audio_io_handle_t handle, 53255786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent audio_devices_t devices, 53355786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent audio_output_flags_t flags, 53455786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent struct audio_config *config, 53555786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent struct audio_stream_out **stream_out); 536f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 537f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin void (*close_output_stream)(struct audio_hw_device *dev, 53855786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent struct audio_stream_out* stream_out); 539f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 540f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** This method creates and opens the audio hardware input stream */ 54155786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent int (*open_input_stream)(struct audio_hw_device *dev, 54255786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent audio_io_handle_t handle, 54355786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent audio_devices_t devices, 54455786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent struct audio_config *config, 545f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin struct audio_stream_in **stream_in); 546f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 547f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin void (*close_input_stream)(struct audio_hw_device *dev, 54855786bcf3ced97dea8fa7ce79df2889d4d06e8a7Eric Laurent struct audio_stream_in *stream_in); 549f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 550f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin /** This method dumps the state of the audio hardware */ 551f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin int (*dump)(const struct audio_hw_device *dev, int fd); 55247bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman 55347bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman /** 55447bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman * set the audio mute status for all audio activities. If any value other 55547bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman * than 0 is returned, the software mixer will emulate this capability. 55647bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman */ 55747bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman int (*set_master_mute)(struct audio_hw_device *dev, bool mute); 55847bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman 55947bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman /** 56047bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman * Get the current master mute status for the HAL, if the HAL supports 56147bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman * master mute control. AudioFlinger will query this value from the primary 56247bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman * audio HAL when the service starts and use the value for setting the 56347bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman * initial master mute across all HALs. HALs which do not support this 56447bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman * method may leave it set to NULL. 56547bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman */ 56647bf3d7ea5f6c98e615e0a1f93497d241c79cc05John Grossman int (*get_master_mute)(struct audio_hw_device *dev, bool *mute); 56773b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent 56873b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent /** 56973b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent * Routing control 57073b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent */ 57173b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent 57273b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent /* Creates an audio patch between several source and sink ports. 57373b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent * The handle is allocated by the HAL and should be unique for this 57473b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent * audio HAL module. */ 57573b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent int (*create_audio_patch)(struct audio_hw_device *dev, 57673b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent unsigned int num_sources, 57773b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent const struct audio_port_config *sources, 57873b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent unsigned int num_sinks, 57973b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent const struct audio_port_config *sinks, 58073b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent audio_patch_handle_t *handle); 58173b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent 58273b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent /* Release an audio patch */ 58373b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent int (*release_audio_patch)(struct audio_hw_device *dev, 58473b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent audio_patch_handle_t handle); 58573b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent 58673b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent /* Fills the list of supported attributes for a given audio port. 58773b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent * As input, "port" contains the information (type, role, address etc...) 58873b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent * needed by the HAL to identify the port. 58973b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent * As output, "port" contains possible attributes (sampling rates, formats, 59073b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent * channel masks, gain controllers...) for this port. 59173b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent */ 59273b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent int (*get_audio_port)(struct audio_hw_device *dev, 59373b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent struct audio_port *port); 59473b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent 59573b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent /* Set audio port configuration */ 59673b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent int (*set_audio_port_config)(struct audio_hw_device *dev, 59773b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent const struct audio_port_config *config); 59873b8a7414afa5ee3f006468f287695d9c2054d76Eric Laurent 599f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin}; 600f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavintypedef struct audio_hw_device audio_hw_device_t; 601f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 602f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/** convenience API for opening and closing a supported device */ 603f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 604f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavinstatic inline int audio_hw_device_open(const struct hw_module_t* module, 605f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin struct audio_hw_device** device) 606f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin{ 607f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin return module->methods->open(module, AUDIO_HARDWARE_INTERFACE, 608f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin (struct hw_device_t**)device); 609f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin} 610f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 611f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavinstatic inline int audio_hw_device_close(struct audio_hw_device* device) 612f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin{ 613f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin return device->common.close(&device->common); 614f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin} 615f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 616f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 617f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin__END_DECLS 618f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin 619f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#endif // ANDROID_AUDIO_INTERFACE_H 620