blob: 7befb799aff4380a5f8503d2f9a9cba961fc952a [file] [log] [blame]
Nate Jiang7a7fd842022-12-06 17:11:13 -08001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_AUDIO_HARDWARE_INTERFACE_H
18#define ANDROID_AUDIO_HARDWARE_INTERFACE_H
19
20#include <stdint.h>
21#include <sys/types.h>
22
23#include <utils/Errors.h>
24#include <utils/String16.h>
25#include <utils/String8.h>
26#include <utils/Vector.h>
27
28#include <hardware_legacy/AudioSystemLegacy.h>
29
30#include <hardware/audio.h>
31#include <system/audio.h>
32
33#include <cutils/bitops.h>
34
35namespace android_audio_legacy {
36using android::String16;
37using android::String8;
38using android::Vector;
39
40// ----------------------------------------------------------------------------
41
42/**
43 * AudioStreamOut is the abstraction interface for the audio output hardware.
44 *
45 * It provides information about various properties of the audio output hardware driver.
46 */
47class AudioStreamOut {
48 public:
49 virtual ~AudioStreamOut() = 0;
50
51 /** return audio sampling rate in hz - eg. 44100 */
52 virtual uint32_t sampleRate() const = 0;
53
54 /** returns size of output buffer - eg. 4800 */
55 virtual size_t bufferSize() const = 0;
56
57 /**
58 * returns the output channel mask
59 */
60 virtual uint32_t channels() const = 0;
61
62 /**
63 * return audio format in 8bit or 16bit PCM format -
64 * eg. AudioSystem:PCM_16_BIT
65 */
66 virtual int format() const = 0;
67
68 /**
69 * return the frame size (number of bytes per sample).
70 */
71 uint32_t frameSize() const {
72 return audio_channel_count_from_out_mask(channels()) *
73 ((format() == AUDIO_FORMAT_PCM_16_BIT) ? sizeof(int16_t) : sizeof(int8_t));
74 }
75
76 /**
77 * return the audio hardware driver latency in milli seconds.
78 */
79 virtual uint32_t latency() const = 0;
80
81 /**
82 * Use this method in situations where audio mixing is done in the
83 * hardware. This method serves as a direct interface with hardware,
84 * allowing you to directly set the volume as apposed to via the framework.
85 * This method might produce multiple PCM outputs or hardware accelerated
86 * codecs, such as MP3 or AAC.
87 */
88 virtual status_t setVolume(float left, float right) = 0;
89
90 /** write audio buffer to driver. Returns number of bytes written */
91 virtual ssize_t write(const void* buffer, size_t bytes) = 0;
92
93 /**
94 * Put the audio hardware output into standby mode. Returns
95 * status based on include/utils/Errors.h
96 */
97 virtual status_t standby() = 0;
98
99 /** dump the state of the audio output device */
100 virtual status_t dump(int fd, const Vector<String16>& args) = 0;
101
102 // set/get audio output parameters. The function accepts a list of parameters
103 // key value pairs in the form: key1=value1;key2=value2;...
104 // Some keys are reserved for standard parameters (See AudioParameter class).
105 // If the implementation does not accept a parameter change while the output is
106 // active but the parameter is acceptable otherwise, it must return INVALID_OPERATION.
107 // The audio flinger will put the output in standby and then change the parameter value.
108 virtual status_t setParameters(const String8& keyValuePairs) = 0;
109 virtual String8 getParameters(const String8& keys) = 0;
110
111 // return the number of audio frames written by the audio dsp to DAC since
112 // the output has exited standby
113 virtual status_t getRenderPosition(uint32_t* dspFrames) = 0;
114
115 /**
116 * get the local time at which the next write to the audio driver will be
117 * presented
118 */
119 virtual status_t getNextWriteTimestamp(int64_t* timestamp);
120
121 /**
122 * Return a recent count of the number of audio frames presented to an external observer.
123 */
124 virtual status_t getPresentationPosition(uint64_t* frames, struct timespec* timestamp);
125};
126
127/**
128 * AudioStreamIn is the abstraction interface for the audio input hardware.
129 *
130 * It defines the various properties of the audio hardware input driver.
131 */
132class AudioStreamIn {
133 public:
134 virtual ~AudioStreamIn() = 0;
135
136 /** return audio sampling rate in hz - eg. 44100 */
137 virtual uint32_t sampleRate() const = 0;
138
139 /** return the input buffer size allowed by audio driver */
140 virtual size_t bufferSize() const = 0;
141
142 /** return input channel mask */
143 virtual uint32_t channels() const = 0;
144
145 /**
146 * return audio format in 8bit or 16bit PCM format -
147 * eg. AudioSystem:PCM_16_BIT
148 */
149 virtual int format() const = 0;
150
151 /**
152 * return the frame size (number of bytes per sample).
153 */
154 uint32_t frameSize() const {
155 return audio_channel_count_from_in_mask(channels()) *
156 ((format() == AudioSystem::PCM_16_BIT) ? sizeof(int16_t) : sizeof(int8_t));
157 }
158
159 /** set the input gain for the audio driver. This method is for
160 * for future use */
161 virtual status_t setGain(float gain) = 0;
162
163 /** read audio buffer in from audio driver */
164 virtual ssize_t read(void* buffer, ssize_t bytes) = 0;
165
166 /** dump the state of the audio input device */
167 virtual status_t dump(int fd, const Vector<String16>& args) = 0;
168
169 /**
170 * Put the audio hardware input into standby mode. Returns
171 * status based on include/utils/Errors.h
172 */
173 virtual status_t standby() = 0;
174
175 // set/get audio input parameters. The function accepts a list of parameters
176 // key value pairs in the form: key1=value1;key2=value2;...
177 // Some keys are reserved for standard parameters (See AudioParameter class).
178 // If the implementation does not accept a parameter change while the output is
179 // active but the parameter is acceptable otherwise, it must return INVALID_OPERATION.
180 // The audio flinger will put the input in standby and then change the parameter value.
181 virtual status_t setParameters(const String8& keyValuePairs) = 0;
182 virtual String8 getParameters(const String8& keys) = 0;
183
184 // Return the number of input frames lost in the audio driver since the last call of this
185 // function. Audio driver is expected to reset the value to 0 and restart counting upon
186 // returning the current value by this function call. Such loss typically occurs when the user
187 // space process is blocked longer than the capacity of audio driver buffers. Unit: the number
188 // of input audio frames
189 virtual unsigned int getInputFramesLost() const = 0;
190
191 virtual status_t addAudioEffect(effect_handle_t effect) = 0;
192 virtual status_t removeAudioEffect(effect_handle_t effect) = 0;
193};
194
195/**
196 * AudioHardwareInterface.h defines the interface to the audio hardware abstraction layer.
197 *
198 * The interface supports setting and getting parameters, selecting audio routing
199 * paths, and defining input and output streams.
200 *
201 * AudioFlinger initializes the audio hardware and immediately opens an output stream.
202 * You can set Audio routing to output to handset, speaker, Bluetooth, or a headset.
203 *
204 * The audio input stream is initialized when AudioFlinger is called to carry out
205 * a record operation.
206 */
207class AudioHardwareInterface {
208 public:
209 virtual ~AudioHardwareInterface() {}
210
211 /**
212 * check to see if the audio hardware interface has been initialized.
213 * return status based on values defined in include/utils/Errors.h
214 */
215 virtual status_t initCheck() = 0;
216
217 /** set the audio volume of a voice call. Range is between 0.0 and 1.0 */
218 virtual status_t setVoiceVolume(float volume) = 0;
219
220 /**
221 * set the audio volume for all audio activities other than voice call.
222 * Range between 0.0 and 1.0. If any value other than NO_ERROR is returned,
223 * the software mixer will emulate this capability.
224 */
225 virtual status_t setMasterVolume(float volume) = 0;
226
227 /**
228 * Get the current master volume value for the HAL, if the HAL supports
229 * master volume control. AudioFlinger will query this value from the
230 * primary audio HAL when the service starts and use the value for setting
231 * the initial master volume across all HALs.
232 */
233 virtual status_t getMasterVolume(float* volume) = 0;
234
235 /**
236 * setMode is called when the audio mode changes. NORMAL mode is for
237 * standard audio playback, RINGTONE when a ringtone is playing, and IN_CALL
238 * when a call is in progress.
239 */
240 virtual status_t setMode(int mode) = 0;
241
242 // mic mute
243 virtual status_t setMicMute(bool state) = 0;
244 virtual status_t getMicMute(bool* state) = 0;
245
246 // set/get global audio parameters
247 virtual status_t setParameters(const String8& keyValuePairs) = 0;
248 virtual String8 getParameters(const String8& keys) = 0;
249
250 // Returns audio input buffer size according to parameters passed or 0 if one of the
251 // parameters is not supported
252 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount) = 0;
253
254 /** This method creates and opens the audio hardware output stream */
255 virtual AudioStreamOut* openOutputStream(uint32_t devices, int* format = 0,
256 uint32_t* channels = 0, uint32_t* sampleRate = 0,
257 status_t* status = 0) = 0;
258 virtual AudioStreamOut* openOutputStreamWithFlags(
259 uint32_t devices, audio_output_flags_t flags = (audio_output_flags_t)0, int* format = 0,
260 uint32_t* channels = 0, uint32_t* sampleRate = 0, status_t* status = 0) = 0;
261 virtual void closeOutputStream(AudioStreamOut* out) = 0;
262
263 /** This method creates and opens the audio hardware input stream */
264 virtual AudioStreamIn* openInputStream(uint32_t devices, int* format, uint32_t* channels,
265 uint32_t* sampleRate, status_t* status,
266 AudioSystem::audio_in_acoustics acoustics) = 0;
267 virtual void closeInputStream(AudioStreamIn* in) = 0;
268
269 /**This method dumps the state of the audio hardware */
270 virtual status_t dumpState(int fd, const Vector<String16>& args) = 0;
271
272 virtual status_t setMasterMute(bool muted) = 0;
273
274 static AudioHardwareInterface* create();
275
276 virtual int createAudioPatch(unsigned int num_sources, const struct audio_port_config* sources,
277 unsigned int num_sinks, const struct audio_port_config* sinks,
278 audio_patch_handle_t* handle) = 0;
279
280 virtual int releaseAudioPatch(audio_patch_handle_t handle) = 0;
281
282 virtual int getAudioPort(struct audio_port* port) = 0;
283
284 virtual int setAudioPortConfig(const struct audio_port_config* config) = 0;
285
286 protected:
287 virtual status_t dump(int fd, const Vector<String16>& args) = 0;
288};
289
290// ----------------------------------------------------------------------------
291
292extern "C" AudioHardwareInterface* createAudioHardware(void);
293
294}; // namespace android_audio_legacy
295
296#endif // ANDROID_AUDIO_HARDWARE_INTERFACE_H