• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 /**
18  * @addtogroup Audio
19  * @{
20  */
21 
22 /**
23  * @file AAudio.h
24  */
25 
26 /**
27  * This is the 'C' API for AAudio.
28  */
29 #ifndef AAUDIO_AAUDIO_H
30 #define AAUDIO_AAUDIO_H
31 
32 #include <time.h>
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 /**
39  * This is used to represent a value that has not been specified.
40  * For example, an application could use {@link #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
45 
46 enum {
47     /**
48      * Audio data will travel out of the device, for example through a speaker.
49      */
50     AAUDIO_DIRECTION_OUTPUT,
51 
52 
53     /**
54      * Audio data will travel into the device, for example from a microphone.
55      */
56     AAUDIO_DIRECTION_INPUT
57 };
58 typedef int32_t aaudio_direction_t;
59 
60 enum {
61     AAUDIO_FORMAT_INVALID = -1,
62     AAUDIO_FORMAT_UNSPECIFIED = 0,
63 
64     /**
65      * This format uses the int16_t data type.
66      * The maximum range of the data is -32768 to 32767.
67      */
68     AAUDIO_FORMAT_PCM_I16,
69 
70     /**
71      * This format uses the float data type.
72      * The nominal range of the data is [-1.0f, 1.0f).
73      * Values outside that range may be clipped.
74      *
75      * See also 'floatData' at
76      * https://developer.android.com/reference/android/media/AudioTrack#write(float[],%20int,%20int,%20int)
77      */
78     AAUDIO_FORMAT_PCM_FLOAT
79 };
80 typedef int32_t aaudio_format_t;
81 
82 /**
83  * These result codes are returned from AAudio functions to indicate success or failure.
84  * Note that error return codes may change in the future so applications should generally
85  * not rely on specific return codes.
86  */
87 enum {
88     /**
89      * The call was successful.
90      */
91     AAUDIO_OK,
92     AAUDIO_ERROR_BASE = -900, // TODO review
93 
94     /**
95      * The audio device was disconnected. This could occur, for example, when headphones
96      * are plugged in or unplugged. The stream cannot be used after the device is disconnected.
97      * Applications should stop and close the stream.
98      * If this error is received in an error callback then another thread should be
99      * used to stop and close the stream.
100      */
101     AAUDIO_ERROR_DISCONNECTED,
102 
103     /**
104      * An invalid parameter was passed to AAudio.
105      */
106     AAUDIO_ERROR_ILLEGAL_ARGUMENT,
107     // reserved
108     AAUDIO_ERROR_INTERNAL = AAUDIO_ERROR_ILLEGAL_ARGUMENT + 2,
109 
110     /**
111      * The requested operation is not appropriate for the current state of AAudio.
112      */
113     AAUDIO_ERROR_INVALID_STATE,
114     // reserved
115     // reserved
116     /* The server rejected the handle used to identify the stream.
117      */
118     AAUDIO_ERROR_INVALID_HANDLE = AAUDIO_ERROR_INVALID_STATE + 3,
119     // reserved
120 
121     /**
122      * The function is not implemented for this stream.
123      */
124     AAUDIO_ERROR_UNIMPLEMENTED = AAUDIO_ERROR_INVALID_HANDLE + 2,
125 
126     /**
127      * A resource or information is unavailable.
128      * This could occur when an application tries to open too many streams,
129      * or a timestamp is not available.
130      */
131     AAUDIO_ERROR_UNAVAILABLE,
132     AAUDIO_ERROR_NO_FREE_HANDLES,
133 
134     /**
135      * Memory could not be allocated.
136      */
137     AAUDIO_ERROR_NO_MEMORY,
138 
139     /**
140      * A NULL pointer was passed to AAudio.
141      * Or a NULL pointer was detected internally.
142      */
143     AAUDIO_ERROR_NULL,
144 
145     /**
146      * An operation took longer than expected.
147      */
148     AAUDIO_ERROR_TIMEOUT,
149     AAUDIO_ERROR_WOULD_BLOCK,
150 
151     /**
152      * The requested data format is not supported.
153      */
154     AAUDIO_ERROR_INVALID_FORMAT,
155 
156     /**
157      * A requested was out of range.
158      */
159     AAUDIO_ERROR_OUT_OF_RANGE,
160 
161     /**
162      * The audio service was not available.
163      */
164     AAUDIO_ERROR_NO_SERVICE,
165 
166     /**
167      * The requested sample rate was not supported.
168      */
169     AAUDIO_ERROR_INVALID_RATE
170 };
171 typedef int32_t  aaudio_result_t;
172 
173 enum
174 {
175     AAUDIO_STREAM_STATE_UNINITIALIZED = 0,
176     AAUDIO_STREAM_STATE_UNKNOWN,
177     AAUDIO_STREAM_STATE_OPEN,
178     AAUDIO_STREAM_STATE_STARTING,
179     AAUDIO_STREAM_STATE_STARTED,
180     AAUDIO_STREAM_STATE_PAUSING,
181     AAUDIO_STREAM_STATE_PAUSED,
182     AAUDIO_STREAM_STATE_FLUSHING,
183     AAUDIO_STREAM_STATE_FLUSHED,
184     AAUDIO_STREAM_STATE_STOPPING,
185     AAUDIO_STREAM_STATE_STOPPED,
186     AAUDIO_STREAM_STATE_CLOSING,
187     AAUDIO_STREAM_STATE_CLOSED,
188     AAUDIO_STREAM_STATE_DISCONNECTED
189 };
190 typedef int32_t aaudio_stream_state_t;
191 
192 
193 enum {
194     /**
195      * This will be the only stream using a particular source or sink.
196      * This mode will provide the lowest possible latency.
197      * You should close EXCLUSIVE streams immediately when you are not using them.
198      */
199             AAUDIO_SHARING_MODE_EXCLUSIVE,
200     /**
201      * Multiple applications will be mixed by the AAudio Server.
202      * This will have higher latency than the EXCLUSIVE mode.
203      */
204             AAUDIO_SHARING_MODE_SHARED
205 };
206 typedef int32_t aaudio_sharing_mode_t;
207 
208 
209 enum {
210     /**
211      * No particular performance needs. Default.
212      */
213     AAUDIO_PERFORMANCE_MODE_NONE = 10,
214 
215     /**
216      * Extending battery life is more important than low latency.
217      *
218      * This mode is not supported in input streams.
219      * For input, mode NONE will be used if this is requested.
220      */
221     AAUDIO_PERFORMANCE_MODE_POWER_SAVING,
222 
223     /**
224      * Reducing latency is more important than battery life.
225      */
226     AAUDIO_PERFORMANCE_MODE_LOW_LATENCY
227 };
228 typedef int32_t aaudio_performance_mode_t;
229 
230 /**
231  * The USAGE attribute expresses "why" you are playing a sound, what is this sound used for.
232  * This information is used by certain platforms or routing policies
233  * to make more refined volume or routing decisions.
234  *
235  * Note that these match the equivalent values in {@link android.media.AudioAttributes}
236  * in the Android Java API.
237  *
238  * Added in API level 28.
239  */
240 enum {
241     /**
242      * Use this for streaming media, music performance, video, podcasts, etcetera.
243      */
244     AAUDIO_USAGE_MEDIA = 1,
245 
246     /**
247      * Use this for voice over IP, telephony, etcetera.
248      */
249     AAUDIO_USAGE_VOICE_COMMUNICATION = 2,
250 
251     /**
252      * Use this for sounds associated with telephony such as busy tones, DTMF, etcetera.
253      */
254     AAUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING = 3,
255 
256     /**
257      * Use this to demand the users attention.
258      */
259     AAUDIO_USAGE_ALARM = 4,
260 
261     /**
262      * Use this for notifying the user when a message has arrived or some
263      * other background event has occured.
264      */
265     AAUDIO_USAGE_NOTIFICATION = 5,
266 
267     /**
268      * Use this when the phone rings.
269      */
270     AAUDIO_USAGE_NOTIFICATION_RINGTONE = 6,
271 
272     /**
273      * Use this to attract the users attention when, for example, the battery is low.
274      */
275     AAUDIO_USAGE_NOTIFICATION_EVENT = 10,
276 
277     /**
278      * Use this for screen readers, etcetera.
279      */
280     AAUDIO_USAGE_ASSISTANCE_ACCESSIBILITY = 11,
281 
282     /**
283      * Use this for driving or navigation directions.
284      */
285     AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12,
286 
287     /**
288      * Use this for user interface sounds, beeps, etcetera.
289      */
290     AAUDIO_USAGE_ASSISTANCE_SONIFICATION = 13,
291 
292     /**
293      * Use this for game audio and sound effects.
294      */
295     AAUDIO_USAGE_GAME = 14,
296 
297     /**
298      * Use this for audio responses to user queries, audio instructions or help utterances.
299      */
300     AAUDIO_USAGE_ASSISTANT = 16
301 };
302 typedef int32_t aaudio_usage_t;
303 
304 /**
305  * The CONTENT_TYPE attribute describes "what" you are playing.
306  * It expresses the general category of the content. This information is optional.
307  * But in case it is known (for instance AAUDIO_CONTENT_TYPE_MOVIE for a
308  * movie streaming service or AAUDIO_CONTENT_TYPE_SPEECH for
309  * an audio book application) this information might be used by the audio framework to
310  * enforce audio focus.
311  *
312  * Note that these match the equivalent values in {@link android.media.AudioAttributes}
313  * in the Android Java API.
314  *
315  * Added in API level 28.
316  */
317 enum {
318 
319     /**
320      * Use this for spoken voice, audio books, etcetera.
321      */
322     AAUDIO_CONTENT_TYPE_SPEECH = 1,
323 
324     /**
325      * Use this for pre-recorded or live music.
326      */
327     AAUDIO_CONTENT_TYPE_MUSIC = 2,
328 
329     /**
330      * Use this for a movie or video soundtrack.
331      */
332     AAUDIO_CONTENT_TYPE_MOVIE = 3,
333 
334     /**
335      * Use this for sound is designed to accompany a user action,
336      * such as a click or beep sound made when the user presses a button.
337      */
338     AAUDIO_CONTENT_TYPE_SONIFICATION = 4
339 };
340 typedef int32_t aaudio_content_type_t;
341 
342 /**
343  * Defines the audio source.
344  * An audio source defines both a default physical source of audio signal, and a recording
345  * configuration.
346  *
347  * Note that these match the equivalent values in MediaRecorder.AudioSource in the Android Java API.
348  *
349  * Added in API level 28.
350  */
351 enum {
352     /**
353      * Use this preset when other presets do not apply.
354      */
355     AAUDIO_INPUT_PRESET_GENERIC = 1,
356 
357     /**
358      * Use this preset when recording video.
359      */
360     AAUDIO_INPUT_PRESET_CAMCORDER = 5,
361 
362     /**
363      * Use this preset when doing speech recognition.
364      */
365     AAUDIO_INPUT_PRESET_VOICE_RECOGNITION = 6,
366 
367     /**
368      * Use this preset when doing telephony or voice messaging.
369      */
370     AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION = 7,
371 
372     /**
373      * Use this preset to obtain an input with no effects.
374      * Note that this input will not have automatic gain control
375      * so the recorded volume may be very low.
376      */
377     AAUDIO_INPUT_PRESET_UNPROCESSED = 9,
378 
379     /**
380      * Use this preset for capturing audio meant to be processed in real time
381      * and played back for live performance (e.g karaoke).
382      * The capture path will minimize latency and coupling with playback path.
383      */
384     AAUDIO_INPUT_PRESET_VOICE_PERFORMANCE = 10,
385 };
386 typedef int32_t aaudio_input_preset_t;
387 
388 /**
389  * Specifying if audio may or may not be captured by other apps or the system.
390  *
391  * Note that these match the equivalent values in {@link android.media.AudioAttributes}
392  * in the Android Java API.
393  *
394  * Added in API level 29.
395  */
396 enum {
397     /**
398      * Indicates that the audio may be captured by any app.
399      *
400      * For privacy, the following usages can not be recorded: AAUDIO_VOICE_COMMUNICATION*,
401      * AAUDIO_USAGE_NOTIFICATION*, AAUDIO_USAGE_ASSISTANCE* and {@link #AAUDIO_USAGE_ASSISTANT}.
402      *
403      * On {@link android.os.Build.VERSION_CODES#Q}, this means only {@link #AAUDIO_USAGE_MEDIA}
404      * and {@link #AAUDIO_USAGE_GAME} may be captured.
405      *
406      * See {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_ALL}.
407      */
408     AAUDIO_ALLOW_CAPTURE_BY_ALL = 1,
409     /**
410      * Indicates that the audio may only be captured by system apps.
411      *
412      * System apps can capture for many purposes like accessibility, user guidance...
413      * but have strong restriction. See
414      * {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_SYSTEM} for what the system apps
415      * can do with the capture audio.
416      */
417     AAUDIO_ALLOW_CAPTURE_BY_SYSTEM = 2,
418     /**
419      * Indicates that the audio may not be recorded by any app, even if it is a system app.
420      *
421      * It is encouraged to use {@link #AAUDIO_ALLOW_CAPTURE_BY_SYSTEM} instead of this value as system apps
422      * provide significant and useful features for the user (eg. accessibility).
423      * See {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_NONE}.
424      */
425     AAUDIO_ALLOW_CAPTURE_BY_NONE = 3,
426 };
427 
428 typedef int32_t aaudio_allowed_capture_policy_t;
429 
430 /**
431  * These may be used with AAudioStreamBuilder_setSessionId().
432  *
433  * Added in API level 28.
434  */
435 enum {
436     /**
437      * Do not allocate a session ID.
438      * Effects cannot be used with this stream.
439      * Default.
440      *
441      * Added in API level 28.
442      */
443     AAUDIO_SESSION_ID_NONE = -1,
444 
445     /**
446      * Allocate a session ID that can be used to attach and control
447      * effects using the Java AudioEffects API.
448      * Note that using this may result in higher latency.
449      *
450      * Note that this matches the value of AudioManager.AUDIO_SESSION_ID_GENERATE.
451      *
452      * Added in API level 28.
453      */
454     AAUDIO_SESSION_ID_ALLOCATE = 0,
455 };
456 typedef int32_t aaudio_session_id_t;
457 
458 typedef struct AAudioStreamStruct         AAudioStream;
459 typedef struct AAudioStreamBuilderStruct  AAudioStreamBuilder;
460 
461 #ifndef AAUDIO_API
462 #define AAUDIO_API /* export this symbol */
463 #endif
464 
465 // ============================================================
466 // Audio System
467 // ============================================================
468 
469 /**
470  * The text is the ASCII symbol corresponding to the returnCode,
471  * or an English message saying the returnCode is unrecognized.
472  * This is intended for developers to use when debugging.
473  * It is not for display to users.
474  *
475  * @return pointer to a text representation of an AAudio result code.
476  */
477 AAUDIO_API const char * AAudio_convertResultToText(aaudio_result_t returnCode) __INTRODUCED_IN(26);
478 
479 /**
480  * The text is the ASCII symbol corresponding to the stream state,
481  * or an English message saying the state is unrecognized.
482  * This is intended for developers to use when debugging.
483  * It is not for display to users.
484  *
485  * @return pointer to a text representation of an AAudio state.
486  */
487 AAUDIO_API const char * AAudio_convertStreamStateToText(aaudio_stream_state_t state)
488         __INTRODUCED_IN(26);
489 
490 // ============================================================
491 // StreamBuilder
492 // ============================================================
493 
494 /**
495  * Create a StreamBuilder that can be used to open a Stream.
496  *
497  * The deviceId is initially unspecified, meaning that the current default device will be used.
498  *
499  * The default direction is {@link #AAUDIO_DIRECTION_OUTPUT}.
500  * The default sharing mode is {@link #AAUDIO_SHARING_MODE_SHARED}.
501  * The data format, samplesPerFrames and sampleRate are unspecified and will be
502  * chosen by the device when it is opened.
503  *
504  * AAudioStreamBuilder_delete() must be called when you are done using the builder.
505  */
506 AAUDIO_API aaudio_result_t AAudio_createStreamBuilder(AAudioStreamBuilder** builder)
507         __INTRODUCED_IN(26);
508 
509 /**
510  * Request an audio device identified device using an ID.
511  * On Android, for example, the ID could be obtained from the Java AudioManager.
512  *
513  * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED},
514  * in which case the primary device will be used.
515  *
516  * @param builder reference provided by AAudio_createStreamBuilder()
517  * @param deviceId device identifier or {@link #AAUDIO_UNSPECIFIED}
518  */
519 AAUDIO_API void AAudioStreamBuilder_setDeviceId(AAudioStreamBuilder* builder,
520                                                 int32_t deviceId) __INTRODUCED_IN(26);
521 
522 /**
523  * Request a sample rate in Hertz.
524  *
525  * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}.
526  * An optimal value will then be chosen when the stream is opened.
527  * After opening a stream with an unspecified value, the application must
528  * query for the actual value, which may vary by device.
529  *
530  * If an exact value is specified then an opened stream will use that value.
531  * If a stream cannot be opened with the specified value then the open will fail.
532  *
533  * @param builder reference provided by AAudio_createStreamBuilder()
534  * @param sampleRate frames per second. Common rates include 44100 and 48000 Hz.
535  */
536 AAUDIO_API void AAudioStreamBuilder_setSampleRate(AAudioStreamBuilder* builder,
537                                                   int32_t sampleRate) __INTRODUCED_IN(26);
538 
539 /**
540  * Request a number of channels for the stream.
541  *
542  * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}.
543  * An optimal value will then be chosen when the stream is opened.
544  * After opening a stream with an unspecified value, the application must
545  * query for the actual value, which may vary by device.
546  *
547  * If an exact value is specified then an opened stream will use that value.
548  * If a stream cannot be opened with the specified value then the open will fail.
549  *
550  * @param builder reference provided by AAudio_createStreamBuilder()
551  * @param channelCount Number of channels desired.
552  */
553 AAUDIO_API void AAudioStreamBuilder_setChannelCount(AAudioStreamBuilder* builder,
554                                                     int32_t channelCount) __INTRODUCED_IN(26);
555 
556 /**
557  * Identical to AAudioStreamBuilder_setChannelCount().
558  *
559  * @param builder reference provided by AAudio_createStreamBuilder()
560  * @param samplesPerFrame Number of samples in a frame.
561  */
562 AAUDIO_API void AAudioStreamBuilder_setSamplesPerFrame(AAudioStreamBuilder* builder,
563                                                        int32_t samplesPerFrame) __INTRODUCED_IN(26);
564 
565 /**
566  * Request a sample data format, for example {@link #AAUDIO_FORMAT_PCM_I16}.
567  *
568  * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}.
569  * An optimal value will then be chosen when the stream is opened.
570  * After opening a stream with an unspecified value, the application must
571  * query for the actual value, which may vary by device.
572  *
573  * If an exact value is specified then an opened stream will use that value.
574  * If a stream cannot be opened with the specified value then the open will fail.
575  *
576  * @param builder reference provided by AAudio_createStreamBuilder()
577  * @param format common formats are {@link #AAUDIO_FORMAT_PCM_FLOAT} and
578  *               {@link #AAUDIO_FORMAT_PCM_I16}.
579  */
580 AAUDIO_API void AAudioStreamBuilder_setFormat(AAudioStreamBuilder* builder,
581                                               aaudio_format_t format) __INTRODUCED_IN(26);
582 
583 /**
584  * Request a mode for sharing the device.
585  *
586  * The default, if you do not call this function, is {@link #AAUDIO_SHARING_MODE_SHARED}.
587  *
588  * The requested sharing mode may not be available.
589  * The application can query for the actual mode after the stream is opened.
590  *
591  * @param builder reference provided by AAudio_createStreamBuilder()
592  * @param sharingMode {@link #AAUDIO_SHARING_MODE_SHARED} or {@link #AAUDIO_SHARING_MODE_EXCLUSIVE}
593  */
594 AAUDIO_API void AAudioStreamBuilder_setSharingMode(AAudioStreamBuilder* builder,
595         aaudio_sharing_mode_t sharingMode) __INTRODUCED_IN(26);
596 
597 /**
598  * Request the direction for a stream.
599  *
600  * The default, if you do not call this function, is {@link #AAUDIO_DIRECTION_OUTPUT}.
601  *
602  * @param builder reference provided by AAudio_createStreamBuilder()
603  * @param direction {@link #AAUDIO_DIRECTION_OUTPUT} or {@link #AAUDIO_DIRECTION_INPUT}
604  */
605 AAUDIO_API void AAudioStreamBuilder_setDirection(AAudioStreamBuilder* builder,
606         aaudio_direction_t direction) __INTRODUCED_IN(26);
607 
608 /**
609  * Set the requested buffer capacity in frames.
610  * The final AAudioStream capacity may differ, but will probably be at least this big.
611  *
612  * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}.
613  *
614  * @param builder reference provided by AAudio_createStreamBuilder()
615  * @param numFrames the desired buffer capacity in frames or {@link #AAUDIO_UNSPECIFIED}
616  */
617 AAUDIO_API void AAudioStreamBuilder_setBufferCapacityInFrames(AAudioStreamBuilder* builder,
618         int32_t numFrames) __INTRODUCED_IN(26);
619 
620 /**
621  * Set the requested performance mode.
622  *
623  * Supported modes are {@link #AAUDIO_PERFORMANCE_MODE_NONE},
624  * {@link #AAUDIO_PERFORMANCE_MODE_POWER_SAVING} * and {@link #AAUDIO_PERFORMANCE_MODE_LOW_LATENCY}.
625  *
626  * The default, if you do not call this function, is {@link #AAUDIO_PERFORMANCE_MODE_NONE}.
627  *
628  * You may not get the mode you requested.
629  * You can call AAudioStream_getPerformanceMode()
630  * to find out the final mode for the stream.
631  *
632  * @param builder reference provided by AAudio_createStreamBuilder()
633  * @param mode the desired performance mode, eg. {@link #AAUDIO_PERFORMANCE_MODE_LOW_LATENCY}
634  */
635 AAUDIO_API void AAudioStreamBuilder_setPerformanceMode(AAudioStreamBuilder* builder,
636         aaudio_performance_mode_t mode) __INTRODUCED_IN(26);
637 
638 /**
639  * Set the intended use case for the stream.
640  *
641  * The AAudio system will use this information to optimize the
642  * behavior of the stream.
643  * This could, for example, affect how volume and focus is handled for the stream.
644  *
645  * The default, if you do not call this function, is {@link #AAUDIO_USAGE_MEDIA}.
646  *
647  * Added in API level 28.
648  *
649  * @param builder reference provided by AAudio_createStreamBuilder()
650  * @param usage the desired usage, eg. {@link #AAUDIO_USAGE_GAME}
651  */
652 AAUDIO_API void AAudioStreamBuilder_setUsage(AAudioStreamBuilder* builder,
653         aaudio_usage_t usage) __INTRODUCED_IN(28);
654 
655 /**
656  * Set the type of audio data that the stream will carry.
657  *
658  * The AAudio system will use this information to optimize the
659  * behavior of the stream.
660  * This could, for example, affect whether a stream is paused when a notification occurs.
661  *
662  * The default, if you do not call this function, is {@link #AAUDIO_CONTENT_TYPE_MUSIC}.
663  *
664  * Added in API level 28.
665  *
666  * @param builder reference provided by AAudio_createStreamBuilder()
667  * @param contentType the type of audio data, eg. {@link #AAUDIO_CONTENT_TYPE_SPEECH}
668  */
669 AAUDIO_API void AAudioStreamBuilder_setContentType(AAudioStreamBuilder* builder,
670         aaudio_content_type_t contentType) __INTRODUCED_IN(28);
671 
672 /**
673  * Set the input (capture) preset for the stream.
674  *
675  * The AAudio system will use this information to optimize the
676  * behavior of the stream.
677  * This could, for example, affect which microphones are used and how the
678  * recorded data is processed.
679  *
680  * The default, if you do not call this function, is {@link #AAUDIO_INPUT_PRESET_VOICE_RECOGNITION}.
681  * That is because VOICE_RECOGNITION is the preset with the lowest latency
682  * on many platforms.
683  *
684  * Added in API level 28.
685  *
686  * @param builder reference provided by AAudio_createStreamBuilder()
687  * @param inputPreset the desired configuration for recording
688  */
689 AAUDIO_API void AAudioStreamBuilder_setInputPreset(AAudioStreamBuilder* builder,
690         aaudio_input_preset_t inputPreset) __INTRODUCED_IN(28);
691 
692 /**
693  * Specify whether this stream audio may or may not be captured by other apps or the system.
694  *
695  * The default is {@link #AAUDIO_ALLOW_CAPTURE_BY_ALL}.
696  *
697  * Note that an application can also set its global policy, in which case the most restrictive
698  * policy is always applied. See {@link android.media.AudioAttributes#setAllowedCapturePolicy(int)}
699  *
700  * Added in API level 29.
701  *
702  * @param builder reference provided by AAudio_createStreamBuilder()
703  * @param inputPreset the desired level of opt-out from being captured.
704  */
705 AAUDIO_API void AAudioStreamBuilder_setAllowedCapturePolicy(AAudioStreamBuilder* builder,
706         aaudio_allowed_capture_policy_t capturePolicy) __INTRODUCED_IN(29);
707 
708 /** Set the requested session ID.
709  *
710  * The session ID can be used to associate a stream with effects processors.
711  * The effects are controlled using the Android AudioEffect Java API.
712  *
713  * The default, if you do not call this function, is {@link #AAUDIO_SESSION_ID_NONE}.
714  *
715  * If set to {@link #AAUDIO_SESSION_ID_ALLOCATE} then a session ID will be allocated
716  * when the stream is opened.
717  *
718  * The allocated session ID can be obtained by calling AAudioStream_getSessionId()
719  * and then used with this function when opening another stream.
720  * This allows effects to be shared between streams.
721  *
722  * Session IDs from AAudio can be used with the Android Java APIs and vice versa.
723  * So a session ID from an AAudio stream can be passed to Java
724  * and effects applied using the Java AudioEffect API.
725  *
726  * Note that allocating or setting a session ID may result in a stream with higher latency.
727  *
728  * Allocated session IDs will always be positive and nonzero.
729  *
730  * Added in API level 28.
731  *
732  * @param builder reference provided by AAudio_createStreamBuilder()
733  * @param sessionId an allocated sessionID or {@link #AAUDIO_SESSION_ID_ALLOCATE}
734  */
735 AAUDIO_API void AAudioStreamBuilder_setSessionId(AAudioStreamBuilder* builder,
736         aaudio_session_id_t sessionId) __INTRODUCED_IN(28);
737 
738 /**
739  * Return one of these values from the data callback function.
740  */
741 enum {
742 
743     /**
744      * Continue calling the callback.
745      */
746     AAUDIO_CALLBACK_RESULT_CONTINUE = 0,
747 
748     /**
749      * Stop calling the callback.
750      *
751      * The application will still need to call AAudioStream_requestPause()
752      * or AAudioStream_requestStop().
753      */
754     AAUDIO_CALLBACK_RESULT_STOP,
755 
756 };
757 typedef int32_t aaudio_data_callback_result_t;
758 
759 /**
760  * Prototype for the data function that is passed to AAudioStreamBuilder_setDataCallback().
761  *
762  * For an output stream, this function should render and write numFrames of data
763  * in the streams current data format to the audioData buffer.
764  *
765  * For an input stream, this function should read and process numFrames of data
766  * from the audioData buffer.
767  *
768  * The audio data is passed through the buffer. So do NOT call AAudioStream_read() or
769  * AAudioStream_write() on the stream that is making the callback.
770  *
771  * Note that numFrames can vary unless AAudioStreamBuilder_setFramesPerDataCallback()
772  * is called.
773  *
774  * Also note that this callback function should be considered a "real-time" function.
775  * It must not do anything that could cause an unbounded delay because that can cause the
776  * audio to glitch or pop.
777  *
778  * These are things the function should NOT do:
779  * <ul>
780  * <li>allocate memory using, for example, malloc() or new</li>
781  * <li>any file operations such as opening, closing, reading or writing</li>
782  * <li>any network operations such as streaming</li>
783  * <li>use any mutexes or other synchronization primitives</li>
784  * <li>sleep</li>
785  * <li>stop or close the stream</li>
786  * <li>AAudioStream_read()</li>
787  * <li>AAudioStream_write()</li>
788  * </ul>
789  *
790  * The following are OK to call from the data callback:
791  * <ul>
792  * <li>AAudioStream_get*()</li>
793  * <li>AAudio_convertResultToText()</li>
794  * </ul>
795  *
796  * If you need to move data, eg. MIDI commands, in or out of the callback function then
797  * we recommend the use of non-blocking techniques such as an atomic FIFO.
798  *
799  * @param stream reference provided by AAudioStreamBuilder_openStream()
800  * @param userData the same address that was passed to AAudioStreamBuilder_setCallback()
801  * @param audioData a pointer to the audio data
802  * @param numFrames the number of frames to be processed, which can vary
803  * @return AAUDIO_CALLBACK_RESULT_*
804  */
805 typedef aaudio_data_callback_result_t (*AAudioStream_dataCallback)(
806         AAudioStream *stream,
807         void *userData,
808         void *audioData,
809         int32_t numFrames);
810 
811 /**
812  * Request that AAudio call this functions when the stream is running.
813  *
814  * Note that when using this callback, the audio data will be passed in or out
815  * of the function as an argument.
816  * So you cannot call AAudioStream_write() or AAudioStream_read()
817  * on the same stream that has an active data callback.
818  *
819  * The callback function will start being called after AAudioStream_requestStart()
820  * is called.
821  * It will stop being called after AAudioStream_requestPause() or
822  * AAudioStream_requestStop() is called.
823  *
824  * This callback function will be called on a real-time thread owned by AAudio. See
825  * {@link #AAudioStream_dataCallback} for more information.
826  *
827  * Note that the AAudio callbacks will never be called simultaneously from multiple threads.
828  *
829  * @param builder reference provided by AAudio_createStreamBuilder()
830  * @param callback pointer to a function that will process audio data.
831  * @param userData pointer to an application data structure that will be passed
832  *          to the callback functions.
833  */
834 AAUDIO_API void AAudioStreamBuilder_setDataCallback(AAudioStreamBuilder* builder,
835         AAudioStream_dataCallback callback, void *userData) __INTRODUCED_IN(26);
836 
837 /**
838  * Set the requested data callback buffer size in frames.
839  * See {@link #AAudioStream_dataCallback}.
840  *
841  * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}.
842  *
843  * For the lowest possible latency, do not call this function. AAudio will then
844  * call the dataProc callback function with whatever size is optimal.
845  * That size may vary from one callback to another.
846  *
847  * Only use this function if the application requires a specific number of frames for processing.
848  * The application might, for example, be using an FFT that requires
849  * a specific power-of-two sized buffer.
850  *
851  * AAudio may need to add additional buffering in order to adapt between the internal
852  * buffer size and the requested buffer size.
853  *
854  * If you do call this function then the requested size should be less than
855  * half the buffer capacity, to allow double buffering.
856  *
857  * @param builder reference provided by AAudio_createStreamBuilder()
858  * @param numFrames the desired buffer size in frames or {@link #AAUDIO_UNSPECIFIED}
859  */
860 AAUDIO_API void AAudioStreamBuilder_setFramesPerDataCallback(AAudioStreamBuilder* builder,
861                                                              int32_t numFrames) __INTRODUCED_IN(26);
862 
863 /**
864  * Prototype for the callback function that is passed to
865  * AAudioStreamBuilder_setErrorCallback().
866  *
867  * The following may NOT be called from the error callback:
868  * <ul>
869  * <li>AAudioStream_requestStop()</li>
870  * <li>AAudioStream_requestPause()</li>
871  * <li>AAudioStream_close()</li>
872  * <li>AAudioStream_waitForStateChange()</li>
873  * <li>AAudioStream_read()</li>
874  * <li>AAudioStream_write()</li>
875  * </ul>
876  *
877  * The following are OK to call from the error callback:
878  * <ul>
879  * <li>AAudioStream_get*()</li>
880  * <li>AAudio_convertResultToText()</li>
881  * </ul>
882  *
883  * @param stream reference provided by AAudioStreamBuilder_openStream()
884  * @param userData the same address that was passed to AAudioStreamBuilder_setErrorCallback()
885  * @param error an AAUDIO_ERROR_* value.
886  */
887 typedef void (*AAudioStream_errorCallback)(
888         AAudioStream *stream,
889         void *userData,
890         aaudio_result_t error);
891 
892 /**
893  * Request that AAudio call this function if any error occurs or the stream is disconnected.
894  *
895  * It will be called, for example, if a headset or a USB device is unplugged causing the stream's
896  * device to be unavailable or "disconnected".
897  * Another possible cause of error would be a timeout or an unanticipated internal error.
898  *
899  * In response, this function should signal or create another thread to stop
900  * and close this stream. The other thread could then reopen a stream on another device.
901  * Do not stop or close the stream, or reopen the new stream, directly from this callback.
902  *
903  * This callback will not be called because of actions by the application, such as stopping
904  * or closing a stream.
905  *
906  * Note that the AAudio callbacks will never be called simultaneously from multiple threads.
907  *
908  * @param builder reference provided by AAudio_createStreamBuilder()
909  * @param callback pointer to a function that will be called if an error occurs.
910  * @param userData pointer to an application data structure that will be passed
911  *          to the callback functions.
912  */
913 AAUDIO_API void AAudioStreamBuilder_setErrorCallback(AAudioStreamBuilder* builder,
914         AAudioStream_errorCallback callback, void *userData) __INTRODUCED_IN(26);
915 
916 /**
917  * Open a stream based on the options in the StreamBuilder.
918  *
919  * AAudioStream_close() must be called when finished with the stream to recover
920  * the memory and to free the associated resources.
921  *
922  * @param builder reference provided by AAudio_createStreamBuilder()
923  * @param stream pointer to a variable to receive the new stream reference
924  * @return {@link #AAUDIO_OK} or a negative error.
925  */
926 AAUDIO_API aaudio_result_t  AAudioStreamBuilder_openStream(AAudioStreamBuilder* builder,
927         AAudioStream** stream) __INTRODUCED_IN(26);
928 
929 /**
930  * Delete the resources associated with the StreamBuilder.
931  *
932  * @param builder reference provided by AAudio_createStreamBuilder()
933  * @return {@link #AAUDIO_OK} or a negative error.
934  */
935 AAUDIO_API aaudio_result_t  AAudioStreamBuilder_delete(AAudioStreamBuilder* builder)
936     __INTRODUCED_IN(26);
937 
938 // ============================================================
939 // Stream Control
940 // ============================================================
941 
942 /**
943  * Free the resources associated with a stream created by AAudioStreamBuilder_openStream()
944  *
945  * @param stream reference provided by AAudioStreamBuilder_openStream()
946  * @return {@link #AAUDIO_OK} or a negative error.
947  */
948 AAUDIO_API aaudio_result_t  AAudioStream_close(AAudioStream* stream) __INTRODUCED_IN(26);
949 
950 /**
951  * Asynchronously request to start playing the stream. For output streams, one should
952  * write to the stream to fill the buffer before starting.
953  * Otherwise it will underflow.
954  * After this call the state will be in {@link #AAUDIO_STREAM_STATE_STARTING} or
955  * {@link #AAUDIO_STREAM_STATE_STARTED}.
956  *
957  * @param stream reference provided by AAudioStreamBuilder_openStream()
958  * @return {@link #AAUDIO_OK} or a negative error.
959  */
960 AAUDIO_API aaudio_result_t  AAudioStream_requestStart(AAudioStream* stream) __INTRODUCED_IN(26);
961 
962 /**
963  * Asynchronous request for the stream to pause.
964  * Pausing a stream will freeze the data flow but not flush any buffers.
965  * Use AAudioStream_requestStart() to resume playback after a pause.
966  * After this call the state will be in {@link #AAUDIO_STREAM_STATE_PAUSING} or
967  * {@link #AAUDIO_STREAM_STATE_PAUSED}.
968  *
969  * This will return {@link #AAUDIO_ERROR_UNIMPLEMENTED} for input streams.
970  * For input streams use AAudioStream_requestStop().
971  *
972  * @param stream reference provided by AAudioStreamBuilder_openStream()
973  * @return {@link #AAUDIO_OK} or a negative error.
974  */
975 AAUDIO_API aaudio_result_t  AAudioStream_requestPause(AAudioStream* stream) __INTRODUCED_IN(26);
976 
977 /**
978  * Asynchronous request for the stream to flush.
979  * Flushing will discard any pending data.
980  * This call only works if the stream is pausing or paused. TODO review
981  * Frame counters are not reset by a flush. They may be advanced.
982  * After this call the state will be in {@link #AAUDIO_STREAM_STATE_FLUSHING} or
983  * {@link #AAUDIO_STREAM_STATE_FLUSHED}.
984  *
985  * This will return {@link #AAUDIO_ERROR_UNIMPLEMENTED} for input streams.
986  *
987  * @param stream reference provided by AAudioStreamBuilder_openStream()
988  * @return {@link #AAUDIO_OK} or a negative error.
989  */
990 AAUDIO_API aaudio_result_t  AAudioStream_requestFlush(AAudioStream* stream) __INTRODUCED_IN(26);
991 
992 /**
993  * Asynchronous request for the stream to stop.
994  * The stream will stop after all of the data currently buffered has been played.
995  * After this call the state will be in {@link #AAUDIO_STREAM_STATE_STOPPING} or
996  * {@link #AAUDIO_STREAM_STATE_STOPPED}.
997  *
998  * @param stream reference provided by AAudioStreamBuilder_openStream()
999  * @return {@link #AAUDIO_OK} or a negative error.
1000  */
1001 AAUDIO_API aaudio_result_t  AAudioStream_requestStop(AAudioStream* stream) __INTRODUCED_IN(26);
1002 
1003 /**
1004  * Query the current state of the client, eg. {@link #AAUDIO_STREAM_STATE_PAUSING}
1005  *
1006  * This function will immediately return the state without updating the state.
1007  * If you want to update the client state based on the server state then
1008  * call AAudioStream_waitForStateChange() with currentState
1009  * set to {@link #AAUDIO_STREAM_STATE_UNKNOWN} and a zero timeout.
1010  *
1011  * @param stream reference provided by AAudioStreamBuilder_openStream()
1012  */
1013 AAUDIO_API aaudio_stream_state_t AAudioStream_getState(AAudioStream* stream) __INTRODUCED_IN(26);
1014 
1015 /**
1016  * Wait until the current state no longer matches the input state.
1017  *
1018  * This will update the current client state.
1019  *
1020  * <pre><code>
1021  * aaudio_result_t result = AAUDIO_OK;
1022  * aaudio_stream_state_t currentState = AAudioStream_getState(stream);
1023  * aaudio_stream_state_t inputState = currentState;
1024  * while (result == AAUDIO_OK && currentState != AAUDIO_STREAM_STATE_PAUSED) {
1025  *     result = AAudioStream_waitForStateChange(
1026  *                                   stream, inputState, &currentState, MY_TIMEOUT_NANOS);
1027  *     inputState = currentState;
1028  * }
1029  * </code></pre>
1030  *
1031  * @param stream A reference provided by AAudioStreamBuilder_openStream()
1032  * @param inputState The state we want to avoid.
1033  * @param nextState Pointer to a variable that will be set to the new state.
1034  * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion.
1035  * @return {@link #AAUDIO_OK} or a negative error.
1036  */
1037 AAUDIO_API aaudio_result_t AAudioStream_waitForStateChange(AAudioStream* stream,
1038         aaudio_stream_state_t inputState, aaudio_stream_state_t *nextState,
1039         int64_t timeoutNanoseconds) __INTRODUCED_IN(26);
1040 
1041 // ============================================================
1042 // Stream I/O
1043 // ============================================================
1044 
1045 /**
1046  * Read data from the stream.
1047  *
1048  * The call will wait until the read is complete or until it runs out of time.
1049  * If timeoutNanos is zero then this call will not wait.
1050  *
1051  * Note that timeoutNanoseconds is a relative duration in wall clock time.
1052  * Time will not stop if the thread is asleep.
1053  * So it will be implemented using CLOCK_BOOTTIME.
1054  *
1055  * This call is "strong non-blocking" unless it has to wait for data.
1056  *
1057  * If the call times out then zero or a partial frame count will be returned.
1058  *
1059  * @param stream A stream created using AAudioStreamBuilder_openStream().
1060  * @param buffer The address of the first sample.
1061  * @param numFrames Number of frames to read. Only complete frames will be written.
1062  * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion.
1063  * @return The number of frames actually read or a negative error.
1064  */
1065 AAUDIO_API aaudio_result_t AAudioStream_read(AAudioStream* stream,
1066         void *buffer, int32_t numFrames, int64_t timeoutNanoseconds) __INTRODUCED_IN(26);
1067 
1068 /**
1069  * Write data to the stream.
1070  *
1071  * The call will wait until the write is complete or until it runs out of time.
1072  * If timeoutNanos is zero then this call will not wait.
1073  *
1074  * Note that timeoutNanoseconds is a relative duration in wall clock time.
1075  * Time will not stop if the thread is asleep.
1076  * So it will be implemented using CLOCK_BOOTTIME.
1077  *
1078  * This call is "strong non-blocking" unless it has to wait for room in the buffer.
1079  *
1080  * If the call times out then zero or a partial frame count will be returned.
1081  *
1082  * @param stream A stream created using AAudioStreamBuilder_openStream().
1083  * @param buffer The address of the first sample.
1084  * @param numFrames Number of frames to write. Only complete frames will be written.
1085  * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion.
1086  * @return The number of frames actually written or a negative error.
1087  */
1088 AAUDIO_API aaudio_result_t AAudioStream_write(AAudioStream* stream,
1089         const void *buffer, int32_t numFrames, int64_t timeoutNanoseconds) __INTRODUCED_IN(26);
1090 
1091 // ============================================================
1092 // Stream - queries
1093 // ============================================================
1094 
1095 /**
1096  * This can be used to adjust the latency of the buffer by changing
1097  * the threshold where blocking will occur.
1098  * By combining this with AAudioStream_getXRunCount(), the latency can be tuned
1099  * at run-time for each device.
1100  *
1101  * This cannot be set higher than AAudioStream_getBufferCapacityInFrames().
1102  *
1103  * Note that you will probably not get the exact size you request.
1104  * You can check the return value or call AAudioStream_getBufferSizeInFrames()
1105  * to see what the actual final size is.
1106  *
1107  * @param stream reference provided by AAudioStreamBuilder_openStream()
1108  * @param numFrames requested number of frames that can be filled without blocking
1109  * @return actual buffer size in frames or a negative error
1110  */
1111 AAUDIO_API aaudio_result_t AAudioStream_setBufferSizeInFrames(AAudioStream* stream,
1112         int32_t numFrames) __INTRODUCED_IN(26);
1113 
1114 /**
1115  * Query the maximum number of frames that can be filled without blocking.
1116  *
1117  * @param stream reference provided by AAudioStreamBuilder_openStream()
1118  * @return buffer size in frames.
1119  */
1120 AAUDIO_API int32_t AAudioStream_getBufferSizeInFrames(AAudioStream* stream) __INTRODUCED_IN(26);
1121 
1122 /**
1123  * Query the number of frames that the application should read or write at
1124  * one time for optimal performance. It is OK if an application writes
1125  * a different number of frames. But the buffer size may need to be larger
1126  * in order to avoid underruns or overruns.
1127  *
1128  * Note that this may or may not match the actual device burst size.
1129  * For some endpoints, the burst size can vary dynamically.
1130  * But these tend to be devices with high latency.
1131  *
1132  * @param stream reference provided by AAudioStreamBuilder_openStream()
1133  * @return burst size
1134  */
1135 AAUDIO_API int32_t AAudioStream_getFramesPerBurst(AAudioStream* stream) __INTRODUCED_IN(26);
1136 
1137 /**
1138  * Query maximum buffer capacity in frames.
1139  *
1140  * @param stream reference provided by AAudioStreamBuilder_openStream()
1141  * @return  buffer capacity in frames
1142  */
1143 AAUDIO_API int32_t AAudioStream_getBufferCapacityInFrames(AAudioStream* stream) __INTRODUCED_IN(26);
1144 
1145 /**
1146  * Query the size of the buffer that will be passed to the dataProc callback
1147  * in the numFrames parameter.
1148  *
1149  * This call can be used if the application needs to know the value of numFrames before
1150  * the stream is started. This is not normally necessary.
1151  *
1152  * If a specific size was requested by calling
1153  * AAudioStreamBuilder_setFramesPerDataCallback() then this will be the same size.
1154  *
1155  * If AAudioStreamBuilder_setFramesPerDataCallback() was not called then this will
1156  * return the size chosen by AAudio, or {@link #AAUDIO_UNSPECIFIED}.
1157  *
1158  * {@link #AAUDIO_UNSPECIFIED} indicates that the callback buffer size for this stream
1159  * may vary from one dataProc callback to the next.
1160  *
1161  * @param stream reference provided by AAudioStreamBuilder_openStream()
1162  * @return callback buffer size in frames or {@link #AAUDIO_UNSPECIFIED}
1163  */
1164 AAUDIO_API int32_t AAudioStream_getFramesPerDataCallback(AAudioStream* stream) __INTRODUCED_IN(26);
1165 
1166 /**
1167  * An XRun is an Underrun or an Overrun.
1168  * During playing, an underrun will occur if the stream is not written in time
1169  * and the system runs out of valid data.
1170  * During recording, an overrun will occur if the stream is not read in time
1171  * and there is no place to put the incoming data so it is discarded.
1172  *
1173  * An underrun or overrun can cause an audible "pop" or "glitch".
1174  *
1175  * Note that some INPUT devices may not support this function.
1176  * In that case a 0 will always be returned.
1177  *
1178  * @param stream reference provided by AAudioStreamBuilder_openStream()
1179  * @return the underrun or overrun count
1180  */
1181 AAUDIO_API int32_t AAudioStream_getXRunCount(AAudioStream* stream) __INTRODUCED_IN(26);
1182 
1183 /**
1184  * @param stream reference provided by AAudioStreamBuilder_openStream()
1185  * @return actual sample rate
1186  */
1187 AAUDIO_API int32_t AAudioStream_getSampleRate(AAudioStream* stream) __INTRODUCED_IN(26);
1188 
1189 /**
1190  * A stream has one or more channels of data.
1191  * A frame will contain one sample for each channel.
1192  *
1193  * @param stream reference provided by AAudioStreamBuilder_openStream()
1194  * @return actual number of channels
1195  */
1196 AAUDIO_API int32_t AAudioStream_getChannelCount(AAudioStream* stream) __INTRODUCED_IN(26);
1197 
1198 /**
1199  * Identical to AAudioStream_getChannelCount().
1200  *
1201  * @param stream reference provided by AAudioStreamBuilder_openStream()
1202  * @return actual number of samples frame
1203  */
1204 AAUDIO_API int32_t AAudioStream_getSamplesPerFrame(AAudioStream* stream) __INTRODUCED_IN(26);
1205 
1206 /**
1207  * @param stream reference provided by AAudioStreamBuilder_openStream()
1208  * @return actual device ID
1209  */
1210 AAUDIO_API int32_t AAudioStream_getDeviceId(AAudioStream* stream) __INTRODUCED_IN(26);
1211 
1212 /**
1213  * @param stream reference provided by AAudioStreamBuilder_openStream()
1214  * @return actual data format
1215  */
1216 AAUDIO_API aaudio_format_t AAudioStream_getFormat(AAudioStream* stream) __INTRODUCED_IN(26);
1217 
1218 /**
1219  * Provide actual sharing mode.
1220  * @param stream reference provided by AAudioStreamBuilder_openStream()
1221  * @return  actual sharing mode
1222  */
1223 AAUDIO_API aaudio_sharing_mode_t AAudioStream_getSharingMode(AAudioStream* stream)
1224         __INTRODUCED_IN(26);
1225 
1226 /**
1227  * Get the performance mode used by the stream.
1228  *
1229  * @param stream reference provided by AAudioStreamBuilder_openStream()
1230  */
1231 AAUDIO_API aaudio_performance_mode_t AAudioStream_getPerformanceMode(AAudioStream* stream)
1232         __INTRODUCED_IN(26);
1233 
1234 /**
1235  * @param stream reference provided by AAudioStreamBuilder_openStream()
1236  * @return direction
1237  */
1238 AAUDIO_API aaudio_direction_t AAudioStream_getDirection(AAudioStream* stream) __INTRODUCED_IN(26);
1239 
1240 /**
1241  * Passes back the number of frames that have been written since the stream was created.
1242  * For an output stream, this will be advanced by the application calling write()
1243  * or by a data callback.
1244  * For an input stream, this will be advanced by the endpoint.
1245  *
1246  * The frame position is monotonically increasing.
1247  *
1248  * @param stream reference provided by AAudioStreamBuilder_openStream()
1249  * @return frames written
1250  */
1251 AAUDIO_API int64_t AAudioStream_getFramesWritten(AAudioStream* stream) __INTRODUCED_IN(26);
1252 
1253 /**
1254  * Passes back the number of frames that have been read since the stream was created.
1255  * For an output stream, this will be advanced by the endpoint.
1256  * For an input stream, this will be advanced by the application calling read()
1257  * or by a data callback.
1258  *
1259  * The frame position is monotonically increasing.
1260  *
1261  * @param stream reference provided by AAudioStreamBuilder_openStream()
1262  * @return frames read
1263  */
1264 AAUDIO_API int64_t AAudioStream_getFramesRead(AAudioStream* stream) __INTRODUCED_IN(26);
1265 
1266 /**
1267  * Passes back the session ID associated with this stream.
1268  *
1269  * The session ID can be used to associate a stream with effects processors.
1270  * The effects are controlled using the Android AudioEffect Java API.
1271  *
1272  * If AAudioStreamBuilder_setSessionId() was
1273  * called with {@link #AAUDIO_SESSION_ID_ALLOCATE}
1274  * then a new session ID should be allocated once when the stream is opened.
1275  *
1276  * If AAudioStreamBuilder_setSessionId() was called with a previously allocated
1277  * session ID then that value should be returned.
1278  *
1279  * If AAudioStreamBuilder_setSessionId() was not called then this function should
1280  * return {@link #AAUDIO_SESSION_ID_NONE}.
1281  *
1282  * The sessionID for a stream should not change once the stream has been opened.
1283  *
1284  * Added in API level 28.
1285  *
1286  * @param stream reference provided by AAudioStreamBuilder_openStream()
1287  * @return session ID or {@link #AAUDIO_SESSION_ID_NONE}
1288  */
1289 AAUDIO_API aaudio_session_id_t AAudioStream_getSessionId(AAudioStream* stream) __INTRODUCED_IN(28);
1290 
1291 /**
1292  * Passes back the time at which a particular frame was presented.
1293  * This can be used to synchronize audio with video or MIDI.
1294  * It can also be used to align a recorded stream with a playback stream.
1295  *
1296  * Timestamps are only valid when the stream is in {@link #AAUDIO_STREAM_STATE_STARTED}.
1297  * {@link #AAUDIO_ERROR_INVALID_STATE} will be returned if the stream is not started.
1298  * Note that because requestStart() is asynchronous, timestamps will not be valid until
1299  * a short time after calling requestStart().
1300  * So {@link #AAUDIO_ERROR_INVALID_STATE} should not be considered a fatal error.
1301  * Just try calling again later.
1302  *
1303  * If an error occurs, then the position and time will not be modified.
1304  *
1305  * The position and time passed back are monotonically increasing.
1306  *
1307  * @param stream reference provided by AAudioStreamBuilder_openStream()
1308  * @param clockid CLOCK_MONOTONIC or CLOCK_BOOTTIME
1309  * @param framePosition pointer to a variable to receive the position
1310  * @param timeNanoseconds pointer to a variable to receive the time
1311  * @return {@link #AAUDIO_OK} or a negative error
1312  */
1313 AAUDIO_API aaudio_result_t AAudioStream_getTimestamp(AAudioStream* stream,
1314         clockid_t clockid, int64_t *framePosition, int64_t *timeNanoseconds) __INTRODUCED_IN(26);
1315 
1316 /**
1317  * Return the use case for the stream.
1318  *
1319  * Added in API level 28.
1320  *
1321  * @param stream reference provided by AAudioStreamBuilder_openStream()
1322  * @return frames read
1323  */
1324 AAUDIO_API aaudio_usage_t AAudioStream_getUsage(AAudioStream* stream) __INTRODUCED_IN(28);
1325 
1326 /**
1327  * Return the content type for the stream.
1328  *
1329  * Added in API level 28.
1330  *
1331  * @param stream reference provided by AAudioStreamBuilder_openStream()
1332  * @return content type, for example {@link #AAUDIO_CONTENT_TYPE_MUSIC}
1333  */
1334 AAUDIO_API aaudio_content_type_t AAudioStream_getContentType(AAudioStream* stream)
1335         __INTRODUCED_IN(28);
1336 
1337 /**
1338  * Return the input preset for the stream.
1339  *
1340  * Added in API level 28.
1341  *
1342  * @param stream reference provided by AAudioStreamBuilder_openStream()
1343  * @return input preset, for example {@link #AAUDIO_INPUT_PRESET_CAMCORDER}
1344  */
1345 AAUDIO_API aaudio_input_preset_t AAudioStream_getInputPreset(AAudioStream* stream)
1346         __INTRODUCED_IN(28);
1347 
1348 /**
1349  * Return the policy that determines whether the audio may or may not be captured
1350  * by other apps or the system.
1351  *
1352  * Added in API level 29.
1353  *
1354  * @param stream reference provided by AAudioStreamBuilder_openStream()
1355  * @return the allowed capture policy, for example {@link #AAUDIO_ALLOW_CAPTURE_BY_ALL}
1356  */
1357 AAUDIO_API aaudio_allowed_capture_policy_t AAudioStream_getAllowedCapturePolicy(
1358         AAudioStream* stream) __INTRODUCED_IN(29);
1359 
1360 #ifdef __cplusplus
1361 }
1362 #endif
1363 
1364 #endif //AAUDIO_AAUDIO_H
1365 
1366 /** @} */
1367