• 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 #define AAUDIO_SYSTEM_USAGE_OFFSET 1000
231 
232 /**
233  * The USAGE attribute expresses "why" you are playing a sound, what is this sound used for.
234  * This information is used by certain platforms or routing policies
235  * to make more refined volume or routing decisions.
236  *
237  * Note that these match the equivalent values in {@link android.media.AudioAttributes}
238  * in the Android Java API.
239  *
240  * Added in API level 28.
241  */
242 enum {
243     /**
244      * Use this for streaming media, music performance, video, podcasts, etcetera.
245      */
246     AAUDIO_USAGE_MEDIA = 1,
247 
248     /**
249      * Use this for voice over IP, telephony, etcetera.
250      */
251     AAUDIO_USAGE_VOICE_COMMUNICATION = 2,
252 
253     /**
254      * Use this for sounds associated with telephony such as busy tones, DTMF, etcetera.
255      */
256     AAUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING = 3,
257 
258     /**
259      * Use this to demand the users attention.
260      */
261     AAUDIO_USAGE_ALARM = 4,
262 
263     /**
264      * Use this for notifying the user when a message has arrived or some
265      * other background event has occured.
266      */
267     AAUDIO_USAGE_NOTIFICATION = 5,
268 
269     /**
270      * Use this when the phone rings.
271      */
272     AAUDIO_USAGE_NOTIFICATION_RINGTONE = 6,
273 
274     /**
275      * Use this to attract the users attention when, for example, the battery is low.
276      */
277     AAUDIO_USAGE_NOTIFICATION_EVENT = 10,
278 
279     /**
280      * Use this for screen readers, etcetera.
281      */
282     AAUDIO_USAGE_ASSISTANCE_ACCESSIBILITY = 11,
283 
284     /**
285      * Use this for driving or navigation directions.
286      */
287     AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12,
288 
289     /**
290      * Use this for user interface sounds, beeps, etcetera.
291      */
292     AAUDIO_USAGE_ASSISTANCE_SONIFICATION = 13,
293 
294     /**
295      * Use this for game audio and sound effects.
296      */
297     AAUDIO_USAGE_GAME = 14,
298 
299     /**
300      * Use this for audio responses to user queries, audio instructions or help utterances.
301      */
302     AAUDIO_USAGE_ASSISTANT = 16,
303 
304     /**
305      * Use this in case of playing sounds in an emergency.
306      * Privileged MODIFY_AUDIO_ROUTING permission required.
307      */
308     AAUDIO_SYSTEM_USAGE_EMERGENCY = AAUDIO_SYSTEM_USAGE_OFFSET,
309 
310     /**
311      * Use this for safety sounds and alerts, for example backup camera obstacle detection.
312      * Privileged MODIFY_AUDIO_ROUTING permission required.
313      */
314     AAUDIO_SYSTEM_USAGE_SAFETY = AAUDIO_SYSTEM_USAGE_OFFSET + 1,
315 
316     /**
317      * Use this for vehicle status alerts and information, for example the check engine light.
318      * Privileged MODIFY_AUDIO_ROUTING permission required.
319      */
320     AAUDIO_SYSTEM_USAGE_VEHICLE_STATUS = AAUDIO_SYSTEM_USAGE_OFFSET + 2,
321 
322     /**
323      * Use this for traffic announcements, etc.
324      * Privileged MODIFY_AUDIO_ROUTING permission required.
325      */
326     AAUDIO_SYSTEM_USAGE_ANNOUNCEMENT = AAUDIO_SYSTEM_USAGE_OFFSET + 3,
327 };
328 typedef int32_t aaudio_usage_t;
329 
330 /**
331  * The CONTENT_TYPE attribute describes "what" you are playing.
332  * It expresses the general category of the content. This information is optional.
333  * But in case it is known (for instance AAUDIO_CONTENT_TYPE_MOVIE for a
334  * movie streaming service or AAUDIO_CONTENT_TYPE_SPEECH for
335  * an audio book application) this information might be used by the audio framework to
336  * enforce audio focus.
337  *
338  * Note that these match the equivalent values in {@link android.media.AudioAttributes}
339  * in the Android Java API.
340  *
341  * Added in API level 28.
342  */
343 enum {
344 
345     /**
346      * Use this for spoken voice, audio books, etcetera.
347      */
348     AAUDIO_CONTENT_TYPE_SPEECH = 1,
349 
350     /**
351      * Use this for pre-recorded or live music.
352      */
353     AAUDIO_CONTENT_TYPE_MUSIC = 2,
354 
355     /**
356      * Use this for a movie or video soundtrack.
357      */
358     AAUDIO_CONTENT_TYPE_MOVIE = 3,
359 
360     /**
361      * Use this for sound is designed to accompany a user action,
362      * such as a click or beep sound made when the user presses a button.
363      */
364     AAUDIO_CONTENT_TYPE_SONIFICATION = 4
365 };
366 typedef int32_t aaudio_content_type_t;
367 
368 /**
369  * Defines the audio source.
370  * An audio source defines both a default physical source of audio signal, and a recording
371  * configuration.
372  *
373  * Note that these match the equivalent values in MediaRecorder.AudioSource in the Android Java API.
374  *
375  * Added in API level 28.
376  */
377 enum {
378     /**
379      * Use this preset when other presets do not apply.
380      */
381     AAUDIO_INPUT_PRESET_GENERIC = 1,
382 
383     /**
384      * Use this preset when recording video.
385      */
386     AAUDIO_INPUT_PRESET_CAMCORDER = 5,
387 
388     /**
389      * Use this preset when doing speech recognition.
390      */
391     AAUDIO_INPUT_PRESET_VOICE_RECOGNITION = 6,
392 
393     /**
394      * Use this preset when doing telephony or voice messaging.
395      */
396     AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION = 7,
397 
398     /**
399      * Use this preset to obtain an input with no effects.
400      * Note that this input will not have automatic gain control
401      * so the recorded volume may be very low.
402      */
403     AAUDIO_INPUT_PRESET_UNPROCESSED = 9,
404 
405     /**
406      * Use this preset for capturing audio meant to be processed in real time
407      * and played back for live performance (e.g karaoke).
408      * The capture path will minimize latency and coupling with playback path.
409      * Available since API level 29.
410      */
411     AAUDIO_INPUT_PRESET_VOICE_PERFORMANCE = 10,
412 };
413 typedef int32_t aaudio_input_preset_t;
414 
415 /**
416  * Specifying if audio may or may not be captured by other apps or the system.
417  *
418  * Note that these match the equivalent values in {@link android.media.AudioAttributes}
419  * in the Android Java API.
420  *
421  * Added in API level 29.
422  */
423 enum {
424     /**
425      * Indicates that the audio may be captured by any app.
426      *
427      * For privacy, the following usages can not be recorded: AAUDIO_VOICE_COMMUNICATION*,
428      * AAUDIO_USAGE_NOTIFICATION*, AAUDIO_USAGE_ASSISTANCE* and {@link #AAUDIO_USAGE_ASSISTANT}.
429      *
430      * On {@link android.os.Build.VERSION_CODES#Q}, this means only {@link #AAUDIO_USAGE_MEDIA}
431      * and {@link #AAUDIO_USAGE_GAME} may be captured.
432      *
433      * See {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_ALL}.
434      */
435     AAUDIO_ALLOW_CAPTURE_BY_ALL = 1,
436     /**
437      * Indicates that the audio may only be captured by system apps.
438      *
439      * System apps can capture for many purposes like accessibility, user guidance...
440      * but have strong restriction. See
441      * {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_SYSTEM} for what the system apps
442      * can do with the capture audio.
443      */
444     AAUDIO_ALLOW_CAPTURE_BY_SYSTEM = 2,
445     /**
446      * Indicates that the audio may not be recorded by any app, even if it is a system app.
447      *
448      * It is encouraged to use {@link #AAUDIO_ALLOW_CAPTURE_BY_SYSTEM} instead of this value as system apps
449      * provide significant and useful features for the user (eg. accessibility).
450      * See {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_NONE}.
451      */
452     AAUDIO_ALLOW_CAPTURE_BY_NONE = 3,
453 };
454 
455 typedef int32_t aaudio_allowed_capture_policy_t;
456 
457 /**
458  * These may be used with AAudioStreamBuilder_setSessionId().
459  *
460  * Added in API level 28.
461  */
462 enum {
463     /**
464      * Do not allocate a session ID.
465      * Effects cannot be used with this stream.
466      * Default.
467      *
468      * Added in API level 28.
469      */
470     AAUDIO_SESSION_ID_NONE = -1,
471 
472     /**
473      * Allocate a session ID that can be used to attach and control
474      * effects using the Java AudioEffects API.
475      * Note that using this may result in higher latency.
476      *
477      * Note that this matches the value of AudioManager.AUDIO_SESSION_ID_GENERATE.
478      *
479      * Added in API level 28.
480      */
481     AAUDIO_SESSION_ID_ALLOCATE = 0,
482 };
483 typedef int32_t aaudio_session_id_t;
484 
485 typedef struct AAudioStreamStruct         AAudioStream;
486 typedef struct AAudioStreamBuilderStruct  AAudioStreamBuilder;
487 
488 #ifndef AAUDIO_API
489 #define AAUDIO_API /* export this symbol */
490 #endif
491 
492 // ============================================================
493 // Audio System
494 // ============================================================
495 
496 /**
497  * The text is the ASCII symbol corresponding to the returnCode,
498  * or an English message saying the returnCode is unrecognized.
499  * This is intended for developers to use when debugging.
500  * It is not for display to users.
501  *
502  * Available since API level 26.
503  *
504  * @return pointer to a text representation of an AAudio result code.
505  */
506 AAUDIO_API const char * AAudio_convertResultToText(aaudio_result_t returnCode) __INTRODUCED_IN(26);
507 
508 /**
509  * The text is the ASCII symbol corresponding to the stream state,
510  * or an English message saying the state is unrecognized.
511  * This is intended for developers to use when debugging.
512  * It is not for display to users.
513  *
514  * Available since API level 26.
515  *
516  * @return pointer to a text representation of an AAudio state.
517  */
518 AAUDIO_API const char * AAudio_convertStreamStateToText(aaudio_stream_state_t state)
519         __INTRODUCED_IN(26);
520 
521 // ============================================================
522 // StreamBuilder
523 // ============================================================
524 
525 /**
526  * Create a StreamBuilder that can be used to open a Stream.
527  *
528  * The deviceId is initially unspecified, meaning that the current default device will be used.
529  *
530  * The default direction is {@link #AAUDIO_DIRECTION_OUTPUT}.
531  * The default sharing mode is {@link #AAUDIO_SHARING_MODE_SHARED}.
532  * The data format, samplesPerFrames and sampleRate are unspecified and will be
533  * chosen by the device when it is opened.
534  *
535  * AAudioStreamBuilder_delete() must be called when you are done using the builder.
536  *
537  * Available since API level 26.
538  */
539 AAUDIO_API aaudio_result_t AAudio_createStreamBuilder(AAudioStreamBuilder** builder)
540         __INTRODUCED_IN(26);
541 
542 /**
543  * Request an audio device identified device using an ID.
544  * On Android, for example, the ID could be obtained from the Java AudioManager.
545  *
546  * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED},
547  * in which case the primary device will be used.
548  *
549  * Available since API level 26.
550  *
551  * @param builder reference provided by AAudio_createStreamBuilder()
552  * @param deviceId device identifier or {@link #AAUDIO_UNSPECIFIED}
553  */
554 AAUDIO_API void AAudioStreamBuilder_setDeviceId(AAudioStreamBuilder* builder,
555                                                 int32_t deviceId) __INTRODUCED_IN(26);
556 
557 /**
558  * Request a sample rate in Hertz.
559  *
560  * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}.
561  * An optimal value will then be chosen when the stream is opened.
562  * After opening a stream with an unspecified value, the application must
563  * query for the actual value, which may vary by device.
564  *
565  * If an exact value is specified then an opened stream will use that value.
566  * If a stream cannot be opened with the specified value then the open will fail.
567  *
568  * Available since API level 26.
569  *
570  * @param builder reference provided by AAudio_createStreamBuilder()
571  * @param sampleRate frames per second. Common rates include 44100 and 48000 Hz.
572  */
573 AAUDIO_API void AAudioStreamBuilder_setSampleRate(AAudioStreamBuilder* builder,
574                                                   int32_t sampleRate) __INTRODUCED_IN(26);
575 
576 /**
577  * Request a number of channels for the stream.
578  *
579  * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}.
580  * An optimal value will then be chosen when the stream is opened.
581  * After opening a stream with an unspecified value, the application must
582  * query for the actual value, which may vary by device.
583  *
584  * If an exact value is specified then an opened stream will use that value.
585  * If a stream cannot be opened with the specified value then the open will fail.
586  *
587  * Available since API level 26.
588  *
589  * @param builder reference provided by AAudio_createStreamBuilder()
590  * @param channelCount Number of channels desired.
591  */
592 AAUDIO_API void AAudioStreamBuilder_setChannelCount(AAudioStreamBuilder* builder,
593                                                     int32_t channelCount) __INTRODUCED_IN(26);
594 
595 /**
596  * Identical to AAudioStreamBuilder_setChannelCount().
597  *
598  * Available since API level 26.
599  *
600  * @param builder reference provided by AAudio_createStreamBuilder()
601  * @param samplesPerFrame Number of samples in a frame.
602  */
603 AAUDIO_API void AAudioStreamBuilder_setSamplesPerFrame(AAudioStreamBuilder* builder,
604                                                        int32_t samplesPerFrame) __INTRODUCED_IN(26);
605 
606 /**
607  * Request a sample data format, for example {@link #AAUDIO_FORMAT_PCM_I16}.
608  *
609  * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}.
610  * An optimal value will then be chosen when the stream is opened.
611  * After opening a stream with an unspecified value, the application must
612  * query for the actual value, which may vary by device.
613  *
614  * If an exact value is specified then an opened stream will use that value.
615  * If a stream cannot be opened with the specified value then the open will fail.
616  *
617  * Available since API level 26.
618  *
619  * @param builder reference provided by AAudio_createStreamBuilder()
620  * @param format common formats are {@link #AAUDIO_FORMAT_PCM_FLOAT} and
621  *               {@link #AAUDIO_FORMAT_PCM_I16}.
622  */
623 AAUDIO_API void AAudioStreamBuilder_setFormat(AAudioStreamBuilder* builder,
624                                               aaudio_format_t format) __INTRODUCED_IN(26);
625 
626 /**
627  * Request a mode for sharing the device.
628  *
629  * The default, if you do not call this function, is {@link #AAUDIO_SHARING_MODE_SHARED}.
630  *
631  * The requested sharing mode may not be available.
632  * The application can query for the actual mode after the stream is opened.
633  *
634  * Available since API level 26.
635  *
636  * @param builder reference provided by AAudio_createStreamBuilder()
637  * @param sharingMode {@link #AAUDIO_SHARING_MODE_SHARED} or {@link #AAUDIO_SHARING_MODE_EXCLUSIVE}
638  */
639 AAUDIO_API void AAudioStreamBuilder_setSharingMode(AAudioStreamBuilder* builder,
640         aaudio_sharing_mode_t sharingMode) __INTRODUCED_IN(26);
641 
642 /**
643  * Request the direction for a stream.
644  *
645  * The default, if you do not call this function, is {@link #AAUDIO_DIRECTION_OUTPUT}.
646  *
647  * Available since API level 26.
648  *
649  * @param builder reference provided by AAudio_createStreamBuilder()
650  * @param direction {@link #AAUDIO_DIRECTION_OUTPUT} or {@link #AAUDIO_DIRECTION_INPUT}
651  */
652 AAUDIO_API void AAudioStreamBuilder_setDirection(AAudioStreamBuilder* builder,
653         aaudio_direction_t direction) __INTRODUCED_IN(26);
654 
655 /**
656  * Set the requested buffer capacity in frames.
657  * The final AAudioStream capacity may differ, but will probably be at least this big.
658  *
659  * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}.
660  *
661  * Available since API level 26.
662  *
663  * @param builder reference provided by AAudio_createStreamBuilder()
664  * @param numFrames the desired buffer capacity in frames or {@link #AAUDIO_UNSPECIFIED}
665  */
666 AAUDIO_API void AAudioStreamBuilder_setBufferCapacityInFrames(AAudioStreamBuilder* builder,
667         int32_t numFrames) __INTRODUCED_IN(26);
668 
669 /**
670  * Set the requested performance mode.
671  *
672  * Supported modes are {@link #AAUDIO_PERFORMANCE_MODE_NONE},
673  * {@link #AAUDIO_PERFORMANCE_MODE_POWER_SAVING} * and {@link #AAUDIO_PERFORMANCE_MODE_LOW_LATENCY}.
674  *
675  * The default, if you do not call this function, is {@link #AAUDIO_PERFORMANCE_MODE_NONE}.
676  *
677  * You may not get the mode you requested.
678  * You can call AAudioStream_getPerformanceMode()
679  * to find out the final mode for the stream.
680  *
681  * Available since API level 26.
682  *
683  * @param builder reference provided by AAudio_createStreamBuilder()
684  * @param mode the desired performance mode, eg. {@link #AAUDIO_PERFORMANCE_MODE_LOW_LATENCY}
685  */
686 AAUDIO_API void AAudioStreamBuilder_setPerformanceMode(AAudioStreamBuilder* builder,
687         aaudio_performance_mode_t mode) __INTRODUCED_IN(26);
688 
689 /**
690  * Set the intended use case for the stream.
691  *
692  * The AAudio system will use this information to optimize the
693  * behavior of the stream.
694  * This could, for example, affect how volume and focus is handled for the stream.
695  *
696  * The default, if you do not call this function, is {@link #AAUDIO_USAGE_MEDIA}.
697  *
698  * Available since API level 28.
699  *
700  * @param builder reference provided by AAudio_createStreamBuilder()
701  * @param usage the desired usage, eg. {@link #AAUDIO_USAGE_GAME}
702  */
703 AAUDIO_API void AAudioStreamBuilder_setUsage(AAudioStreamBuilder* builder,
704         aaudio_usage_t usage) __INTRODUCED_IN(28);
705 
706 /**
707  * Set the type of audio data that the stream will carry.
708  *
709  * The AAudio system will use this information to optimize the
710  * behavior of the stream.
711  * This could, for example, affect whether a stream is paused when a notification occurs.
712  *
713  * The default, if you do not call this function, is {@link #AAUDIO_CONTENT_TYPE_MUSIC}.
714  *
715  * Available since API level 28.
716  *
717  * @param builder reference provided by AAudio_createStreamBuilder()
718  * @param contentType the type of audio data, eg. {@link #AAUDIO_CONTENT_TYPE_SPEECH}
719  */
720 AAUDIO_API void AAudioStreamBuilder_setContentType(AAudioStreamBuilder* builder,
721         aaudio_content_type_t contentType) __INTRODUCED_IN(28);
722 
723 /**
724  * Set the input (capture) preset for the stream.
725  *
726  * The AAudio system will use this information to optimize the
727  * behavior of the stream.
728  * This could, for example, affect which microphones are used and how the
729  * recorded data is processed.
730  *
731  * The default, if you do not call this function, is {@link #AAUDIO_INPUT_PRESET_VOICE_RECOGNITION}.
732  * That is because VOICE_RECOGNITION is the preset with the lowest latency
733  * on many platforms.
734  *
735  * Available since API level 28.
736  *
737  * @param builder reference provided by AAudio_createStreamBuilder()
738  * @param inputPreset the desired configuration for recording
739  */
740 AAUDIO_API void AAudioStreamBuilder_setInputPreset(AAudioStreamBuilder* builder,
741         aaudio_input_preset_t inputPreset) __INTRODUCED_IN(28);
742 
743 /**
744  * Specify whether this stream audio may or may not be captured by other apps or the system.
745  *
746  * The default is {@link #AAUDIO_ALLOW_CAPTURE_BY_ALL}.
747  *
748  * Note that an application can also set its global policy, in which case the most restrictive
749  * policy is always applied. See {@link android.media.AudioAttributes#setAllowedCapturePolicy(int)}
750  *
751  * Available since API level 29.
752  *
753  * @param builder reference provided by AAudio_createStreamBuilder()
754  * @param capturePolicy the desired level of opt-out from being captured.
755  */
756 AAUDIO_API void AAudioStreamBuilder_setAllowedCapturePolicy(AAudioStreamBuilder* builder,
757         aaudio_allowed_capture_policy_t capturePolicy) __INTRODUCED_IN(29);
758 
759 /** Set the requested session ID.
760  *
761  * The session ID can be used to associate a stream with effects processors.
762  * The effects are controlled using the Android AudioEffect Java API.
763  *
764  * The default, if you do not call this function, is {@link #AAUDIO_SESSION_ID_NONE}.
765  *
766  * If set to {@link #AAUDIO_SESSION_ID_ALLOCATE} then a session ID will be allocated
767  * when the stream is opened.
768  *
769  * The allocated session ID can be obtained by calling AAudioStream_getSessionId()
770  * and then used with this function when opening another stream.
771  * This allows effects to be shared between streams.
772  *
773  * Session IDs from AAudio can be used with the Android Java APIs and vice versa.
774  * So a session ID from an AAudio stream can be passed to Java
775  * and effects applied using the Java AudioEffect API.
776  *
777  * Note that allocating or setting a session ID may result in a stream with higher latency.
778  *
779  * Allocated session IDs will always be positive and nonzero.
780  *
781  * Available since API level 28.
782  *
783  * @param builder reference provided by AAudio_createStreamBuilder()
784  * @param sessionId an allocated sessionID or {@link #AAUDIO_SESSION_ID_ALLOCATE}
785  */
786 AAUDIO_API void AAudioStreamBuilder_setSessionId(AAudioStreamBuilder* builder,
787         aaudio_session_id_t sessionId) __INTRODUCED_IN(28);
788 
789 
790 /** Indicates whether this input stream must be marked as privacy sensitive or not.
791  *
792  * When true, this input stream is privacy sensitive and any concurrent capture
793  * is not permitted.
794  *
795  * This is off (false) by default except when the input preset is {@link #AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION}
796  * or {@link #AAUDIO_INPUT_PRESET_CAMCORDER}.
797  *
798  * Always takes precedence over default from input preset when set explicitly.
799  *
800  * Only relevant if the stream direction is {@link #AAUDIO_DIRECTION_INPUT}.
801  *
802  * Added in API level 30.
803  *
804  * @param builder reference provided by AAudio_createStreamBuilder()
805  * @param privacySensitive true if capture from this stream must be marked as privacy sensitive,
806  * false otherwise.
807  */
808 AAUDIO_API void AAudioStreamBuilder_setPrivacySensitive(AAudioStreamBuilder* builder,
809         bool privacySensitive) __INTRODUCED_IN(30);
810 
811 /**
812  * Return one of these values from the data callback function.
813  */
814 enum {
815 
816     /**
817      * Continue calling the callback.
818      */
819     AAUDIO_CALLBACK_RESULT_CONTINUE = 0,
820 
821     /**
822      * Stop calling the callback.
823      *
824      * The application will still need to call AAudioStream_requestPause()
825      * or AAudioStream_requestStop().
826      */
827     AAUDIO_CALLBACK_RESULT_STOP,
828 
829 };
830 typedef int32_t aaudio_data_callback_result_t;
831 
832 /**
833  * Prototype for the data function that is passed to AAudioStreamBuilder_setDataCallback().
834  *
835  * For an output stream, this function should render and write numFrames of data
836  * in the streams current data format to the audioData buffer.
837  *
838  * For an input stream, this function should read and process numFrames of data
839  * from the audioData buffer.
840  *
841  * The audio data is passed through the buffer. So do NOT call AAudioStream_read() or
842  * AAudioStream_write() on the stream that is making the callback.
843  *
844  * Note that numFrames can vary unless AAudioStreamBuilder_setFramesPerDataCallback()
845  * is called.
846  *
847  * Also note that this callback function should be considered a "real-time" function.
848  * It must not do anything that could cause an unbounded delay because that can cause the
849  * audio to glitch or pop.
850  *
851  * These are things the function should NOT do:
852  * <ul>
853  * <li>allocate memory using, for example, malloc() or new</li>
854  * <li>any file operations such as opening, closing, reading or writing</li>
855  * <li>any network operations such as streaming</li>
856  * <li>use any mutexes or other synchronization primitives</li>
857  * <li>sleep</li>
858  * <li>stop or close the stream</li>
859  * <li>AAudioStream_read()</li>
860  * <li>AAudioStream_write()</li>
861  * </ul>
862  *
863  * The following are OK to call from the data callback:
864  * <ul>
865  * <li>AAudioStream_get*()</li>
866  * <li>AAudio_convertResultToText()</li>
867  * </ul>
868  *
869  * If you need to move data, eg. MIDI commands, in or out of the callback function then
870  * we recommend the use of non-blocking techniques such as an atomic FIFO.
871  *
872  * @param stream reference provided by AAudioStreamBuilder_openStream()
873  * @param userData the same address that was passed to AAudioStreamBuilder_setCallback()
874  * @param audioData a pointer to the audio data
875  * @param numFrames the number of frames to be processed, which can vary
876  * @return AAUDIO_CALLBACK_RESULT_*
877  */
878 typedef aaudio_data_callback_result_t (*AAudioStream_dataCallback)(
879         AAudioStream *stream,
880         void *userData,
881         void *audioData,
882         int32_t numFrames);
883 
884 /**
885  * Request that AAudio call this functions when the stream is running.
886  *
887  * Note that when using this callback, the audio data will be passed in or out
888  * of the function as an argument.
889  * So you cannot call AAudioStream_write() or AAudioStream_read()
890  * on the same stream that has an active data callback.
891  *
892  * The callback function will start being called after AAudioStream_requestStart()
893  * is called.
894  * It will stop being called after AAudioStream_requestPause() or
895  * AAudioStream_requestStop() is called.
896  *
897  * This callback function will be called on a real-time thread owned by AAudio. See
898  * {@link #AAudioStream_dataCallback} for more information.
899  *
900  * Note that the AAudio callbacks will never be called simultaneously from multiple threads.
901  *
902  * Available since API level 26.
903  *
904  * @param builder reference provided by AAudio_createStreamBuilder()
905  * @param callback pointer to a function that will process audio data.
906  * @param userData pointer to an application data structure that will be passed
907  *          to the callback functions.
908  */
909 AAUDIO_API void AAudioStreamBuilder_setDataCallback(AAudioStreamBuilder* builder,
910         AAudioStream_dataCallback callback, void *userData) __INTRODUCED_IN(26);
911 
912 /**
913  * Set the requested data callback buffer size in frames.
914  * See {@link #AAudioStream_dataCallback}.
915  *
916  * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}.
917  *
918  * For the lowest possible latency, do not call this function. AAudio will then
919  * call the dataProc callback function with whatever size is optimal.
920  * That size may vary from one callback to another.
921  *
922  * Only use this function if the application requires a specific number of frames for processing.
923  * The application might, for example, be using an FFT that requires
924  * a specific power-of-two sized buffer.
925  *
926  * AAudio may need to add additional buffering in order to adapt between the internal
927  * buffer size and the requested buffer size.
928  *
929  * If you do call this function then the requested size should be less than
930  * half the buffer capacity, to allow double buffering.
931  *
932  * Available since API level 26.
933  *
934  * @param builder reference provided by AAudio_createStreamBuilder()
935  * @param numFrames the desired buffer size in frames or {@link #AAUDIO_UNSPECIFIED}
936  */
937 AAUDIO_API void AAudioStreamBuilder_setFramesPerDataCallback(AAudioStreamBuilder* builder,
938                                                              int32_t numFrames) __INTRODUCED_IN(26);
939 
940 /**
941  * Prototype for the callback function that is passed to
942  * AAudioStreamBuilder_setErrorCallback().
943  *
944  * The following may NOT be called from the error callback:
945  * <ul>
946  * <li>AAudioStream_requestStop()</li>
947  * <li>AAudioStream_requestPause()</li>
948  * <li>AAudioStream_close()</li>
949  * <li>AAudioStream_waitForStateChange()</li>
950  * <li>AAudioStream_read()</li>
951  * <li>AAudioStream_write()</li>
952  * </ul>
953  *
954  * The following are OK to call from the error callback:
955  * <ul>
956  * <li>AAudioStream_get*()</li>
957  * <li>AAudio_convertResultToText()</li>
958  * </ul>
959  *
960  * @param stream reference provided by AAudioStreamBuilder_openStream()
961  * @param userData the same address that was passed to AAudioStreamBuilder_setErrorCallback()
962  * @param error an AAUDIO_ERROR_* value.
963  */
964 typedef void (*AAudioStream_errorCallback)(
965         AAudioStream *stream,
966         void *userData,
967         aaudio_result_t error);
968 
969 /**
970  * Request that AAudio call this function if any error occurs or the stream is disconnected.
971  *
972  * It will be called, for example, if a headset or a USB device is unplugged causing the stream's
973  * device to be unavailable or "disconnected".
974  * Another possible cause of error would be a timeout or an unanticipated internal error.
975  *
976  * In response, this function should signal or create another thread to stop
977  * and close this stream. The other thread could then reopen a stream on another device.
978  * Do not stop or close the stream, or reopen the new stream, directly from this callback.
979  *
980  * This callback will not be called because of actions by the application, such as stopping
981  * or closing a stream.
982  *
983  * Note that the AAudio callbacks will never be called simultaneously from multiple threads.
984  *
985  * Available since API level 26.
986  *
987  * @param builder reference provided by AAudio_createStreamBuilder()
988  * @param callback pointer to a function that will be called if an error occurs.
989  * @param userData pointer to an application data structure that will be passed
990  *          to the callback functions.
991  */
992 AAUDIO_API void AAudioStreamBuilder_setErrorCallback(AAudioStreamBuilder* builder,
993         AAudioStream_errorCallback callback, void *userData) __INTRODUCED_IN(26);
994 
995 /**
996  * Open a stream based on the options in the StreamBuilder.
997  *
998  * AAudioStream_close() must be called when finished with the stream to recover
999  * the memory and to free the associated resources.
1000  *
1001  * Available since API level 26.
1002  *
1003  * @param builder reference provided by AAudio_createStreamBuilder()
1004  * @param stream pointer to a variable to receive the new stream reference
1005  * @return {@link #AAUDIO_OK} or a negative error.
1006  */
1007 AAUDIO_API aaudio_result_t  AAudioStreamBuilder_openStream(AAudioStreamBuilder* builder,
1008         AAudioStream** stream) __INTRODUCED_IN(26);
1009 
1010 /**
1011  * Delete the resources associated with the StreamBuilder.
1012  *
1013  * Available since API level 26.
1014  *
1015  * @param builder reference provided by AAudio_createStreamBuilder()
1016  * @return {@link #AAUDIO_OK} or a negative error.
1017  */
1018 AAUDIO_API aaudio_result_t  AAudioStreamBuilder_delete(AAudioStreamBuilder* builder)
1019     __INTRODUCED_IN(26);
1020 
1021 // ============================================================
1022 // Stream Control
1023 // ============================================================
1024 
1025 #if __ANDROID_API__ >= 30
1026 /**
1027  * Free the audio resources associated with a stream created by
1028  * AAudioStreamBuilder_openStream().
1029  * AAudioStream_close() should be called at some point after calling
1030  * this function.
1031  *
1032  * After this call, the stream will be in {@link #AAUDIO_STREAM_STATE_CLOSING}
1033  *
1034  * This function is useful if you want to release the audio resources immediately,
1035  * but still allow queries to the stream to occur from other threads. This often
1036  * happens if you are monitoring stream progress from a UI thread.
1037  *
1038  * NOTE: This function is only fully implemented for MMAP streams,
1039  * which are low latency streams supported by some devices.
1040  * On other "Legacy" streams some audio resources will still be in use
1041  * and some callbacks may still be in process after this call.
1042  *
1043  * @param stream reference provided by AAudioStreamBuilder_openStream()
1044  * @return {@link #AAUDIO_OK} or a negative error.
1045  */
1046 AAUDIO_API aaudio_result_t  AAudioStream_release(AAudioStream* stream) __INTRODUCED_IN(30);
1047 #endif // __ANDROID_API__
1048 
1049 /**
1050  * Delete the internal data structures associated with the stream created
1051  * by AAudioStreamBuilder_openStream().
1052  *
1053  * If AAudioStream_release() has not been called then it will be called automatically.
1054  *
1055  * @param stream reference provided by AAudioStreamBuilder_openStream()
1056  * @return {@link #AAUDIO_OK} or a negative error.
1057  */
1058 AAUDIO_API aaudio_result_t  AAudioStream_close(AAudioStream* stream) __INTRODUCED_IN(26);
1059 
1060 /**
1061  * Asynchronously request to start playing the stream. For output streams, one should
1062  * write to the stream to fill the buffer before starting.
1063  * Otherwise it will underflow.
1064  * After this call the state will be in {@link #AAUDIO_STREAM_STATE_STARTING} or
1065  * {@link #AAUDIO_STREAM_STATE_STARTED}.
1066  *
1067  * Available since API level 26.
1068  *
1069  * @param stream reference provided by AAudioStreamBuilder_openStream()
1070  * @return {@link #AAUDIO_OK} or a negative error.
1071  */
1072 AAUDIO_API aaudio_result_t  AAudioStream_requestStart(AAudioStream* stream) __INTRODUCED_IN(26);
1073 
1074 /**
1075  * Asynchronous request for the stream to pause.
1076  * Pausing a stream will freeze the data flow but not flush any buffers.
1077  * Use AAudioStream_requestStart() to resume playback after a pause.
1078  * After this call the state will be in {@link #AAUDIO_STREAM_STATE_PAUSING} or
1079  * {@link #AAUDIO_STREAM_STATE_PAUSED}.
1080  *
1081  * This will return {@link #AAUDIO_ERROR_UNIMPLEMENTED} for input streams.
1082  * For input streams use AAudioStream_requestStop().
1083  *
1084  * Available since API level 26.
1085  *
1086  * @param stream reference provided by AAudioStreamBuilder_openStream()
1087  * @return {@link #AAUDIO_OK} or a negative error.
1088  */
1089 AAUDIO_API aaudio_result_t  AAudioStream_requestPause(AAudioStream* stream) __INTRODUCED_IN(26);
1090 
1091 /**
1092  * Asynchronous request for the stream to flush.
1093  * Flushing will discard any pending data.
1094  * This call only works if the stream is pausing or paused. TODO review
1095  * Frame counters are not reset by a flush. They may be advanced.
1096  * After this call the state will be in {@link #AAUDIO_STREAM_STATE_FLUSHING} or
1097  * {@link #AAUDIO_STREAM_STATE_FLUSHED}.
1098  *
1099  * This will return {@link #AAUDIO_ERROR_UNIMPLEMENTED} for input streams.
1100  *
1101  * Available since API level 26.
1102  *
1103  * @param stream reference provided by AAudioStreamBuilder_openStream()
1104  * @return {@link #AAUDIO_OK} or a negative error.
1105  */
1106 AAUDIO_API aaudio_result_t  AAudioStream_requestFlush(AAudioStream* stream) __INTRODUCED_IN(26);
1107 
1108 /**
1109  * Asynchronous request for the stream to stop.
1110  * The stream will stop after all of the data currently buffered has been played.
1111  * After this call the state will be in {@link #AAUDIO_STREAM_STATE_STOPPING} or
1112  * {@link #AAUDIO_STREAM_STATE_STOPPED}.
1113  *
1114  * Available since API level 26.
1115  *
1116  * @param stream reference provided by AAudioStreamBuilder_openStream()
1117  * @return {@link #AAUDIO_OK} or a negative error.
1118  */
1119 AAUDIO_API aaudio_result_t  AAudioStream_requestStop(AAudioStream* stream) __INTRODUCED_IN(26);
1120 
1121 /**
1122  * Query the current state of the client, eg. {@link #AAUDIO_STREAM_STATE_PAUSING}
1123  *
1124  * This function will immediately return the state without updating the state.
1125  * If you want to update the client state based on the server state then
1126  * call AAudioStream_waitForStateChange() with currentState
1127  * set to {@link #AAUDIO_STREAM_STATE_UNKNOWN} and a zero timeout.
1128  *
1129  * Available since API level 26.
1130  *
1131  * @param stream reference provided by AAudioStreamBuilder_openStream()
1132  */
1133 AAUDIO_API aaudio_stream_state_t AAudioStream_getState(AAudioStream* stream) __INTRODUCED_IN(26);
1134 
1135 /**
1136  * Wait until the current state no longer matches the input state.
1137  *
1138  * This will update the current client state.
1139  *
1140  * <pre><code>
1141  * aaudio_result_t result = AAUDIO_OK;
1142  * aaudio_stream_state_t currentState = AAudioStream_getState(stream);
1143  * aaudio_stream_state_t inputState = currentState;
1144  * while (result == AAUDIO_OK && currentState != AAUDIO_STREAM_STATE_PAUSED) {
1145  *     result = AAudioStream_waitForStateChange(
1146  *                                   stream, inputState, &currentState, MY_TIMEOUT_NANOS);
1147  *     inputState = currentState;
1148  * }
1149  * </code></pre>
1150  *
1151  * Available since API level 26.
1152  *
1153  * @param stream A reference provided by AAudioStreamBuilder_openStream()
1154  * @param inputState The state we want to avoid.
1155  * @param nextState Pointer to a variable that will be set to the new state.
1156  * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion.
1157  * @return {@link #AAUDIO_OK} or a negative error.
1158  */
1159 AAUDIO_API aaudio_result_t AAudioStream_waitForStateChange(AAudioStream* stream,
1160         aaudio_stream_state_t inputState, aaudio_stream_state_t *nextState,
1161         int64_t timeoutNanoseconds) __INTRODUCED_IN(26);
1162 
1163 // ============================================================
1164 // Stream I/O
1165 // ============================================================
1166 
1167 /**
1168  * Read data from the stream.
1169  *
1170  * The call will wait until the read is complete or until it runs out of time.
1171  * If timeoutNanos is zero then this call will not wait.
1172  *
1173  * Note that timeoutNanoseconds is a relative duration in wall clock time.
1174  * Time will not stop if the thread is asleep.
1175  * So it will be implemented using CLOCK_BOOTTIME.
1176  *
1177  * This call is "strong non-blocking" unless it has to wait for data.
1178  *
1179  * If the call times out then zero or a partial frame count will be returned.
1180  *
1181  * Available since API level 26.
1182  *
1183  * @param stream A stream created using AAudioStreamBuilder_openStream().
1184  * @param buffer The address of the first sample.
1185  * @param numFrames Number of frames to read. Only complete frames will be written.
1186  * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion.
1187  * @return The number of frames actually read or a negative error.
1188  */
1189 AAUDIO_API aaudio_result_t AAudioStream_read(AAudioStream* stream,
1190         void *buffer, int32_t numFrames, int64_t timeoutNanoseconds) __INTRODUCED_IN(26);
1191 
1192 /**
1193  * Write data to the stream.
1194  *
1195  * The call will wait until the write is complete or until it runs out of time.
1196  * If timeoutNanos is zero then this call will not wait.
1197  *
1198  * Note that timeoutNanoseconds is a relative duration in wall clock time.
1199  * Time will not stop if the thread is asleep.
1200  * So it will be implemented using CLOCK_BOOTTIME.
1201  *
1202  * This call is "strong non-blocking" unless it has to wait for room in the buffer.
1203  *
1204  * If the call times out then zero or a partial frame count will be returned.
1205  *
1206  * Available since API level 26.
1207  *
1208  * @param stream A stream created using AAudioStreamBuilder_openStream().
1209  * @param buffer The address of the first sample.
1210  * @param numFrames Number of frames to write. Only complete frames will be written.
1211  * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion.
1212  * @return The number of frames actually written or a negative error.
1213  */
1214 AAUDIO_API aaudio_result_t AAudioStream_write(AAudioStream* stream,
1215         const void *buffer, int32_t numFrames, int64_t timeoutNanoseconds) __INTRODUCED_IN(26);
1216 
1217 // ============================================================
1218 // Stream - queries
1219 // ============================================================
1220 
1221 /**
1222  * This can be used to adjust the latency of the buffer by changing
1223  * the threshold where blocking will occur.
1224  * By combining this with AAudioStream_getXRunCount(), the latency can be tuned
1225  * at run-time for each device.
1226  *
1227  * This cannot be set higher than AAudioStream_getBufferCapacityInFrames().
1228  *
1229  * Note that you will probably not get the exact size you request.
1230  * You can check the return value or call AAudioStream_getBufferSizeInFrames()
1231  * to see what the actual final size is.
1232  *
1233  * Available since API level 26.
1234  *
1235  * @param stream reference provided by AAudioStreamBuilder_openStream()
1236  * @param numFrames requested number of frames that can be filled without blocking
1237  * @return actual buffer size in frames or a negative error
1238  */
1239 AAUDIO_API aaudio_result_t AAudioStream_setBufferSizeInFrames(AAudioStream* stream,
1240         int32_t numFrames) __INTRODUCED_IN(26);
1241 
1242 /**
1243  * Query the maximum number of frames that can be filled without blocking.
1244  *
1245  * Available since API level 26.
1246  *
1247  * @param stream reference provided by AAudioStreamBuilder_openStream()
1248  * @return buffer size in frames.
1249  */
1250 AAUDIO_API int32_t AAudioStream_getBufferSizeInFrames(AAudioStream* stream) __INTRODUCED_IN(26);
1251 
1252 /**
1253  * Query the number of frames that the application should read or write at
1254  * one time for optimal performance. It is OK if an application writes
1255  * a different number of frames. But the buffer size may need to be larger
1256  * in order to avoid underruns or overruns.
1257  *
1258  * Note that this may or may not match the actual device burst size.
1259  * For some endpoints, the burst size can vary dynamically.
1260  * But these tend to be devices with high latency.
1261  *
1262  * Available since API level 26.
1263  *
1264  * @param stream reference provided by AAudioStreamBuilder_openStream()
1265  * @return burst size
1266  */
1267 AAUDIO_API int32_t AAudioStream_getFramesPerBurst(AAudioStream* stream) __INTRODUCED_IN(26);
1268 
1269 /**
1270  * Query maximum buffer capacity in frames.
1271  *
1272  * Available since API level 26.
1273  *
1274  * @param stream reference provided by AAudioStreamBuilder_openStream()
1275  * @return  buffer capacity in frames
1276  */
1277 AAUDIO_API int32_t AAudioStream_getBufferCapacityInFrames(AAudioStream* stream) __INTRODUCED_IN(26);
1278 
1279 /**
1280  * Query the size of the buffer that will be passed to the dataProc callback
1281  * in the numFrames parameter.
1282  *
1283  * This call can be used if the application needs to know the value of numFrames before
1284  * the stream is started. This is not normally necessary.
1285  *
1286  * If a specific size was requested by calling
1287  * AAudioStreamBuilder_setFramesPerDataCallback() then this will be the same size.
1288  *
1289  * If AAudioStreamBuilder_setFramesPerDataCallback() was not called then this will
1290  * return the size chosen by AAudio, or {@link #AAUDIO_UNSPECIFIED}.
1291  *
1292  * {@link #AAUDIO_UNSPECIFIED} indicates that the callback buffer size for this stream
1293  * may vary from one dataProc callback to the next.
1294  *
1295  * Available since API level 26.
1296  *
1297  * @param stream reference provided by AAudioStreamBuilder_openStream()
1298  * @return callback buffer size in frames or {@link #AAUDIO_UNSPECIFIED}
1299  */
1300 AAUDIO_API int32_t AAudioStream_getFramesPerDataCallback(AAudioStream* stream) __INTRODUCED_IN(26);
1301 
1302 /**
1303  * An XRun is an Underrun or an Overrun.
1304  * During playing, an underrun will occur if the stream is not written in time
1305  * and the system runs out of valid data.
1306  * During recording, an overrun will occur if the stream is not read in time
1307  * and there is no place to put the incoming data so it is discarded.
1308  *
1309  * An underrun or overrun can cause an audible "pop" or "glitch".
1310  *
1311  * Note that some INPUT devices may not support this function.
1312  * In that case a 0 will always be returned.
1313  *
1314  * Available since API level 26.
1315  *
1316  * @param stream reference provided by AAudioStreamBuilder_openStream()
1317  * @return the underrun or overrun count
1318  */
1319 AAUDIO_API int32_t AAudioStream_getXRunCount(AAudioStream* stream) __INTRODUCED_IN(26);
1320 
1321 /**
1322  * Available since API level 26.
1323  *
1324  * @param stream reference provided by AAudioStreamBuilder_openStream()
1325  * @return actual sample rate
1326  */
1327 AAUDIO_API int32_t AAudioStream_getSampleRate(AAudioStream* stream) __INTRODUCED_IN(26);
1328 
1329 /**
1330  * A stream has one or more channels of data.
1331  * A frame will contain one sample for each channel.
1332  *
1333  * Available since API level 26.
1334  *
1335  * @param stream reference provided by AAudioStreamBuilder_openStream()
1336  * @return actual number of channels
1337  */
1338 AAUDIO_API int32_t AAudioStream_getChannelCount(AAudioStream* stream) __INTRODUCED_IN(26);
1339 
1340 /**
1341  * Identical to AAudioStream_getChannelCount().
1342  *
1343  * Available since API level 26.
1344  *
1345  * @param stream reference provided by AAudioStreamBuilder_openStream()
1346  * @return actual number of samples frame
1347  */
1348 AAUDIO_API int32_t AAudioStream_getSamplesPerFrame(AAudioStream* stream) __INTRODUCED_IN(26);
1349 
1350 /**
1351  * Available since API level 26.
1352  *
1353  * @param stream reference provided by AAudioStreamBuilder_openStream()
1354  * @return actual device ID
1355  */
1356 AAUDIO_API int32_t AAudioStream_getDeviceId(AAudioStream* stream) __INTRODUCED_IN(26);
1357 
1358 /**
1359  * Available since API level 26.
1360  *
1361  * @param stream reference provided by AAudioStreamBuilder_openStream()
1362  * @return actual data format
1363  */
1364 AAUDIO_API aaudio_format_t AAudioStream_getFormat(AAudioStream* stream) __INTRODUCED_IN(26);
1365 
1366 /**
1367  * Provide actual sharing mode.
1368  *
1369  * Available since API level 26.
1370  *
1371  * @param stream reference provided by AAudioStreamBuilder_openStream()
1372  * @return  actual sharing mode
1373  */
1374 AAUDIO_API aaudio_sharing_mode_t AAudioStream_getSharingMode(AAudioStream* stream)
1375         __INTRODUCED_IN(26);
1376 
1377 /**
1378  * Get the performance mode used by the stream.
1379  *
1380  * Available since API level 26.
1381  *
1382  * @param stream reference provided by AAudioStreamBuilder_openStream()
1383  */
1384 AAUDIO_API aaudio_performance_mode_t AAudioStream_getPerformanceMode(AAudioStream* stream)
1385         __INTRODUCED_IN(26);
1386 
1387 /**
1388  * Available since API level 26.
1389  *
1390  * @param stream reference provided by AAudioStreamBuilder_openStream()
1391  * @return direction
1392  */
1393 AAUDIO_API aaudio_direction_t AAudioStream_getDirection(AAudioStream* stream) __INTRODUCED_IN(26);
1394 
1395 /**
1396  * Passes back the number of frames that have been written since the stream was created.
1397  * For an output stream, this will be advanced by the application calling write()
1398  * or by a data callback.
1399  * For an input stream, this will be advanced by the endpoint.
1400  *
1401  * The frame position is monotonically increasing.
1402  *
1403  * Available since API level 26.
1404  *
1405  * @param stream reference provided by AAudioStreamBuilder_openStream()
1406  * @return frames written
1407  */
1408 AAUDIO_API int64_t AAudioStream_getFramesWritten(AAudioStream* stream) __INTRODUCED_IN(26);
1409 
1410 /**
1411  * Passes back the number of frames that have been read since the stream was created.
1412  * For an output stream, this will be advanced by the endpoint.
1413  * For an input stream, this will be advanced by the application calling read()
1414  * or by a data callback.
1415  *
1416  * The frame position is monotonically increasing.
1417  *
1418  * Available since API level 26.
1419  *
1420  * @param stream reference provided by AAudioStreamBuilder_openStream()
1421  * @return frames read
1422  */
1423 AAUDIO_API int64_t AAudioStream_getFramesRead(AAudioStream* stream) __INTRODUCED_IN(26);
1424 
1425 /**
1426  * Passes back the session ID associated with this stream.
1427  *
1428  * The session ID can be used to associate a stream with effects processors.
1429  * The effects are controlled using the Android AudioEffect Java API.
1430  *
1431  * If AAudioStreamBuilder_setSessionId() was
1432  * called with {@link #AAUDIO_SESSION_ID_ALLOCATE}
1433  * then a new session ID should be allocated once when the stream is opened.
1434  *
1435  * If AAudioStreamBuilder_setSessionId() was called with a previously allocated
1436  * session ID then that value should be returned.
1437  *
1438  * If AAudioStreamBuilder_setSessionId() was not called then this function should
1439  * return {@link #AAUDIO_SESSION_ID_NONE}.
1440  *
1441  * The sessionID for a stream should not change once the stream has been opened.
1442  *
1443  * Available since API level 28.
1444  *
1445  * @param stream reference provided by AAudioStreamBuilder_openStream()
1446  * @return session ID or {@link #AAUDIO_SESSION_ID_NONE}
1447  */
1448 AAUDIO_API aaudio_session_id_t AAudioStream_getSessionId(AAudioStream* stream) __INTRODUCED_IN(28);
1449 
1450 /**
1451  * Passes back the time at which a particular frame was presented.
1452  * This can be used to synchronize audio with video or MIDI.
1453  * It can also be used to align a recorded stream with a playback stream.
1454  *
1455  * Timestamps are only valid when the stream is in {@link #AAUDIO_STREAM_STATE_STARTED}.
1456  * {@link #AAUDIO_ERROR_INVALID_STATE} will be returned if the stream is not started.
1457  * Note that because requestStart() is asynchronous, timestamps will not be valid until
1458  * a short time after calling requestStart().
1459  * So {@link #AAUDIO_ERROR_INVALID_STATE} should not be considered a fatal error.
1460  * Just try calling again later.
1461  *
1462  * If an error occurs, then the position and time will not be modified.
1463  *
1464  * The position and time passed back are monotonically increasing.
1465  *
1466  * Available since API level 26.
1467  *
1468  * @param stream reference provided by AAudioStreamBuilder_openStream()
1469  * @param clockid CLOCK_MONOTONIC or CLOCK_BOOTTIME
1470  * @param framePosition pointer to a variable to receive the position
1471  * @param timeNanoseconds pointer to a variable to receive the time
1472  * @return {@link #AAUDIO_OK} or a negative error
1473  */
1474 AAUDIO_API aaudio_result_t AAudioStream_getTimestamp(AAudioStream* stream,
1475         clockid_t clockid, int64_t *framePosition, int64_t *timeNanoseconds) __INTRODUCED_IN(26);
1476 
1477 /**
1478  * Return the use case for the stream.
1479  *
1480  * Available since API level 28.
1481  *
1482  * @param stream reference provided by AAudioStreamBuilder_openStream()
1483  * @return frames read
1484  */
1485 AAUDIO_API aaudio_usage_t AAudioStream_getUsage(AAudioStream* stream) __INTRODUCED_IN(28);
1486 
1487 /**
1488  * Return the content type for the stream.
1489  *
1490  * Available since API level 28.
1491  *
1492  * @param stream reference provided by AAudioStreamBuilder_openStream()
1493  * @return content type, for example {@link #AAUDIO_CONTENT_TYPE_MUSIC}
1494  */
1495 AAUDIO_API aaudio_content_type_t AAudioStream_getContentType(AAudioStream* stream)
1496         __INTRODUCED_IN(28);
1497 
1498 /**
1499  * Return the input preset for the stream.
1500  *
1501  * Available since API level 28.
1502  *
1503  * @param stream reference provided by AAudioStreamBuilder_openStream()
1504  * @return input preset, for example {@link #AAUDIO_INPUT_PRESET_CAMCORDER}
1505  */
1506 AAUDIO_API aaudio_input_preset_t AAudioStream_getInputPreset(AAudioStream* stream)
1507         __INTRODUCED_IN(28);
1508 
1509 /**
1510  * Return the policy that determines whether the audio may or may not be captured
1511  * by other apps or the system.
1512  *
1513  * Available since API level 29.
1514  *
1515  * @param stream reference provided by AAudioStreamBuilder_openStream()
1516  * @return the allowed capture policy, for example {@link #AAUDIO_ALLOW_CAPTURE_BY_ALL}
1517  */
1518 AAUDIO_API aaudio_allowed_capture_policy_t AAudioStream_getAllowedCapturePolicy(
1519         AAudioStream* stream) __INTRODUCED_IN(29);
1520 
1521 
1522 /**
1523  * Return whether this input stream is marked as privacy sensitive or not.
1524  *
1525  * See {@link #AAudioStreamBuilder_setPrivacySensitive()}.
1526  *
1527  * Added in API level 30.
1528  *
1529  * @param stream reference provided by AAudioStreamBuilder_openStream()
1530  * @return true if privacy sensitive, false otherwise
1531  */
1532 AAUDIO_API bool AAudioStream_isPrivacySensitive(AAudioStream* stream)
1533         __INTRODUCED_IN(30);
1534 
1535 #ifdef __cplusplus
1536 }
1537 #endif
1538 
1539 #endif //AAUDIO_AAUDIO_H
1540 
1541 /** @} */
1542