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  * @param stream reference provided by AAudioStreamBuilder_openStream()
1039  * @return {@link #AAUDIO_OK} or a negative error.
1040  */
1041 AAUDIO_API aaudio_result_t  AAudioStream_release(AAudioStream* stream) __INTRODUCED_IN(30);
1042 #endif // __ANDROID_API__
1043 
1044 /**
1045  * Delete the internal data structures associated with the stream created
1046  * by AAudioStreamBuilder_openStream().
1047  *
1048  * If AAudioStream_release() has not been called then it will be called automatically.
1049  *
1050  * @param stream reference provided by AAudioStreamBuilder_openStream()
1051  * @return {@link #AAUDIO_OK} or a negative error.
1052  */
1053 AAUDIO_API aaudio_result_t  AAudioStream_close(AAudioStream* stream) __INTRODUCED_IN(26);
1054 
1055 /**
1056  * Asynchronously request to start playing the stream. For output streams, one should
1057  * write to the stream to fill the buffer before starting.
1058  * Otherwise it will underflow.
1059  * After this call the state will be in {@link #AAUDIO_STREAM_STATE_STARTING} or
1060  * {@link #AAUDIO_STREAM_STATE_STARTED}.
1061  *
1062  * Available since API level 26.
1063  *
1064  * @param stream reference provided by AAudioStreamBuilder_openStream()
1065  * @return {@link #AAUDIO_OK} or a negative error.
1066  */
1067 AAUDIO_API aaudio_result_t  AAudioStream_requestStart(AAudioStream* stream) __INTRODUCED_IN(26);
1068 
1069 /**
1070  * Asynchronous request for the stream to pause.
1071  * Pausing a stream will freeze the data flow but not flush any buffers.
1072  * Use AAudioStream_requestStart() to resume playback after a pause.
1073  * After this call the state will be in {@link #AAUDIO_STREAM_STATE_PAUSING} or
1074  * {@link #AAUDIO_STREAM_STATE_PAUSED}.
1075  *
1076  * This will return {@link #AAUDIO_ERROR_UNIMPLEMENTED} for input streams.
1077  * For input streams use AAudioStream_requestStop().
1078  *
1079  * Available since API level 26.
1080  *
1081  * @param stream reference provided by AAudioStreamBuilder_openStream()
1082  * @return {@link #AAUDIO_OK} or a negative error.
1083  */
1084 AAUDIO_API aaudio_result_t  AAudioStream_requestPause(AAudioStream* stream) __INTRODUCED_IN(26);
1085 
1086 /**
1087  * Asynchronous request for the stream to flush.
1088  * Flushing will discard any pending data.
1089  * This call only works if the stream is pausing or paused. TODO review
1090  * Frame counters are not reset by a flush. They may be advanced.
1091  * After this call the state will be in {@link #AAUDIO_STREAM_STATE_FLUSHING} or
1092  * {@link #AAUDIO_STREAM_STATE_FLUSHED}.
1093  *
1094  * This will return {@link #AAUDIO_ERROR_UNIMPLEMENTED} for input streams.
1095  *
1096  * Available since API level 26.
1097  *
1098  * @param stream reference provided by AAudioStreamBuilder_openStream()
1099  * @return {@link #AAUDIO_OK} or a negative error.
1100  */
1101 AAUDIO_API aaudio_result_t  AAudioStream_requestFlush(AAudioStream* stream) __INTRODUCED_IN(26);
1102 
1103 /**
1104  * Asynchronous request for the stream to stop.
1105  * The stream will stop after all of the data currently buffered has been played.
1106  * After this call the state will be in {@link #AAUDIO_STREAM_STATE_STOPPING} or
1107  * {@link #AAUDIO_STREAM_STATE_STOPPED}.
1108  *
1109  * Available since API level 26.
1110  *
1111  * @param stream reference provided by AAudioStreamBuilder_openStream()
1112  * @return {@link #AAUDIO_OK} or a negative error.
1113  */
1114 AAUDIO_API aaudio_result_t  AAudioStream_requestStop(AAudioStream* stream) __INTRODUCED_IN(26);
1115 
1116 /**
1117  * Query the current state of the client, eg. {@link #AAUDIO_STREAM_STATE_PAUSING}
1118  *
1119  * This function will immediately return the state without updating the state.
1120  * If you want to update the client state based on the server state then
1121  * call AAudioStream_waitForStateChange() with currentState
1122  * set to {@link #AAUDIO_STREAM_STATE_UNKNOWN} and a zero timeout.
1123  *
1124  * Available since API level 26.
1125  *
1126  * @param stream reference provided by AAudioStreamBuilder_openStream()
1127  */
1128 AAUDIO_API aaudio_stream_state_t AAudioStream_getState(AAudioStream* stream) __INTRODUCED_IN(26);
1129 
1130 /**
1131  * Wait until the current state no longer matches the input state.
1132  *
1133  * This will update the current client state.
1134  *
1135  * <pre><code>
1136  * aaudio_result_t result = AAUDIO_OK;
1137  * aaudio_stream_state_t currentState = AAudioStream_getState(stream);
1138  * aaudio_stream_state_t inputState = currentState;
1139  * while (result == AAUDIO_OK && currentState != AAUDIO_STREAM_STATE_PAUSED) {
1140  *     result = AAudioStream_waitForStateChange(
1141  *                                   stream, inputState, &currentState, MY_TIMEOUT_NANOS);
1142  *     inputState = currentState;
1143  * }
1144  * </code></pre>
1145  *
1146  * Available since API level 26.
1147  *
1148  * @param stream A reference provided by AAudioStreamBuilder_openStream()
1149  * @param inputState The state we want to avoid.
1150  * @param nextState Pointer to a variable that will be set to the new state.
1151  * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion.
1152  * @return {@link #AAUDIO_OK} or a negative error.
1153  */
1154 AAUDIO_API aaudio_result_t AAudioStream_waitForStateChange(AAudioStream* stream,
1155         aaudio_stream_state_t inputState, aaudio_stream_state_t *nextState,
1156         int64_t timeoutNanoseconds) __INTRODUCED_IN(26);
1157 
1158 // ============================================================
1159 // Stream I/O
1160 // ============================================================
1161 
1162 /**
1163  * Read data from the stream.
1164  *
1165  * The call will wait until the read is complete or until it runs out of time.
1166  * If timeoutNanos is zero then this call will not wait.
1167  *
1168  * Note that timeoutNanoseconds is a relative duration in wall clock time.
1169  * Time will not stop if the thread is asleep.
1170  * So it will be implemented using CLOCK_BOOTTIME.
1171  *
1172  * This call is "strong non-blocking" unless it has to wait for data.
1173  *
1174  * If the call times out then zero or a partial frame count will be returned.
1175  *
1176  * Available since API level 26.
1177  *
1178  * @param stream A stream created using AAudioStreamBuilder_openStream().
1179  * @param buffer The address of the first sample.
1180  * @param numFrames Number of frames to read. Only complete frames will be written.
1181  * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion.
1182  * @return The number of frames actually read or a negative error.
1183  */
1184 AAUDIO_API aaudio_result_t AAudioStream_read(AAudioStream* stream,
1185         void *buffer, int32_t numFrames, int64_t timeoutNanoseconds) __INTRODUCED_IN(26);
1186 
1187 /**
1188  * Write data to the stream.
1189  *
1190  * The call will wait until the write is complete or until it runs out of time.
1191  * If timeoutNanos is zero then this call will not wait.
1192  *
1193  * Note that timeoutNanoseconds is a relative duration in wall clock time.
1194  * Time will not stop if the thread is asleep.
1195  * So it will be implemented using CLOCK_BOOTTIME.
1196  *
1197  * This call is "strong non-blocking" unless it has to wait for room in the buffer.
1198  *
1199  * If the call times out then zero or a partial frame count will be returned.
1200  *
1201  * Available since API level 26.
1202  *
1203  * @param stream A stream created using AAudioStreamBuilder_openStream().
1204  * @param buffer The address of the first sample.
1205  * @param numFrames Number of frames to write. Only complete frames will be written.
1206  * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion.
1207  * @return The number of frames actually written or a negative error.
1208  */
1209 AAUDIO_API aaudio_result_t AAudioStream_write(AAudioStream* stream,
1210         const void *buffer, int32_t numFrames, int64_t timeoutNanoseconds) __INTRODUCED_IN(26);
1211 
1212 // ============================================================
1213 // Stream - queries
1214 // ============================================================
1215 
1216 /**
1217  * This can be used to adjust the latency of the buffer by changing
1218  * the threshold where blocking will occur.
1219  * By combining this with AAudioStream_getXRunCount(), the latency can be tuned
1220  * at run-time for each device.
1221  *
1222  * This cannot be set higher than AAudioStream_getBufferCapacityInFrames().
1223  *
1224  * Note that you will probably not get the exact size you request.
1225  * You can check the return value or call AAudioStream_getBufferSizeInFrames()
1226  * to see what the actual final size is.
1227  *
1228  * Available since API level 26.
1229  *
1230  * @param stream reference provided by AAudioStreamBuilder_openStream()
1231  * @param numFrames requested number of frames that can be filled without blocking
1232  * @return actual buffer size in frames or a negative error
1233  */
1234 AAUDIO_API aaudio_result_t AAudioStream_setBufferSizeInFrames(AAudioStream* stream,
1235         int32_t numFrames) __INTRODUCED_IN(26);
1236 
1237 /**
1238  * Query the maximum number of frames that can be filled without blocking.
1239  *
1240  * Available since API level 26.
1241  *
1242  * @param stream reference provided by AAudioStreamBuilder_openStream()
1243  * @return buffer size in frames.
1244  */
1245 AAUDIO_API int32_t AAudioStream_getBufferSizeInFrames(AAudioStream* stream) __INTRODUCED_IN(26);
1246 
1247 /**
1248  * Query the number of frames that the application should read or write at
1249  * one time for optimal performance. It is OK if an application writes
1250  * a different number of frames. But the buffer size may need to be larger
1251  * in order to avoid underruns or overruns.
1252  *
1253  * Note that this may or may not match the actual device burst size.
1254  * For some endpoints, the burst size can vary dynamically.
1255  * But these tend to be devices with high latency.
1256  *
1257  * Available since API level 26.
1258  *
1259  * @param stream reference provided by AAudioStreamBuilder_openStream()
1260  * @return burst size
1261  */
1262 AAUDIO_API int32_t AAudioStream_getFramesPerBurst(AAudioStream* stream) __INTRODUCED_IN(26);
1263 
1264 /**
1265  * Query maximum buffer capacity in frames.
1266  *
1267  * Available since API level 26.
1268  *
1269  * @param stream reference provided by AAudioStreamBuilder_openStream()
1270  * @return  buffer capacity in frames
1271  */
1272 AAUDIO_API int32_t AAudioStream_getBufferCapacityInFrames(AAudioStream* stream) __INTRODUCED_IN(26);
1273 
1274 /**
1275  * Query the size of the buffer that will be passed to the dataProc callback
1276  * in the numFrames parameter.
1277  *
1278  * This call can be used if the application needs to know the value of numFrames before
1279  * the stream is started. This is not normally necessary.
1280  *
1281  * If a specific size was requested by calling
1282  * AAudioStreamBuilder_setFramesPerDataCallback() then this will be the same size.
1283  *
1284  * If AAudioStreamBuilder_setFramesPerDataCallback() was not called then this will
1285  * return the size chosen by AAudio, or {@link #AAUDIO_UNSPECIFIED}.
1286  *
1287  * {@link #AAUDIO_UNSPECIFIED} indicates that the callback buffer size for this stream
1288  * may vary from one dataProc callback to the next.
1289  *
1290  * Available since API level 26.
1291  *
1292  * @param stream reference provided by AAudioStreamBuilder_openStream()
1293  * @return callback buffer size in frames or {@link #AAUDIO_UNSPECIFIED}
1294  */
1295 AAUDIO_API int32_t AAudioStream_getFramesPerDataCallback(AAudioStream* stream) __INTRODUCED_IN(26);
1296 
1297 /**
1298  * An XRun is an Underrun or an Overrun.
1299  * During playing, an underrun will occur if the stream is not written in time
1300  * and the system runs out of valid data.
1301  * During recording, an overrun will occur if the stream is not read in time
1302  * and there is no place to put the incoming data so it is discarded.
1303  *
1304  * An underrun or overrun can cause an audible "pop" or "glitch".
1305  *
1306  * Note that some INPUT devices may not support this function.
1307  * In that case a 0 will always be returned.
1308  *
1309  * Available since API level 26.
1310  *
1311  * @param stream reference provided by AAudioStreamBuilder_openStream()
1312  * @return the underrun or overrun count
1313  */
1314 AAUDIO_API int32_t AAudioStream_getXRunCount(AAudioStream* stream) __INTRODUCED_IN(26);
1315 
1316 /**
1317  * Available since API level 26.
1318  *
1319  * @param stream reference provided by AAudioStreamBuilder_openStream()
1320  * @return actual sample rate
1321  */
1322 AAUDIO_API int32_t AAudioStream_getSampleRate(AAudioStream* stream) __INTRODUCED_IN(26);
1323 
1324 /**
1325  * A stream has one or more channels of data.
1326  * A frame will contain one sample for each channel.
1327  *
1328  * Available since API level 26.
1329  *
1330  * @param stream reference provided by AAudioStreamBuilder_openStream()
1331  * @return actual number of channels
1332  */
1333 AAUDIO_API int32_t AAudioStream_getChannelCount(AAudioStream* stream) __INTRODUCED_IN(26);
1334 
1335 /**
1336  * Identical to AAudioStream_getChannelCount().
1337  *
1338  * Available since API level 26.
1339  *
1340  * @param stream reference provided by AAudioStreamBuilder_openStream()
1341  * @return actual number of samples frame
1342  */
1343 AAUDIO_API int32_t AAudioStream_getSamplesPerFrame(AAudioStream* stream) __INTRODUCED_IN(26);
1344 
1345 /**
1346  * Available since API level 26.
1347  *
1348  * @param stream reference provided by AAudioStreamBuilder_openStream()
1349  * @return actual device ID
1350  */
1351 AAUDIO_API int32_t AAudioStream_getDeviceId(AAudioStream* stream) __INTRODUCED_IN(26);
1352 
1353 /**
1354  * Available since API level 26.
1355  *
1356  * @param stream reference provided by AAudioStreamBuilder_openStream()
1357  * @return actual data format
1358  */
1359 AAUDIO_API aaudio_format_t AAudioStream_getFormat(AAudioStream* stream) __INTRODUCED_IN(26);
1360 
1361 /**
1362  * Provide actual sharing mode.
1363  *
1364  * Available since API level 26.
1365  *
1366  * @param stream reference provided by AAudioStreamBuilder_openStream()
1367  * @return  actual sharing mode
1368  */
1369 AAUDIO_API aaudio_sharing_mode_t AAudioStream_getSharingMode(AAudioStream* stream)
1370         __INTRODUCED_IN(26);
1371 
1372 /**
1373  * Get the performance mode used by the stream.
1374  *
1375  * Available since API level 26.
1376  *
1377  * @param stream reference provided by AAudioStreamBuilder_openStream()
1378  */
1379 AAUDIO_API aaudio_performance_mode_t AAudioStream_getPerformanceMode(AAudioStream* stream)
1380         __INTRODUCED_IN(26);
1381 
1382 /**
1383  * Available since API level 26.
1384  *
1385  * @param stream reference provided by AAudioStreamBuilder_openStream()
1386  * @return direction
1387  */
1388 AAUDIO_API aaudio_direction_t AAudioStream_getDirection(AAudioStream* stream) __INTRODUCED_IN(26);
1389 
1390 /**
1391  * Passes back the number of frames that have been written since the stream was created.
1392  * For an output stream, this will be advanced by the application calling write()
1393  * or by a data callback.
1394  * For an input stream, this will be advanced by the endpoint.
1395  *
1396  * The frame position is monotonically increasing.
1397  *
1398  * Available since API level 26.
1399  *
1400  * @param stream reference provided by AAudioStreamBuilder_openStream()
1401  * @return frames written
1402  */
1403 AAUDIO_API int64_t AAudioStream_getFramesWritten(AAudioStream* stream) __INTRODUCED_IN(26);
1404 
1405 /**
1406  * Passes back the number of frames that have been read since the stream was created.
1407  * For an output stream, this will be advanced by the endpoint.
1408  * For an input stream, this will be advanced by the application calling read()
1409  * or by a data callback.
1410  *
1411  * The frame position is monotonically increasing.
1412  *
1413  * Available since API level 26.
1414  *
1415  * @param stream reference provided by AAudioStreamBuilder_openStream()
1416  * @return frames read
1417  */
1418 AAUDIO_API int64_t AAudioStream_getFramesRead(AAudioStream* stream) __INTRODUCED_IN(26);
1419 
1420 /**
1421  * Passes back the session ID associated with this stream.
1422  *
1423  * The session ID can be used to associate a stream with effects processors.
1424  * The effects are controlled using the Android AudioEffect Java API.
1425  *
1426  * If AAudioStreamBuilder_setSessionId() was
1427  * called with {@link #AAUDIO_SESSION_ID_ALLOCATE}
1428  * then a new session ID should be allocated once when the stream is opened.
1429  *
1430  * If AAudioStreamBuilder_setSessionId() was called with a previously allocated
1431  * session ID then that value should be returned.
1432  *
1433  * If AAudioStreamBuilder_setSessionId() was not called then this function should
1434  * return {@link #AAUDIO_SESSION_ID_NONE}.
1435  *
1436  * The sessionID for a stream should not change once the stream has been opened.
1437  *
1438  * Available since API level 28.
1439  *
1440  * @param stream reference provided by AAudioStreamBuilder_openStream()
1441  * @return session ID or {@link #AAUDIO_SESSION_ID_NONE}
1442  */
1443 AAUDIO_API aaudio_session_id_t AAudioStream_getSessionId(AAudioStream* stream) __INTRODUCED_IN(28);
1444 
1445 /**
1446  * Passes back the time at which a particular frame was presented.
1447  * This can be used to synchronize audio with video or MIDI.
1448  * It can also be used to align a recorded stream with a playback stream.
1449  *
1450  * Timestamps are only valid when the stream is in {@link #AAUDIO_STREAM_STATE_STARTED}.
1451  * {@link #AAUDIO_ERROR_INVALID_STATE} will be returned if the stream is not started.
1452  * Note that because requestStart() is asynchronous, timestamps will not be valid until
1453  * a short time after calling requestStart().
1454  * So {@link #AAUDIO_ERROR_INVALID_STATE} should not be considered a fatal error.
1455  * Just try calling again later.
1456  *
1457  * If an error occurs, then the position and time will not be modified.
1458  *
1459  * The position and time passed back are monotonically increasing.
1460  *
1461  * Available since API level 26.
1462  *
1463  * @param stream reference provided by AAudioStreamBuilder_openStream()
1464  * @param clockid CLOCK_MONOTONIC or CLOCK_BOOTTIME
1465  * @param framePosition pointer to a variable to receive the position
1466  * @param timeNanoseconds pointer to a variable to receive the time
1467  * @return {@link #AAUDIO_OK} or a negative error
1468  */
1469 AAUDIO_API aaudio_result_t AAudioStream_getTimestamp(AAudioStream* stream,
1470         clockid_t clockid, int64_t *framePosition, int64_t *timeNanoseconds) __INTRODUCED_IN(26);
1471 
1472 /**
1473  * Return the use case for the stream.
1474  *
1475  * Available since API level 28.
1476  *
1477  * @param stream reference provided by AAudioStreamBuilder_openStream()
1478  * @return frames read
1479  */
1480 AAUDIO_API aaudio_usage_t AAudioStream_getUsage(AAudioStream* stream) __INTRODUCED_IN(28);
1481 
1482 /**
1483  * Return the content type for the stream.
1484  *
1485  * Available since API level 28.
1486  *
1487  * @param stream reference provided by AAudioStreamBuilder_openStream()
1488  * @return content type, for example {@link #AAUDIO_CONTENT_TYPE_MUSIC}
1489  */
1490 AAUDIO_API aaudio_content_type_t AAudioStream_getContentType(AAudioStream* stream)
1491         __INTRODUCED_IN(28);
1492 
1493 /**
1494  * Return the input preset for the stream.
1495  *
1496  * Available since API level 28.
1497  *
1498  * @param stream reference provided by AAudioStreamBuilder_openStream()
1499  * @return input preset, for example {@link #AAUDIO_INPUT_PRESET_CAMCORDER}
1500  */
1501 AAUDIO_API aaudio_input_preset_t AAudioStream_getInputPreset(AAudioStream* stream)
1502         __INTRODUCED_IN(28);
1503 
1504 /**
1505  * Return the policy that determines whether the audio may or may not be captured
1506  * by other apps or the system.
1507  *
1508  * Available since API level 29.
1509  *
1510  * @param stream reference provided by AAudioStreamBuilder_openStream()
1511  * @return the allowed capture policy, for example {@link #AAUDIO_ALLOW_CAPTURE_BY_ALL}
1512  */
1513 AAUDIO_API aaudio_allowed_capture_policy_t AAudioStream_getAllowedCapturePolicy(
1514         AAudioStream* stream) __INTRODUCED_IN(29);
1515 
1516 
1517 /**
1518  * Return whether this input stream is marked as privacy sensitive or not.
1519  *
1520  * See {@link #AAudioStreamBuilder_setPrivacySensitive()}.
1521  *
1522  * Added in API level 30.
1523  *
1524  * @param stream reference provided by AAudioStreamBuilder_openStream()
1525  * @return true if privacy sensitive, false otherwise
1526  */
1527 AAUDIO_API bool AAudioStream_isPrivacySensitive(AAudioStream* stream)
1528         __INTRODUCED_IN(30);
1529 
1530 #ifdef __cplusplus
1531 }
1532 #endif
1533 
1534 #endif //AAUDIO_AAUDIO_H
1535 
1536 /** @} */
1537