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