blob: b3e069dbfdfc7dcf801f657218088d678c8ee3aa [file] [log] [blame]
Phil Burk5ed503c2017-02-01 09:38:15 -08001/*
2 * Copyright (C) 2016 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/**
Phil Burka45be8b2017-04-05 14:45:48 -070018 * @addtogroup Audio
19 * @{
20 */
21
22/**
23 * @file AAudio.h
24 */
25
26/**
27 * This is the 'C' API for AAudio.
Phil Burk5ed503c2017-02-01 09:38:15 -080028 */
29#ifndef AAUDIO_AAUDIO_H
30#define AAUDIO_AAUDIO_H
31
Phil Burk3316d5e2017-02-15 11:23:01 -080032#include <time.h>
Phil Burk5ed503c2017-02-01 09:38:15 -080033
34#ifdef __cplusplus
35extern "C" {
36#endif
37
Phil Burka4eb0d82017-04-12 15:44:06 -070038/**
39 * This is used to represent a value that has not been specified.
40 * For example, an application could use AAUDIO_UNSPECIFIED to indicate
41 * that is did not not care what the specific value of a parameter was
42 * and would accept whatever it was given.
43 */
44#define AAUDIO_UNSPECIFIED 0
Phil Burka4eb0d82017-04-12 15:44:06 -070045
46enum {
47 AAUDIO_DIRECTION_OUTPUT,
48 AAUDIO_DIRECTION_INPUT
49};
50typedef int32_t aaudio_direction_t;
51
52enum {
53 AAUDIO_FORMAT_INVALID = -1,
54 AAUDIO_FORMAT_UNSPECIFIED = 0,
55 AAUDIO_FORMAT_PCM_I16,
Phil Burk74733452017-04-18 19:50:28 -070056 AAUDIO_FORMAT_PCM_FLOAT
Phil Burka4eb0d82017-04-12 15:44:06 -070057};
58typedef int32_t aaudio_format_t;
59
Phil Burka4eb0d82017-04-12 15:44:06 -070060enum {
61 AAUDIO_OK,
62 AAUDIO_ERROR_BASE = -900, // TODO review
63 AAUDIO_ERROR_DISCONNECTED,
64 AAUDIO_ERROR_ILLEGAL_ARGUMENT,
Phil Burk17fff382017-05-16 14:06:45 -070065 // reserved
66 AAUDIO_ERROR_INTERNAL = AAUDIO_ERROR_ILLEGAL_ARGUMENT + 2,
Phil Burka4eb0d82017-04-12 15:44:06 -070067 AAUDIO_ERROR_INVALID_STATE,
Phil Burk17fff382017-05-16 14:06:45 -070068 // reserved
69 // reserved
70 AAUDIO_ERROR_INVALID_HANDLE = AAUDIO_ERROR_INVALID_STATE + 3,
71 // reserved
72 AAUDIO_ERROR_UNIMPLEMENTED = AAUDIO_ERROR_INVALID_HANDLE + 2,
Phil Burka4eb0d82017-04-12 15:44:06 -070073 AAUDIO_ERROR_UNAVAILABLE,
74 AAUDIO_ERROR_NO_FREE_HANDLES,
75 AAUDIO_ERROR_NO_MEMORY,
76 AAUDIO_ERROR_NULL,
77 AAUDIO_ERROR_TIMEOUT,
78 AAUDIO_ERROR_WOULD_BLOCK,
79 AAUDIO_ERROR_INVALID_FORMAT,
80 AAUDIO_ERROR_OUT_OF_RANGE,
81 AAUDIO_ERROR_NO_SERVICE,
82 AAUDIO_ERROR_INVALID_RATE
83};
84typedef int32_t aaudio_result_t;
85
86enum
87{
88 AAUDIO_STREAM_STATE_UNINITIALIZED = 0,
89 AAUDIO_STREAM_STATE_UNKNOWN,
90 AAUDIO_STREAM_STATE_OPEN,
91 AAUDIO_STREAM_STATE_STARTING,
92 AAUDIO_STREAM_STATE_STARTED,
93 AAUDIO_STREAM_STATE_PAUSING,
94 AAUDIO_STREAM_STATE_PAUSED,
95 AAUDIO_STREAM_STATE_FLUSHING,
96 AAUDIO_STREAM_STATE_FLUSHED,
97 AAUDIO_STREAM_STATE_STOPPING,
98 AAUDIO_STREAM_STATE_STOPPED,
99 AAUDIO_STREAM_STATE_CLOSING,
100 AAUDIO_STREAM_STATE_CLOSED,
101 AAUDIO_STREAM_STATE_DISCONNECTED
102};
103typedef int32_t aaudio_stream_state_t;
104
105
106enum {
107 /**
108 * This will be the only stream using a particular source or sink.
109 * This mode will provide the lowest possible latency.
110 * You should close EXCLUSIVE streams immediately when you are not using them.
111 */
112 AAUDIO_SHARING_MODE_EXCLUSIVE,
113 /**
114 * Multiple applications will be mixed by the AAudio Server.
115 * This will have higher latency than the EXCLUSIVE mode.
116 */
117 AAUDIO_SHARING_MODE_SHARED
118};
119typedef int32_t aaudio_sharing_mode_t;
120
Phil Burke2fbb592017-05-01 15:05:52 -0700121
122enum {
123 /**
124 * No particular performance needs. Default.
125 */
126 AAUDIO_PERFORMANCE_MODE_NONE = 10,
127
128 /**
129 * Extending battery life is most important.
Phil Burked0a3fe2017-12-05 14:27:43 -0800130 *
131 * This mode is not supported in input streams.
132 * Mode NONE will be used if this is requested.
Phil Burke2fbb592017-05-01 15:05:52 -0700133 */
134 AAUDIO_PERFORMANCE_MODE_POWER_SAVING,
135
136 /**
137 * Reducing latency is most important.
138 */
139 AAUDIO_PERFORMANCE_MODE_LOW_LATENCY
140};
141typedef int32_t aaudio_performance_mode_t;
142
Phil Burk361b1422017-12-20 14:24:16 -0800143/**
144 * The USAGE attribute expresses "why" you are playing a sound, what is this sound used for.
145 * This information is used by certain platforms or routing policies
146 * to make more refined volume or routing decisions.
147 *
148 * Note that these match the equivalent values in AudioAttributes in the Android Java API.
149 */
150enum {
151 /**
152 * Use this for streaming media, music performance, video, podcasts, etcetera.
153 */
154 AAUDIO_USAGE_MEDIA = 1,
155
156 /**
157 * Use this for voice over IP, telephony, etcetera.
158 */
159 AAUDIO_USAGE_VOICE_COMMUNICATION = 2,
160
161 /**
162 * Use this for sounds associated with telephony such as busy tones, DTMF, etcetera.
163 */
164 AAUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING = 3,
165
166 /**
167 * Use this to demand the users attention.
168 */
169 AAUDIO_USAGE_ALARM = 4,
170
171 /**
172 * Use this for notifying the user when a message has arrived or some
173 * other background event has occured.
174 */
175 AAUDIO_USAGE_NOTIFICATION = 5,
176
177 /**
178 * Use this when the phone rings.
179 */
180 AAUDIO_USAGE_NOTIFICATION_RINGTONE = 6,
181
182 /**
183 * Use this to attract the users attention when, for example, the battery is low.
184 */
185 AAUDIO_USAGE_NOTIFICATION_EVENT = 10,
186
187 /**
188 * Use this for screen readers, etcetera.
189 */
190 AAUDIO_USAGE_ASSISTANCE_ACCESSIBILITY = 11,
191
192 /**
193 * Use this for driving or navigation directions.
194 */
195 AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12,
196
197 /**
198 * Use this for user interface sounds, beeps, etcetera.
199 */
200 AAUDIO_USAGE_ASSISTANCE_SONIFICATION = 13,
201
202 /**
203 * Use this for game audio and sound effects.
204 */
205 AAUDIO_USAGE_GAME = 14,
206
207 /**
208 * Use this for audio responses to user queries, audio instructions or help utterances.
209 */
210 AAUDIO_USAGE_ASSISTANT = 16
211};
212typedef int32_t aaudio_usage_t;
213
214/**
215 * The CONTENT_TYPE attribute describes "what" you are playing.
216 * It expresses the general category of the content. This information is optional.
217 * But in case it is known (for instance {@link #AAUDIO_CONTENT_TYPE_MOVIE} for a
218 * movie streaming service or {@link #AAUDIO_CONTENT_TYPE_SPEECH} for
219 * an audio book application) this information might be used by the audio framework to
220 * enforce audio focus.
221 *
222 * Note that these match the equivalent values in AudioAttributes in the Android Java API.
223 */
224enum {
225
226 /**
227 * Use this for spoken voice, audio books, etcetera.
228 */
229 AAUDIO_CONTENT_TYPE_SPEECH = 1,
230
231 /**
232 * Use this for pre-recorded or live music.
233 */
234 AAUDIO_CONTENT_TYPE_MUSIC = 2,
235
236 /**
237 * Use this for a movie or video soundtrack.
238 */
239 AAUDIO_CONTENT_TYPE_MOVIE = 3,
240
241 /**
242 * Use this for sound is designed to accompany a user action,
243 * such as a click or beep sound made when the user presses a button.
244 */
245 AAUDIO_CONTENT_TYPE_SONIFICATION = 4
246};
247typedef int32_t aaudio_content_type_t;
248
249/**
250 * Defines the audio source.
251 * An audio source defines both a default physical source of audio signal, and a recording
252 * configuration.
253 *
254 * Note that these match the equivalent values in MediaRecorder.AudioSource in the Android Java API.
255 */
256enum {
257 /**
258 * Use this preset when other presets do not apply.
259 */
260 AAUDIO_INPUT_PRESET_GENERIC = 1,
261
262 /**
263 * Use this preset when recording video.
264 */
265 AAUDIO_INPUT_PRESET_CAMCORDER = 5,
266
267 /**
268 * Use this preset when doing speech recognition.
269 */
270 AAUDIO_INPUT_PRESET_VOICE_RECOGNITION = 6,
271
272 /**
273 * Use this preset when doing telephony or voice messaging.
274 */
275 AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION = 7,
276
277 /**
278 * Use this preset to obtain an input with no effects.
279 * Note that this input will not have automatic gain control
280 * so the recorded volume may be very low.
281 */
282 AAUDIO_INPUT_PRESET_UNPROCESSED = 9,
283};
284typedef int32_t aaudio_input_preset_t;
285
Phil Burke2155ef2017-02-24 13:50:29 -0800286typedef struct AAudioStreamStruct AAudioStream;
287typedef struct AAudioStreamBuilderStruct AAudioStreamBuilder;
Phil Burk5ed503c2017-02-01 09:38:15 -0800288
Phil Burk5ed503c2017-02-01 09:38:15 -0800289#ifndef AAUDIO_API
Phil Burk3316d5e2017-02-15 11:23:01 -0800290#define AAUDIO_API /* export this symbol */
Phil Burk5ed503c2017-02-01 09:38:15 -0800291#endif
292
293// ============================================================
294// Audio System
295// ============================================================
296
297/**
Phil Burk5ed503c2017-02-01 09:38:15 -0800298 * The text is the ASCII symbol corresponding to the returnCode,
299 * or an English message saying the returnCode is unrecognized.
300 * This is intended for developers to use when debugging.
301 * It is not for display to users.
302 *
303 * @return pointer to a text representation of an AAudio result code.
304 */
305AAUDIO_API const char * AAudio_convertResultToText(aaudio_result_t returnCode);
306
307/**
308 * The text is the ASCII symbol corresponding to the stream state,
309 * or an English message saying the state is unrecognized.
310 * This is intended for developers to use when debugging.
311 * It is not for display to users.
312 *
313 * @return pointer to a text representation of an AAudio state.
314 */
315AAUDIO_API const char * AAudio_convertStreamStateToText(aaudio_stream_state_t state);
316
317// ============================================================
318// StreamBuilder
319// ============================================================
320
321/**
322 * Create a StreamBuilder that can be used to open a Stream.
323 *
324 * The deviceId is initially unspecified, meaning that the current default device will be used.
325 *
326 * The default direction is AAUDIO_DIRECTION_OUTPUT.
Phil Burk3316d5e2017-02-15 11:23:01 -0800327 * The default sharing mode is AAUDIO_SHARING_MODE_SHARED.
Phil Burk5ed503c2017-02-01 09:38:15 -0800328 * The data format, samplesPerFrames and sampleRate are unspecified and will be
329 * chosen by the device when it is opened.
330 *
331 * AAudioStreamBuilder_delete() must be called when you are done using the builder.
332 */
Phil Burke2155ef2017-02-24 13:50:29 -0800333AAUDIO_API aaudio_result_t AAudio_createStreamBuilder(AAudioStreamBuilder** builder);
Phil Burk5ed503c2017-02-01 09:38:15 -0800334
335/**
336 * Request an audio device identified device using an ID.
Phil Burk5ed503c2017-02-01 09:38:15 -0800337 * On Android, for example, the ID could be obtained from the Java AudioManager.
338 *
Glenn Kasten5f510d22017-05-30 15:52:15 -0700339 * The default, if you do not call this function, is AAUDIO_UNSPECIFIED,
Phil Burke057ca92017-03-28 11:31:34 -0700340 * in which case the primary device will be used.
Phil Burk5ed503c2017-02-01 09:38:15 -0800341 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800342 * @param builder reference provided by AAudio_createStreamBuilder()
Glenn Kasten5f510d22017-05-30 15:52:15 -0700343 * @param deviceId device identifier or AAUDIO_UNSPECIFIED
Phil Burk5ed503c2017-02-01 09:38:15 -0800344 */
Phil Burke2155ef2017-02-24 13:50:29 -0800345AAUDIO_API void AAudioStreamBuilder_setDeviceId(AAudioStreamBuilder* builder,
Phil Burk3316d5e2017-02-15 11:23:01 -0800346 int32_t deviceId);
Phil Burk5ed503c2017-02-01 09:38:15 -0800347
348/**
Phil Burke057ca92017-03-28 11:31:34 -0700349 * Request a sample rate in Hertz.
350 *
Phil Burke057ca92017-03-28 11:31:34 -0700351 * The default, if you do not call this function, is AAUDIO_UNSPECIFIED.
Phil Burk8f624892017-05-11 11:44:20 -0700352 * An optimal value will then be chosen when the stream is opened.
353 * After opening a stream with an unspecified value, the application must
354 * query for the actual value, which may vary by device.
355 *
356 * If an exact value is specified then an opened stream will use that value.
357 * If a stream cannot be opened with the specified value then the open will fail.
Phil Burke057ca92017-03-28 11:31:34 -0700358 *
359 * @param builder reference provided by AAudio_createStreamBuilder()
360 * @param sampleRate frames per second. Common rates include 44100 and 48000 Hz.
Phil Burk5ed503c2017-02-01 09:38:15 -0800361 */
Phil Burke2155ef2017-02-24 13:50:29 -0800362AAUDIO_API void AAudioStreamBuilder_setSampleRate(AAudioStreamBuilder* builder,
Phil Burk3316d5e2017-02-15 11:23:01 -0800363 int32_t sampleRate);
Phil Burk5ed503c2017-02-01 09:38:15 -0800364
365/**
Phil Burk20523ed2017-04-24 17:04:01 -0700366 * Request a number of channels for the stream.
Phil Burke057ca92017-03-28 11:31:34 -0700367 *
Phil Burke057ca92017-03-28 11:31:34 -0700368 * The default, if you do not call this function, is AAUDIO_UNSPECIFIED.
Phil Burk8f624892017-05-11 11:44:20 -0700369 * An optimal value will then be chosen when the stream is opened.
370 * After opening a stream with an unspecified value, the application must
371 * query for the actual value, which may vary by device.
Phil Burk5ed503c2017-02-01 09:38:15 -0800372 *
Phil Burk8f624892017-05-11 11:44:20 -0700373 * If an exact value is specified then an opened stream will use that value.
374 * If a stream cannot be opened with the specified value then the open will fail.
Phil Burke057ca92017-03-28 11:31:34 -0700375 *
376 * @param builder reference provided by AAudio_createStreamBuilder()
Phil Burk20523ed2017-04-24 17:04:01 -0700377 * @param channelCount Number of channels desired.
Phil Burk5ed503c2017-02-01 09:38:15 -0800378 */
Phil Burk20523ed2017-04-24 17:04:01 -0700379AAUDIO_API void AAudioStreamBuilder_setChannelCount(AAudioStreamBuilder* builder,
380 int32_t channelCount);
381
382/**
Phil Burke74240d2017-08-03 15:25:43 -0700383 * Identical to AAudioStreamBuilder_setChannelCount().
384 *
385 * @param builder reference provided by AAudio_createStreamBuilder()
386 * @param samplesPerFrame Number of samples in a frame.
387 */
388AAUDIO_API void AAudioStreamBuilder_setSamplesPerFrame(AAudioStreamBuilder* builder,
389 int32_t samplesPerFrame);
390
391/**
Phil Burk5ed503c2017-02-01 09:38:15 -0800392 * Request a sample data format, for example AAUDIO_FORMAT_PCM_I16.
Phil Burke057ca92017-03-28 11:31:34 -0700393 *
394 * The default, if you do not call this function, is AAUDIO_UNSPECIFIED.
Phil Burk8f624892017-05-11 11:44:20 -0700395 * An optimal value will then be chosen when the stream is opened.
396 * After opening a stream with an unspecified value, the application must
397 * query for the actual value, which may vary by device.
Phil Burke057ca92017-03-28 11:31:34 -0700398 *
Phil Burk8f624892017-05-11 11:44:20 -0700399 * If an exact value is specified then an opened stream will use that value.
400 * If a stream cannot be opened with the specified value then the open will fail.
Phil Burke057ca92017-03-28 11:31:34 -0700401 *
402 * @param builder reference provided by AAudio_createStreamBuilder()
Phil Burk8f624892017-05-11 11:44:20 -0700403 * @param format common formats are AAUDIO_FORMAT_PCM_FLOAT and AAUDIO_FORMAT_PCM_I16.
Phil Burk5ed503c2017-02-01 09:38:15 -0800404 */
Phil Burke2155ef2017-02-24 13:50:29 -0800405AAUDIO_API void AAudioStreamBuilder_setFormat(AAudioStreamBuilder* builder,
Phil Burk9dca9822017-05-26 14:27:43 -0700406 aaudio_format_t format);
Phil Burk5ed503c2017-02-01 09:38:15 -0800407
408/**
Phil Burk5ed503c2017-02-01 09:38:15 -0800409 * Request a mode for sharing the device.
Phil Burke057ca92017-03-28 11:31:34 -0700410 *
411 * The default, if you do not call this function, is AAUDIO_SHARING_MODE_SHARED.
412 *
Phil Burk5ed503c2017-02-01 09:38:15 -0800413 * The requested sharing mode may not be available.
Phil Burke057ca92017-03-28 11:31:34 -0700414 * The application can query for the actual mode after the stream is opened.
Phil Burk5ed503c2017-02-01 09:38:15 -0800415 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800416 * @param builder reference provided by AAudio_createStreamBuilder()
Phil Burke057ca92017-03-28 11:31:34 -0700417 * @param sharingMode AAUDIO_SHARING_MODE_SHARED or AAUDIO_SHARING_MODE_EXCLUSIVE
Phil Burk5ed503c2017-02-01 09:38:15 -0800418 */
Phil Burke2155ef2017-02-24 13:50:29 -0800419AAUDIO_API void AAudioStreamBuilder_setSharingMode(AAudioStreamBuilder* builder,
Phil Burk5ed503c2017-02-01 09:38:15 -0800420 aaudio_sharing_mode_t sharingMode);
421
422/**
Phil Burke057ca92017-03-28 11:31:34 -0700423 * Request the direction for a stream.
424 *
425 * The default, if you do not call this function, is AAUDIO_DIRECTION_OUTPUT.
Phil Burk5ed503c2017-02-01 09:38:15 -0800426 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800427 * @param builder reference provided by AAudio_createStreamBuilder()
Phil Burk5ed503c2017-02-01 09:38:15 -0800428 * @param direction AAUDIO_DIRECTION_OUTPUT or AAUDIO_DIRECTION_INPUT
Phil Burk5ed503c2017-02-01 09:38:15 -0800429 */
Phil Burke2155ef2017-02-24 13:50:29 -0800430AAUDIO_API void AAudioStreamBuilder_setDirection(AAudioStreamBuilder* builder,
Phil Burk3df348f2017-02-08 11:41:55 -0800431 aaudio_direction_t direction);
Phil Burk5ed503c2017-02-01 09:38:15 -0800432
433/**
Phil Burke057ca92017-03-28 11:31:34 -0700434 * Set the requested buffer capacity in frames.
Phil Burk3df348f2017-02-08 11:41:55 -0800435 * The final AAudioStream capacity may differ, but will probably be at least this big.
436 *
Phil Burke057ca92017-03-28 11:31:34 -0700437 * The default, if you do not call this function, is AAUDIO_UNSPECIFIED.
Phil Burk3df348f2017-02-08 11:41:55 -0800438 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800439 * @param builder reference provided by AAudio_createStreamBuilder()
Phil Burke057ca92017-03-28 11:31:34 -0700440 * @param numFrames the desired buffer capacity in frames or AAUDIO_UNSPECIFIED
Phil Burk3df348f2017-02-08 11:41:55 -0800441 */
Phil Burke2155ef2017-02-24 13:50:29 -0800442AAUDIO_API void AAudioStreamBuilder_setBufferCapacityInFrames(AAudioStreamBuilder* builder,
Phil Burke057ca92017-03-28 11:31:34 -0700443 int32_t numFrames);
Phil Burke2fbb592017-05-01 15:05:52 -0700444
445/**
446 * Set the requested performance mode.
447 *
448 * The default, if you do not call this function, is AAUDIO_PERFORMANCE_MODE_NONE.
449 *
450 * @param builder reference provided by AAudio_createStreamBuilder()
451 * @param mode the desired performance mode, eg. AAUDIO_PERFORMANCE_MODE_LOW_LATENCY
452 */
453AAUDIO_API void AAudioStreamBuilder_setPerformanceMode(AAudioStreamBuilder* builder,
454 aaudio_performance_mode_t mode);
455
Phil Burke057ca92017-03-28 11:31:34 -0700456/**
Phil Burk361b1422017-12-20 14:24:16 -0800457 * Set the intended use case for the stream.
458 *
459 * The AAudio system will use this information to optimize the
460 * behavior of the stream.
461 * This could, for example, affect how volume and focus is handled for the stream.
462 *
463 * The default, if you do not call this function, is AAUDIO_USAGE_MEDIA.
464 *
465 * @param builder reference provided by AAudio_createStreamBuilder()
466 * @param usage the desired usage, eg. AAUDIO_USAGE_GAME
467 */
468AAUDIO_API void AAudioStreamBuilder_setUsage(AAudioStreamBuilder* builder,
469 aaudio_usage_t usage);
470
471/**
472 * Set the type of audio data that the stream will carry.
473 *
474 * The AAudio system will use this information to optimize the
475 * behavior of the stream.
476 * This could, for example, affect whether a stream is paused when a notification occurs.
477 *
478 * The default, if you do not call this function, is AAUDIO_CONTENT_TYPE_MUSIC.
479 *
480 * @param builder reference provided by AAudio_createStreamBuilder()
481 * @param contentType the type of audio data, eg. AAUDIO_CONTENT_TYPE_SPEECH
482 */
483AAUDIO_API void AAudioStreamBuilder_setContentType(AAudioStreamBuilder* builder,
484 aaudio_content_type_t contentType);
485
486/**
487 * Set the input (capture) preset for the stream.
488 *
489 * The AAudio system will use this information to optimize the
490 * behavior of the stream.
491 * This could, for example, affect which microphones are used and how the
492 * recorded data is processed.
493 *
494 * The default, if you do not call this function, is AAUDIO_INPUT_PRESET_GENERIC.
495 *
496 * @param builder reference provided by AAudio_createStreamBuilder()
497 * @param inputPreset the desired configuration for recording
498 */
499AAUDIO_API void AAudioStreamBuilder_setInputPreset(AAudioStreamBuilder* builder,
500 aaudio_input_preset_t inputPreset);
501
502/**
Phil Burke057ca92017-03-28 11:31:34 -0700503 * Return one of these values from the data callback function.
504 */
505enum {
506
507 /**
508 * Continue calling the callback.
509 */
510 AAUDIO_CALLBACK_RESULT_CONTINUE = 0,
511
512 /**
513 * Stop calling the callback.
514 *
515 * The application will still need to call AAudioStream_requestPause()
516 * or AAudioStream_requestStop().
517 */
518 AAUDIO_CALLBACK_RESULT_STOP,
519
520};
521typedef int32_t aaudio_data_callback_result_t;
522
523/**
524 * Prototype for the data function that is passed to AAudioStreamBuilder_setDataCallback().
525 *
526 * For an output stream, this function should render and write numFrames of data
527 * in the streams current data format to the audioData buffer.
528 *
529 * For an input stream, this function should read and process numFrames of data
530 * from the audioData buffer.
531 *
Phil Burked0a3fe2017-12-05 14:27:43 -0800532 * The audio data is passed through the buffer. So do NOT call AAudioStream_read() or
533 * AAudioStream_write() on the stream that is making the callback.
534 *
535 * Note that numFrames can vary unless AAudioStreamBuilder_setFramesPerDataCallback()
536 * is called.
537 *
538 * Also note that this callback function should be considered a "real-time" function.
Phil Burke057ca92017-03-28 11:31:34 -0700539 * It must not do anything that could cause an unbounded delay because that can cause the
540 * audio to glitch or pop.
541 *
542 * These are things the function should NOT do:
543 * <ul>
544 * <li>allocate memory using, for example, malloc() or new</li>
545 * <li>any file operations such as opening, closing, reading or writing</li>
546 * <li>any network operations such as streaming</li>
547 * <li>use any mutexes or other synchronization primitives</li>
548 * <li>sleep</li>
Phil Burked0a3fe2017-12-05 14:27:43 -0800549 * <li>stop or close the stream</li>
Phil Burke057ca92017-03-28 11:31:34 -0700550 * </ul>
551 *
552 * If you need to move data, eg. MIDI commands, in or out of the callback function then
553 * we recommend the use of non-blocking techniques such as an atomic FIFO.
554 *
555 * @param stream reference provided by AAudioStreamBuilder_openStream()
556 * @param userData the same address that was passed to AAudioStreamBuilder_setCallback()
557 * @param audioData a pointer to the audio data
Phil Burked0a3fe2017-12-05 14:27:43 -0800558 * @param numFrames the number of frames to be processed, which can vary
Phil Burke057ca92017-03-28 11:31:34 -0700559 * @return AAUDIO_CALLBACK_RESULT_*
560 */
561typedef aaudio_data_callback_result_t (*AAudioStream_dataCallback)(
562 AAudioStream *stream,
563 void *userData,
564 void *audioData,
565 int32_t numFrames);
566
567/**
568 * Request that AAudio call this functions when the stream is running.
569 *
570 * Note that when using this callback, the audio data will be passed in or out
571 * of the function as an argument.
572 * So you cannot call AAudioStream_write() or AAudioStream_read() on the same stream
573 * that has an active data callback.
574 *
575 * The callback function will start being called after AAudioStream_requestStart() is called.
576 * It will stop being called after AAudioStream_requestPause() or
577 * AAudioStream_requestStop() is called.
578 *
579 * This callback function will be called on a real-time thread owned by AAudio. See
Glenn Kasten0d804362017-04-13 09:20:14 -0700580 * {@link AAudioStream_dataCallback} for more information.
Phil Burke057ca92017-03-28 11:31:34 -0700581 *
582 * Note that the AAudio callbacks will never be called simultaneously from multiple threads.
583 *
584 * @param builder reference provided by AAudio_createStreamBuilder()
585 * @param callback pointer to a function that will process audio data.
586 * @param userData pointer to an application data structure that will be passed
587 * to the callback functions.
588 */
589AAUDIO_API void AAudioStreamBuilder_setDataCallback(AAudioStreamBuilder* builder,
590 AAudioStream_dataCallback callback,
591 void *userData);
592
593/**
594 * Set the requested data callback buffer size in frames.
595 * See {@link AAudioStream_dataCallback}.
596 *
597 * The default, if you do not call this function, is AAUDIO_UNSPECIFIED.
598 *
599 * For the lowest possible latency, do not call this function. AAudio will then
600 * call the dataProc callback function with whatever size is optimal.
601 * That size may vary from one callback to another.
602 *
603 * Only use this function if the application requires a specific number of frames for processing.
604 * The application might, for example, be using an FFT that requires
605 * a specific power-of-two sized buffer.
606 *
607 * AAudio may need to add additional buffering in order to adapt between the internal
608 * buffer size and the requested buffer size.
609 *
610 * If you do call this function then the requested size should be less than
611 * half the buffer capacity, to allow double buffering.
612 *
613 * @param builder reference provided by AAudio_createStreamBuilder()
614 * @param numFrames the desired buffer size in frames or AAUDIO_UNSPECIFIED
615 */
616AAUDIO_API void AAudioStreamBuilder_setFramesPerDataCallback(AAudioStreamBuilder* builder,
617 int32_t numFrames);
618
619/**
620 * Prototype for the callback function that is passed to
621 * AAudioStreamBuilder_setErrorCallback().
622 *
623 * @param stream reference provided by AAudioStreamBuilder_openStream()
624 * @param userData the same address that was passed to AAudioStreamBuilder_setErrorCallback()
625 * @param error an AAUDIO_ERROR_* value.
626 */
627typedef void (*AAudioStream_errorCallback)(
628 AAudioStream *stream,
629 void *userData,
630 aaudio_result_t error);
631
632/**
Phil Burked0a3fe2017-12-05 14:27:43 -0800633 * Request that AAudio call this function if any error occurs or the stream is disconnected.
Phil Burke057ca92017-03-28 11:31:34 -0700634 *
635 * It will be called, for example, if a headset or a USB device is unplugged causing the stream's
Phil Burked0a3fe2017-12-05 14:27:43 -0800636 * device to be unavailable or "disconnected".
Phil Burke057ca92017-03-28 11:31:34 -0700637 * Another possible cause of error would be a timeout or an unanticipated internal error.
638 *
Phil Burked0a3fe2017-12-05 14:27:43 -0800639 * In response, this function should signal or create another thread to stop
640 * and close this stream. The other thread could then reopen a stream on another device.
641 * Do not stop or close the stream, or reopen the new stream, directly from this callback.
642 *
643 * This callback will not be called because of actions by the application, such as stopping
644 * or closing a stream.
645 *
Phil Burke057ca92017-03-28 11:31:34 -0700646 * Note that the AAudio callbacks will never be called simultaneously from multiple threads.
647 *
648 * @param builder reference provided by AAudio_createStreamBuilder()
649 * @param callback pointer to a function that will be called if an error occurs.
650 * @param userData pointer to an application data structure that will be passed
651 * to the callback functions.
652 */
653AAUDIO_API void AAudioStreamBuilder_setErrorCallback(AAudioStreamBuilder* builder,
654 AAudioStream_errorCallback callback,
655 void *userData);
Phil Burk5ed503c2017-02-01 09:38:15 -0800656
657/**
658 * Open a stream based on the options in the StreamBuilder.
659 *
660 * AAudioStream_close must be called when finished with the stream to recover
661 * the memory and to free the associated resources.
662 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800663 * @param builder reference provided by AAudio_createStreamBuilder()
664 * @param stream pointer to a variable to receive the new stream reference
Phil Burk5ed503c2017-02-01 09:38:15 -0800665 * @return AAUDIO_OK or a negative error.
666 */
Phil Burke2155ef2017-02-24 13:50:29 -0800667AAUDIO_API aaudio_result_t AAudioStreamBuilder_openStream(AAudioStreamBuilder* builder,
668 AAudioStream** stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800669
670/**
671 * Delete the resources associated with the StreamBuilder.
672 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800673 * @param builder reference provided by AAudio_createStreamBuilder()
Phil Burk5ed503c2017-02-01 09:38:15 -0800674 * @return AAUDIO_OK or a negative error.
675 */
Phil Burke2155ef2017-02-24 13:50:29 -0800676AAUDIO_API aaudio_result_t AAudioStreamBuilder_delete(AAudioStreamBuilder* builder);
Phil Burk5ed503c2017-02-01 09:38:15 -0800677
678// ============================================================
679// Stream Control
680// ============================================================
681
682/**
683 * Free the resources associated with a stream created by AAudioStreamBuilder_openStream()
684 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800685 * @param stream reference provided by AAudioStreamBuilder_openStream()
Phil Burk5ed503c2017-02-01 09:38:15 -0800686 * @return AAUDIO_OK or a negative error.
687 */
Phil Burke2155ef2017-02-24 13:50:29 -0800688AAUDIO_API aaudio_result_t AAudioStream_close(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800689
690/**
691 * Asynchronously request to start playing the stream. For output streams, one should
692 * write to the stream to fill the buffer before starting.
693 * Otherwise it will underflow.
694 * After this call the state will be in AAUDIO_STREAM_STATE_STARTING or AAUDIO_STREAM_STATE_STARTED.
695 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800696 * @param stream reference provided by AAudioStreamBuilder_openStream()
Phil Burk5ed503c2017-02-01 09:38:15 -0800697 * @return AAUDIO_OK or a negative error.
698 */
Phil Burke2155ef2017-02-24 13:50:29 -0800699AAUDIO_API aaudio_result_t AAudioStream_requestStart(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800700
701/**
702 * Asynchronous request for the stream to pause.
703 * Pausing a stream will freeze the data flow but not flush any buffers.
704 * Use AAudioStream_Start() to resume playback after a pause.
705 * After this call the state will be in AAUDIO_STREAM_STATE_PAUSING or AAUDIO_STREAM_STATE_PAUSED.
706 *
Phil Burk068c10f2017-05-08 16:36:41 -0700707 * This will return AAUDIO_ERROR_UNIMPLEMENTED for input streams.
708 * For input streams use AAudioStream_requestStop().
709 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800710 * @param stream reference provided by AAudioStreamBuilder_openStream()
Phil Burk5ed503c2017-02-01 09:38:15 -0800711 * @return AAUDIO_OK or a negative error.
712 */
Phil Burke2155ef2017-02-24 13:50:29 -0800713AAUDIO_API aaudio_result_t AAudioStream_requestPause(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800714
715/**
716 * Asynchronous request for the stream to flush.
717 * Flushing will discard any pending data.
718 * This call only works if the stream is pausing or paused. TODO review
719 * Frame counters are not reset by a flush. They may be advanced.
720 * After this call the state will be in AAUDIO_STREAM_STATE_FLUSHING or AAUDIO_STREAM_STATE_FLUSHED.
721 *
Phil Burk068c10f2017-05-08 16:36:41 -0700722 * This will return AAUDIO_ERROR_UNIMPLEMENTED for input streams.
723 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800724 * @param stream reference provided by AAudioStreamBuilder_openStream()
Phil Burk5ed503c2017-02-01 09:38:15 -0800725 * @return AAUDIO_OK or a negative error.
726 */
Phil Burke2155ef2017-02-24 13:50:29 -0800727AAUDIO_API aaudio_result_t AAudioStream_requestFlush(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800728
729/**
730 * Asynchronous request for the stream to stop.
731 * The stream will stop after all of the data currently buffered has been played.
732 * After this call the state will be in AAUDIO_STREAM_STATE_STOPPING or AAUDIO_STREAM_STATE_STOPPED.
733 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800734 * @param stream reference provided by AAudioStreamBuilder_openStream()
Phil Burk5ed503c2017-02-01 09:38:15 -0800735 * @return AAUDIO_OK or a negative error.
736 */
Phil Burke2155ef2017-02-24 13:50:29 -0800737AAUDIO_API aaudio_result_t AAudioStream_requestStop(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800738
739/**
Phil Burk3316d5e2017-02-15 11:23:01 -0800740 * Query the current state of the client, eg. AAUDIO_STREAM_STATE_PAUSING
Phil Burk5ed503c2017-02-01 09:38:15 -0800741 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800742 * This function will immediately return the state without updating the state.
743 * If you want to update the client state based on the server state then
744 * call AAudioStream_waitForStateChange() with currentState
745 * set to AAUDIO_STREAM_STATE_UNKNOWN and a zero timeout.
746 *
747 * @param stream reference provided by AAudioStreamBuilder_openStream()
Phil Burk5ed503c2017-02-01 09:38:15 -0800748 */
Phil Burke2155ef2017-02-24 13:50:29 -0800749AAUDIO_API aaudio_stream_state_t AAudioStream_getState(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800750
751/**
752 * Wait until the current state no longer matches the input state.
753 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800754 * This will update the current client state.
755 *
Phil Burk5ed503c2017-02-01 09:38:15 -0800756 * <pre><code>
Phil Burked0a3fe2017-12-05 14:27:43 -0800757 * aaudio_result_t result = AAUDIO_OK;
758 * aaudio_stream_state_t currentState = AAudioStream_getState(stream);
759 * aaudio_stream_state_t inputState = currentState;
760 * while (result == AAUDIO_OK && currentState != AAUDIO_STREAM_STATE_PAUSED) {
Phil Burk5ed503c2017-02-01 09:38:15 -0800761 * result = AAudioStream_waitForStateChange(
Phil Burked0a3fe2017-12-05 14:27:43 -0800762 * stream, inputState, &currentState, MY_TIMEOUT_NANOS);
763 * inputState = currentState;
Phil Burk5ed503c2017-02-01 09:38:15 -0800764 * }
765 * </code></pre>
766 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800767 * @param stream A reference provided by AAudioStreamBuilder_openStream()
Phil Burk5ed503c2017-02-01 09:38:15 -0800768 * @param inputState The state we want to avoid.
769 * @param nextState Pointer to a variable that will be set to the new state.
770 * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion.
771 * @return AAUDIO_OK or a negative error.
772 */
Phil Burke2155ef2017-02-24 13:50:29 -0800773AAUDIO_API aaudio_result_t AAudioStream_waitForStateChange(AAudioStream* stream,
Phil Burk5ed503c2017-02-01 09:38:15 -0800774 aaudio_stream_state_t inputState,
775 aaudio_stream_state_t *nextState,
Phil Burk3316d5e2017-02-15 11:23:01 -0800776 int64_t timeoutNanoseconds);
Phil Burk5ed503c2017-02-01 09:38:15 -0800777
778// ============================================================
779// Stream I/O
780// ============================================================
781
782/**
783 * Read data from the stream.
784 *
785 * The call will wait until the read is complete or until it runs out of time.
786 * If timeoutNanos is zero then this call will not wait.
787 *
788 * Note that timeoutNanoseconds is a relative duration in wall clock time.
789 * Time will not stop if the thread is asleep.
790 * So it will be implemented using CLOCK_BOOTTIME.
791 *
792 * This call is "strong non-blocking" unless it has to wait for data.
793 *
794 * @param stream A stream created using AAudioStreamBuilder_openStream().
795 * @param buffer The address of the first sample.
796 * @param numFrames Number of frames to read. Only complete frames will be written.
797 * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion.
Phil Burk3316d5e2017-02-15 11:23:01 -0800798 * @return The number of frames actually read or a negative error.
Phil Burk5ed503c2017-02-01 09:38:15 -0800799 */
Phil Burke2155ef2017-02-24 13:50:29 -0800800AAUDIO_API aaudio_result_t AAudioStream_read(AAudioStream* stream,
Phil Burk5ed503c2017-02-01 09:38:15 -0800801 void *buffer,
Phil Burk3316d5e2017-02-15 11:23:01 -0800802 int32_t numFrames,
803 int64_t timeoutNanoseconds);
Phil Burk5ed503c2017-02-01 09:38:15 -0800804
805/**
806 * Write data to the stream.
807 *
808 * The call will wait until the write is complete or until it runs out of time.
809 * If timeoutNanos is zero then this call will not wait.
810 *
811 * Note that timeoutNanoseconds is a relative duration in wall clock time.
812 * Time will not stop if the thread is asleep.
813 * So it will be implemented using CLOCK_BOOTTIME.
814 *
815 * This call is "strong non-blocking" unless it has to wait for room in the buffer.
816 *
817 * @param stream A stream created using AAudioStreamBuilder_openStream().
818 * @param buffer The address of the first sample.
819 * @param numFrames Number of frames to write. Only complete frames will be written.
820 * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion.
821 * @return The number of frames actually written or a negative error.
822 */
Phil Burke2155ef2017-02-24 13:50:29 -0800823AAUDIO_API aaudio_result_t AAudioStream_write(AAudioStream* stream,
Phil Burk5ed503c2017-02-01 09:38:15 -0800824 const void *buffer,
Phil Burk3316d5e2017-02-15 11:23:01 -0800825 int32_t numFrames,
826 int64_t timeoutNanoseconds);
Phil Burk5ed503c2017-02-01 09:38:15 -0800827
Phil Burk5ed503c2017-02-01 09:38:15 -0800828// ============================================================
829// Stream - queries
830// ============================================================
831
Phil Burk5ed503c2017-02-01 09:38:15 -0800832/**
833 * This can be used to adjust the latency of the buffer by changing
834 * the threshold where blocking will occur.
Phil Burk3316d5e2017-02-15 11:23:01 -0800835 * By combining this with AAudioStream_getXRunCount(), the latency can be tuned
Phil Burk5ed503c2017-02-01 09:38:15 -0800836 * at run-time for each device.
837 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800838 * This cannot be set higher than AAudioStream_getBufferCapacityInFrames().
Phil Burk5ed503c2017-02-01 09:38:15 -0800839 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800840 * Note that you will probably not get the exact size you request.
841 * Call AAudioStream_getBufferSizeInFrames() to see what the actual final size is.
842 *
843 * @param stream reference provided by AAudioStreamBuilder_openStream()
Phil Burke057ca92017-03-28 11:31:34 -0700844 * @param numFrames requested number of frames that can be filled without blocking
Phil Burk3316d5e2017-02-15 11:23:01 -0800845 * @return actual buffer size in frames or a negative error
Phil Burk5ed503c2017-02-01 09:38:15 -0800846 */
Phil Burke2155ef2017-02-24 13:50:29 -0800847AAUDIO_API aaudio_result_t AAudioStream_setBufferSizeInFrames(AAudioStream* stream,
Phil Burke057ca92017-03-28 11:31:34 -0700848 int32_t numFrames);
Phil Burk5ed503c2017-02-01 09:38:15 -0800849
850/**
851 * Query the maximum number of frames that can be filled without blocking.
852 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800853 * @param stream reference provided by AAudioStreamBuilder_openStream()
854 * @return buffer size in frames.
Phil Burk5ed503c2017-02-01 09:38:15 -0800855 */
Phil Burke2155ef2017-02-24 13:50:29 -0800856AAUDIO_API int32_t AAudioStream_getBufferSizeInFrames(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800857
858/**
Phil Burk3316d5e2017-02-15 11:23:01 -0800859 * Query the number of frames that the application should read or write at
860 * one time for optimal performance. It is OK if an application writes
861 * a different number of frames. But the buffer size may need to be larger
862 * in order to avoid underruns or overruns.
Phil Burk5ed503c2017-02-01 09:38:15 -0800863 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800864 * Note that this may or may not match the actual device burst size.
865 * For some endpoints, the burst size can vary dynamically.
866 * But these tend to be devices with high latency.
867 *
868 * @param stream reference provided by AAudioStreamBuilder_openStream()
869 * @return burst size
Phil Burk5ed503c2017-02-01 09:38:15 -0800870 */
Phil Burke2155ef2017-02-24 13:50:29 -0800871AAUDIO_API int32_t AAudioStream_getFramesPerBurst(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800872
873/**
874 * Query maximum buffer capacity in frames.
875 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800876 * @param stream reference provided by AAudioStreamBuilder_openStream()
Phil Burke057ca92017-03-28 11:31:34 -0700877 * @return buffer capacity in frames
Phil Burk5ed503c2017-02-01 09:38:15 -0800878 */
Phil Burke2155ef2017-02-24 13:50:29 -0800879AAUDIO_API int32_t AAudioStream_getBufferCapacityInFrames(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800880
881/**
Phil Burke057ca92017-03-28 11:31:34 -0700882 * Query the size of the buffer that will be passed to the dataProc callback
883 * in the numFrames parameter.
884 *
885 * This call can be used if the application needs to know the value of numFrames before
886 * the stream is started. This is not normally necessary.
887 *
Phil Burked0a3fe2017-12-05 14:27:43 -0800888 * If a specific size was requested by calling AAudioStreamBuilder_setFramesPerDataCallback()
Phil Burke057ca92017-03-28 11:31:34 -0700889 * then this will be the same size.
890 *
Phil Burked0a3fe2017-12-05 14:27:43 -0800891 * If AAudioStreamBuilder_setFramesPerDataCallback() was not called then this will
Phil Burke057ca92017-03-28 11:31:34 -0700892 * return the size chosen by AAudio, or AAUDIO_UNSPECIFIED.
893 *
894 * AAUDIO_UNSPECIFIED indicates that the callback buffer size for this stream
895 * may vary from one dataProc callback to the next.
896 *
897 * @param stream reference provided by AAudioStreamBuilder_openStream()
898 * @return callback buffer size in frames or AAUDIO_UNSPECIFIED
899 */
900AAUDIO_API int32_t AAudioStream_getFramesPerDataCallback(AAudioStream* stream);
901
902/**
Phil Burk5ed503c2017-02-01 09:38:15 -0800903 * An XRun is an Underrun or an Overrun.
904 * During playing, an underrun will occur if the stream is not written in time
905 * and the system runs out of valid data.
906 * During recording, an overrun will occur if the stream is not read in time
907 * and there is no place to put the incoming data so it is discarded.
908 *
909 * An underrun or overrun can cause an audible "pop" or "glitch".
910 *
Phil Burk068c10f2017-05-08 16:36:41 -0700911 * Note that some INPUT devices may not support this function.
912 * In that case a 0 will always be returned.
913 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800914 * @param stream reference provided by AAudioStreamBuilder_openStream()
915 * @return the underrun or overrun count
Phil Burk5ed503c2017-02-01 09:38:15 -0800916 */
Phil Burke2155ef2017-02-24 13:50:29 -0800917AAUDIO_API int32_t AAudioStream_getXRunCount(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800918
919/**
Phil Burk3316d5e2017-02-15 11:23:01 -0800920 * @param stream reference provided by AAudioStreamBuilder_openStream()
921 * @return actual sample rate
Phil Burk5ed503c2017-02-01 09:38:15 -0800922 */
Phil Burke2155ef2017-02-24 13:50:29 -0800923AAUDIO_API int32_t AAudioStream_getSampleRate(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800924
925/**
Phil Burk20523ed2017-04-24 17:04:01 -0700926 * A stream has one or more channels of data.
927 * A frame will contain one sample for each channel.
928 *
929 * @param stream reference provided by AAudioStreamBuilder_openStream()
930 * @return actual number of channels
931 */
932AAUDIO_API int32_t AAudioStream_getChannelCount(AAudioStream* stream);
933
934/**
Phil Burke74240d2017-08-03 15:25:43 -0700935 * Identical to AAudioStream_getChannelCount().
936 *
937 * @param stream reference provided by AAudioStreamBuilder_openStream()
938 * @return actual number of samples frame
939 */
940AAUDIO_API int32_t AAudioStream_getSamplesPerFrame(AAudioStream* stream);
941
942/**
Phil Burk3316d5e2017-02-15 11:23:01 -0800943 * @param stream reference provided by AAudioStreamBuilder_openStream()
Phil Burke2155ef2017-02-24 13:50:29 -0800944 * @return actual device ID
Phil Burk5ed503c2017-02-01 09:38:15 -0800945 */
Phil Burke2155ef2017-02-24 13:50:29 -0800946AAUDIO_API int32_t AAudioStream_getDeviceId(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800947
948/**
Phil Burk3316d5e2017-02-15 11:23:01 -0800949 * @param stream reference provided by AAudioStreamBuilder_openStream()
950 * @return actual data format
Phil Burk5ed503c2017-02-01 09:38:15 -0800951 */
Phil Burk9dca9822017-05-26 14:27:43 -0700952AAUDIO_API aaudio_format_t AAudioStream_getFormat(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800953
954/**
955 * Provide actual sharing mode.
Phil Burk3316d5e2017-02-15 11:23:01 -0800956 * @param stream reference provided by AAudioStreamBuilder_openStream()
957 * @return actual sharing mode
Phil Burk5ed503c2017-02-01 09:38:15 -0800958 */
Phil Burke2155ef2017-02-24 13:50:29 -0800959AAUDIO_API aaudio_sharing_mode_t AAudioStream_getSharingMode(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800960
961/**
Phil Burke2fbb592017-05-01 15:05:52 -0700962 * Get the performance mode used by the stream.
963 *
964 * @param stream reference provided by AAudioStreamBuilder_openStream()
965 */
966AAUDIO_API aaudio_performance_mode_t AAudioStream_getPerformanceMode(AAudioStream* stream);
967
968/**
Phil Burk3316d5e2017-02-15 11:23:01 -0800969 * @param stream reference provided by AAudioStreamBuilder_openStream()
970 * @return direction
Phil Burk5ed503c2017-02-01 09:38:15 -0800971 */
Phil Burke2155ef2017-02-24 13:50:29 -0800972AAUDIO_API aaudio_direction_t AAudioStream_getDirection(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800973
974/**
975 * Passes back the number of frames that have been written since the stream was created.
976 * For an output stream, this will be advanced by the application calling write().
Phil Burk3316d5e2017-02-15 11:23:01 -0800977 * For an input stream, this will be advanced by the endpoint.
Phil Burk5ed503c2017-02-01 09:38:15 -0800978 *
979 * The frame position is monotonically increasing.
980 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800981 * @param stream reference provided by AAudioStreamBuilder_openStream()
982 * @return frames written
Phil Burk5ed503c2017-02-01 09:38:15 -0800983 */
Phil Burke2155ef2017-02-24 13:50:29 -0800984AAUDIO_API int64_t AAudioStream_getFramesWritten(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800985
986/**
987 * Passes back the number of frames that have been read since the stream was created.
Phil Burk3316d5e2017-02-15 11:23:01 -0800988 * For an output stream, this will be advanced by the endpoint.
Phil Burk5ed503c2017-02-01 09:38:15 -0800989 * For an input stream, this will be advanced by the application calling read().
990 *
991 * The frame position is monotonically increasing.
992 *
Phil Burk3316d5e2017-02-15 11:23:01 -0800993 * @param stream reference provided by AAudioStreamBuilder_openStream()
994 * @return frames read
Phil Burk5ed503c2017-02-01 09:38:15 -0800995 */
Phil Burke2155ef2017-02-24 13:50:29 -0800996AAUDIO_API int64_t AAudioStream_getFramesRead(AAudioStream* stream);
Phil Burk5ed503c2017-02-01 09:38:15 -0800997
998/**
999 * Passes back the time at which a particular frame was presented.
1000 * This can be used to synchronize audio with video or MIDI.
1001 * It can also be used to align a recorded stream with a playback stream.
1002 *
1003 * Timestamps are only valid when the stream is in AAUDIO_STREAM_STATE_STARTED.
1004 * AAUDIO_ERROR_INVALID_STATE will be returned if the stream is not started.
1005 * Note that because requestStart() is asynchronous, timestamps will not be valid until
1006 * a short time after calling requestStart().
1007 * So AAUDIO_ERROR_INVALID_STATE should not be considered a fatal error.
1008 * Just try calling again later.
1009 *
1010 * If an error occurs, then the position and time will not be modified.
1011 *
1012 * The position and time passed back are monotonically increasing.
1013 *
Phil Burk3316d5e2017-02-15 11:23:01 -08001014 * @param stream reference provided by AAudioStreamBuilder_openStream()
Phil Burkec159502017-07-25 17:33:47 -07001015 * @param clockid CLOCK_MONOTONIC or CLOCK_BOOTTIME
Phil Burk5ed503c2017-02-01 09:38:15 -08001016 * @param framePosition pointer to a variable to receive the position
1017 * @param timeNanoseconds pointer to a variable to receive the time
1018 * @return AAUDIO_OK or a negative error
1019 */
Phil Burke2155ef2017-02-24 13:50:29 -08001020AAUDIO_API aaudio_result_t AAudioStream_getTimestamp(AAudioStream* stream,
Phil Burk3316d5e2017-02-15 11:23:01 -08001021 clockid_t clockid,
1022 int64_t *framePosition,
1023 int64_t *timeNanoseconds);
Phil Burk5ed503c2017-02-01 09:38:15 -08001024
Phil Burk361b1422017-12-20 14:24:16 -08001025/**
1026 * Return the use case for the stream.
1027 *
1028 * @param stream reference provided by AAudioStreamBuilder_openStream()
1029 * @return frames read
1030 */
1031AAUDIO_API aaudio_usage_t AAudioStream_getUsage(AAudioStream* stream);
1032
1033/**
1034 * Return the content type for the stream.
1035 *
1036 * @param stream reference provided by AAudioStreamBuilder_openStream()
1037 * @return content type, for example AAUDIO_CONTENT_TYPE_MUSIC
1038 */
1039AAUDIO_API aaudio_content_type_t AAudioStream_getContentType(AAudioStream* stream);
1040
1041/**
1042 * Return the input preset for the stream.
1043 *
1044 * @param stream reference provided by AAudioStreamBuilder_openStream()
1045 * @return input preset, for example AAUDIO_INPUT_PRESET_CAMCORDER
1046 */
1047AAUDIO_API aaudio_input_preset_t AAudioStream_getInputPreset(AAudioStream* stream);
1048
Phil Burk5ed503c2017-02-01 09:38:15 -08001049#ifdef __cplusplus
1050}
1051#endif
1052
1053#endif //AAUDIO_AAUDIO_H
Phil Burka45be8b2017-04-05 14:45:48 -07001054
1055/** @} */