| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 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 | /** | 
| Phil Burk | a45be8b | 2017-04-05 14:45:48 -0700 | [diff] [blame] | 18 | * @addtogroup Audio | 
|  | 19 | * @{ | 
|  | 20 | */ | 
|  | 21 |  | 
|  | 22 | /** | 
|  | 23 | * @file AAudio.h | 
|  | 24 | */ | 
|  | 25 |  | 
|  | 26 | /** | 
|  | 27 | * This is the 'C' API for AAudio. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 28 | */ | 
|  | 29 | #ifndef AAUDIO_AAUDIO_H | 
|  | 30 | #define AAUDIO_AAUDIO_H | 
|  | 31 |  | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 32 | #include <time.h> | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 33 |  | 
|  | 34 | #ifdef __cplusplus | 
|  | 35 | extern "C" { | 
|  | 36 | #endif | 
|  | 37 |  | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 38 | /** | 
|  | 39 | * This is used to represent a value that has not been specified. | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 40 | * For example, an application could use {@link #AAUDIO_UNSPECIFIED} to indicate | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 41 | * that is did not not care what the specific value of a parameter was | 
|  | 42 | * and would accept whatever it was given. | 
|  | 43 | */ | 
|  | 44 | #define AAUDIO_UNSPECIFIED           0 | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 45 |  | 
|  | 46 | enum { | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 47 | /** | 
|  | 48 | * Audio data will travel out of the device, for example through a speaker. | 
|  | 49 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 50 | AAUDIO_DIRECTION_OUTPUT, | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 51 |  | 
|  | 52 |  | 
|  | 53 | /** | 
|  | 54 | * Audio data will travel into the device, for example from a microphone. | 
|  | 55 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 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, | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 63 |  | 
|  | 64 | /** | 
|  | 65 | * This format uses the int16_t data type. | 
|  | 66 | * The maximum range of the data is -32768 to 32767. | 
|  | 67 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 68 | AAUDIO_FORMAT_PCM_I16, | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 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 | */ | 
| Phil Burk | 7473345 | 2017-04-18 19:50:28 -0700 | [diff] [blame] | 78 | AAUDIO_FORMAT_PCM_FLOAT | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 79 | }; | 
|  | 80 | typedef int32_t aaudio_format_t; | 
|  | 81 |  | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 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 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 87 | enum { | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 88 | /** | 
|  | 89 | * The call was successful. | 
|  | 90 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 91 | AAUDIO_OK, | 
|  | 92 | AAUDIO_ERROR_BASE = -900, // TODO review | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 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 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 101 | AAUDIO_ERROR_DISCONNECTED, | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 102 |  | 
|  | 103 | /** | 
|  | 104 | * An invalid parameter was passed to AAudio. | 
|  | 105 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 106 | AAUDIO_ERROR_ILLEGAL_ARGUMENT, | 
| Phil Burk | 17fff38 | 2017-05-16 14:06:45 -0700 | [diff] [blame] | 107 | // reserved | 
|  | 108 | AAUDIO_ERROR_INTERNAL = AAUDIO_ERROR_ILLEGAL_ARGUMENT + 2, | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 109 |  | 
|  | 110 | /** | 
|  | 111 | * The requested operation is not appropriate for the current state of AAudio. | 
|  | 112 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 113 | AAUDIO_ERROR_INVALID_STATE, | 
| Phil Burk | 17fff38 | 2017-05-16 14:06:45 -0700 | [diff] [blame] | 114 | // reserved | 
|  | 115 | // reserved | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 116 | /* The server rejected the handle used to identify the stream. | 
|  | 117 | */ | 
| Phil Burk | 17fff38 | 2017-05-16 14:06:45 -0700 | [diff] [blame] | 118 | AAUDIO_ERROR_INVALID_HANDLE = AAUDIO_ERROR_INVALID_STATE + 3, | 
|  | 119 | // reserved | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 120 |  | 
|  | 121 | /** | 
|  | 122 | * The function is not implemented for this stream. | 
|  | 123 | */ | 
| Phil Burk | 17fff38 | 2017-05-16 14:06:45 -0700 | [diff] [blame] | 124 | AAUDIO_ERROR_UNIMPLEMENTED = AAUDIO_ERROR_INVALID_HANDLE + 2, | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 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 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 131 | AAUDIO_ERROR_UNAVAILABLE, | 
|  | 132 | AAUDIO_ERROR_NO_FREE_HANDLES, | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 133 |  | 
|  | 134 | /** | 
|  | 135 | * Memory could not be allocated. | 
|  | 136 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 137 | AAUDIO_ERROR_NO_MEMORY, | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 138 |  | 
|  | 139 | /** | 
|  | 140 | * A NULL pointer was passed to AAudio. | 
|  | 141 | * Or a NULL pointer was detected internally. | 
|  | 142 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 143 | AAUDIO_ERROR_NULL, | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 144 |  | 
|  | 145 | /** | 
|  | 146 | * An operation took longer than expected. | 
|  | 147 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 148 | AAUDIO_ERROR_TIMEOUT, | 
|  | 149 | AAUDIO_ERROR_WOULD_BLOCK, | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 150 |  | 
|  | 151 | /** | 
|  | 152 | * The requested data format is not supported. | 
|  | 153 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 154 | AAUDIO_ERROR_INVALID_FORMAT, | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 155 |  | 
|  | 156 | /** | 
|  | 157 | * A requested was out of range. | 
|  | 158 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 159 | AAUDIO_ERROR_OUT_OF_RANGE, | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 160 |  | 
|  | 161 | /** | 
|  | 162 | * The audio service was not available. | 
|  | 163 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 164 | AAUDIO_ERROR_NO_SERVICE, | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 165 |  | 
|  | 166 | /** | 
|  | 167 | * The requested sample rate was not supported. | 
|  | 168 | */ | 
| Phil Burk | a4eb0d8 | 2017-04-12 15:44:06 -0700 | [diff] [blame] | 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 |  | 
| Phil Burk | e2fbb59 | 2017-05-01 15:05:52 -0700 | [diff] [blame] | 208 |  | 
|  | 209 | enum { | 
|  | 210 | /** | 
|  | 211 | * No particular performance needs. Default. | 
|  | 212 | */ | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 213 | AAUDIO_PERFORMANCE_MODE_NONE = 10, | 
| Phil Burk | e2fbb59 | 2017-05-01 15:05:52 -0700 | [diff] [blame] | 214 |  | 
|  | 215 | /** | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 216 | * Extending battery life is more important than low latency. | 
| Phil Burk | ed0a3fe | 2017-12-05 14:27:43 -0800 | [diff] [blame] | 217 | * | 
|  | 218 | * This mode is not supported in input streams. | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 219 | * For input, mode NONE will be used if this is requested. | 
| Phil Burk | e2fbb59 | 2017-05-01 15:05:52 -0700 | [diff] [blame] | 220 | */ | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 221 | AAUDIO_PERFORMANCE_MODE_POWER_SAVING, | 
| Phil Burk | e2fbb59 | 2017-05-01 15:05:52 -0700 | [diff] [blame] | 222 |  | 
|  | 223 | /** | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 224 | * Reducing latency is more important than battery life. | 
| Phil Burk | e2fbb59 | 2017-05-01 15:05:52 -0700 | [diff] [blame] | 225 | */ | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 226 | AAUDIO_PERFORMANCE_MODE_LOW_LATENCY | 
| Phil Burk | e2fbb59 | 2017-05-01 15:05:52 -0700 | [diff] [blame] | 227 | }; | 
|  | 228 | typedef int32_t aaudio_performance_mode_t; | 
|  | 229 |  | 
| Hayden Gomes | 3e8bbb9 | 2020-01-10 13:37:05 -0800 | [diff] [blame] | 230 | #define AAUDIO_SYSTEM_USAGE_OFFSET 1000 | 
|  | 231 |  | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 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 | * | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 237 | * Note that these match the equivalent values in {@link android.media.AudioAttributes} | 
|  | 238 | * in the Android Java API. | 
| Phil Burk | 42452c0 | 2018-04-10 12:43:33 -0700 | [diff] [blame] | 239 | * | 
|  | 240 | * Added in API level 28. | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 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 | */ | 
| Hayden Gomes | 3e8bbb9 | 2020-01-10 13:37:05 -0800 | [diff] [blame] | 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, | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 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. | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 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 | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 335 | * an audio book application) this information might be used by the audio framework to | 
|  | 336 | * enforce audio focus. | 
|  | 337 | * | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 338 | * Note that these match the equivalent values in {@link android.media.AudioAttributes} | 
|  | 339 | * in the Android Java API. | 
| Phil Burk | 42452c0 | 2018-04-10 12:43:33 -0700 | [diff] [blame] | 340 | * | 
|  | 341 | * Added in API level 28. | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 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. | 
| Phil Burk | 42452c0 | 2018-04-10 12:43:33 -0700 | [diff] [blame] | 374 | * | 
|  | 375 | * Added in API level 28. | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 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, | 
| Eric Laurent | ae4b6ec | 2019-01-15 18:34:38 -0800 | [diff] [blame] | 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. | 
| Eric Laurent | b51e3ab | 2020-04-28 18:29:25 -0700 | [diff] [blame] | 409 | * Available since API level 29. | 
| Eric Laurent | ae4b6ec | 2019-01-15 18:34:38 -0800 | [diff] [blame] | 410 | */ | 
|  | 411 | AAUDIO_INPUT_PRESET_VOICE_PERFORMANCE = 10, | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 412 | }; | 
|  | 413 | typedef int32_t aaudio_input_preset_t; | 
|  | 414 |  | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 415 | /** | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 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*, | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 428 | * AAUDIO_USAGE_NOTIFICATION*, AAUDIO_USAGE_ASSISTANCE* and {@link #AAUDIO_USAGE_ASSISTANT}. | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 429 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 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. | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 432 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 433 | * See {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_ALL}. | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 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 | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 441 | * {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_SYSTEM} for what the system apps | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 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 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 448 | * It is encouraged to use {@link #AAUDIO_ALLOW_CAPTURE_BY_SYSTEM} instead of this value as system apps | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 449 | * provide significant and useful features for the user (eg. accessibility). | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 450 | * See {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_NONE}. | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 451 | */ | 
|  | 452 | AAUDIO_ALLOW_CAPTURE_BY_NONE = 3, | 
|  | 453 | }; | 
|  | 454 |  | 
|  | 455 | typedef int32_t aaudio_allowed_capture_policy_t; | 
|  | 456 |  | 
|  | 457 | /** | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 458 | * These may be used with AAudioStreamBuilder_setSessionId(). | 
|  | 459 | * | 
|  | 460 | * Added in API level 28. | 
|  | 461 | */ | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 462 | enum { | 
|  | 463 | /** | 
|  | 464 | * Do not allocate a session ID. | 
|  | 465 | * Effects cannot be used with this stream. | 
|  | 466 | * Default. | 
| Phil Burk | 42452c0 | 2018-04-10 12:43:33 -0700 | [diff] [blame] | 467 | * | 
|  | 468 | * Added in API level 28. | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 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. | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 475 | * Note that using this may result in higher latency. | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 476 | * | 
|  | 477 | * Note that this matches the value of AudioManager.AUDIO_SESSION_ID_GENERATE. | 
| Phil Burk | 42452c0 | 2018-04-10 12:43:33 -0700 | [diff] [blame] | 478 | * | 
|  | 479 | * Added in API level 28. | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 480 | */ | 
|  | 481 | AAUDIO_SESSION_ID_ALLOCATE = 0, | 
|  | 482 | }; | 
|  | 483 | typedef int32_t aaudio_session_id_t; | 
|  | 484 |  | 
| Phil Burk | e2155ef | 2017-02-24 13:50:29 -0800 | [diff] [blame] | 485 | typedef struct AAudioStreamStruct         AAudioStream; | 
|  | 486 | typedef struct AAudioStreamBuilderStruct  AAudioStreamBuilder; | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 487 |  | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 488 | #ifndef AAUDIO_API | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 489 | #define AAUDIO_API /* export this symbol */ | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 490 | #endif | 
|  | 491 |  | 
|  | 492 | // ============================================================ | 
|  | 493 | // Audio System | 
|  | 494 | // ============================================================ | 
|  | 495 |  | 
|  | 496 | /** | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 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 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 502 | * Available since API level 26. | 
|  | 503 | * | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 504 | * @return pointer to a text representation of an AAudio result code. | 
|  | 505 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 506 | AAUDIO_API const char * AAudio_convertResultToText(aaudio_result_t returnCode) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 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 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 514 | * Available since API level 26. | 
|  | 515 | * | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 516 | * @return pointer to a text representation of an AAudio state. | 
|  | 517 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 518 | AAUDIO_API const char * AAudio_convertStreamStateToText(aaudio_stream_state_t state) | 
|  | 519 | __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 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 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 530 | * The default direction is {@link #AAUDIO_DIRECTION_OUTPUT}. | 
|  | 531 | * The default sharing mode is {@link #AAUDIO_SHARING_MODE_SHARED}. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 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. | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 536 | * | 
|  | 537 | * Available since API level 26. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 538 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 539 | AAUDIO_API aaudio_result_t AAudio_createStreamBuilder(AAudioStreamBuilder** builder) | 
|  | 540 | __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 541 |  | 
|  | 542 | /** | 
|  | 543 | * Request an audio device identified device using an ID. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 544 | * On Android, for example, the ID could be obtained from the Java AudioManager. | 
|  | 545 | * | 
| Kevin Rocard | 6309d88 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 546 | * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}, | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 547 | * in which case the primary device will be used. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 548 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 549 | * Available since API level 26. | 
|  | 550 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 551 | * @param builder reference provided by AAudio_createStreamBuilder() | 
| Kevin Rocard | 6309d88 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 552 | * @param deviceId device identifier or {@link #AAUDIO_UNSPECIFIED} | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 553 | */ | 
| Phil Burk | e2155ef | 2017-02-24 13:50:29 -0800 | [diff] [blame] | 554 | AAUDIO_API void AAudioStreamBuilder_setDeviceId(AAudioStreamBuilder* builder, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 555 | int32_t deviceId) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 556 |  | 
|  | 557 | /** | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 558 | * Request a sample rate in Hertz. | 
|  | 559 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 560 | * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}. | 
| Phil Burk | 8f62489 | 2017-05-11 11:44:20 -0700 | [diff] [blame] | 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. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 567 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 568 | * Available since API level 26. | 
|  | 569 | * | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 570 | * @param builder reference provided by AAudio_createStreamBuilder() | 
|  | 571 | * @param sampleRate frames per second. Common rates include 44100 and 48000 Hz. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 572 | */ | 
| Phil Burk | e2155ef | 2017-02-24 13:50:29 -0800 | [diff] [blame] | 573 | AAUDIO_API void AAudioStreamBuilder_setSampleRate(AAudioStreamBuilder* builder, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 574 | int32_t sampleRate) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 575 |  | 
|  | 576 | /** | 
| Phil Burk | 20523ed | 2017-04-24 17:04:01 -0700 | [diff] [blame] | 577 | * Request a number of channels for the stream. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 578 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 579 | * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}. | 
| Phil Burk | 8f62489 | 2017-05-11 11:44:20 -0700 | [diff] [blame] | 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. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 583 | * | 
| Phil Burk | 8f62489 | 2017-05-11 11:44:20 -0700 | [diff] [blame] | 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. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 586 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 587 | * Available since API level 26. | 
|  | 588 | * | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 589 | * @param builder reference provided by AAudio_createStreamBuilder() | 
| Phil Burk | 20523ed | 2017-04-24 17:04:01 -0700 | [diff] [blame] | 590 | * @param channelCount Number of channels desired. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 591 | */ | 
| Phil Burk | 20523ed | 2017-04-24 17:04:01 -0700 | [diff] [blame] | 592 | AAUDIO_API void AAudioStreamBuilder_setChannelCount(AAudioStreamBuilder* builder, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 593 | int32_t channelCount) __INTRODUCED_IN(26); | 
| Phil Burk | 20523ed | 2017-04-24 17:04:01 -0700 | [diff] [blame] | 594 |  | 
|  | 595 | /** | 
| Phil Burk | e74240d | 2017-08-03 15:25:43 -0700 | [diff] [blame] | 596 | * Identical to AAudioStreamBuilder_setChannelCount(). | 
|  | 597 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 598 | * Available since API level 26. | 
|  | 599 | * | 
| Phil Burk | e74240d | 2017-08-03 15:25:43 -0700 | [diff] [blame] | 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, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 604 | int32_t samplesPerFrame) __INTRODUCED_IN(26); | 
| Phil Burk | e74240d | 2017-08-03 15:25:43 -0700 | [diff] [blame] | 605 |  | 
|  | 606 | /** | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 607 | * Request a sample data format, for example {@link #AAUDIO_FORMAT_PCM_I16}. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 608 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 609 | * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}. | 
| Phil Burk | 8f62489 | 2017-05-11 11:44:20 -0700 | [diff] [blame] | 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. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 613 | * | 
| Phil Burk | 8f62489 | 2017-05-11 11:44:20 -0700 | [diff] [blame] | 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. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 616 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 617 | * Available since API level 26. | 
|  | 618 | * | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 619 | * @param builder reference provided by AAudio_createStreamBuilder() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 620 | * @param format common formats are {@link #AAUDIO_FORMAT_PCM_FLOAT} and | 
|  | 621 | *               {@link #AAUDIO_FORMAT_PCM_I16}. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 622 | */ | 
| Phil Burk | e2155ef | 2017-02-24 13:50:29 -0800 | [diff] [blame] | 623 | AAUDIO_API void AAudioStreamBuilder_setFormat(AAudioStreamBuilder* builder, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 624 | aaudio_format_t format) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 625 |  | 
|  | 626 | /** | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 627 | * Request a mode for sharing the device. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 628 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 629 | * The default, if you do not call this function, is {@link #AAUDIO_SHARING_MODE_SHARED}. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 630 | * | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 631 | * The requested sharing mode may not be available. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 632 | * The application can query for the actual mode after the stream is opened. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 633 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 634 | * Available since API level 26. | 
|  | 635 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 636 | * @param builder reference provided by AAudio_createStreamBuilder() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 637 | * @param sharingMode {@link #AAUDIO_SHARING_MODE_SHARED} or {@link #AAUDIO_SHARING_MODE_EXCLUSIVE} | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 638 | */ | 
| Phil Burk | e2155ef | 2017-02-24 13:50:29 -0800 | [diff] [blame] | 639 | AAUDIO_API void AAudioStreamBuilder_setSharingMode(AAudioStreamBuilder* builder, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 640 | aaudio_sharing_mode_t sharingMode) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 641 |  | 
|  | 642 | /** | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 643 | * Request the direction for a stream. | 
|  | 644 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 645 | * The default, if you do not call this function, is {@link #AAUDIO_DIRECTION_OUTPUT}. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 646 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 647 | * Available since API level 26. | 
|  | 648 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 649 | * @param builder reference provided by AAudio_createStreamBuilder() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 650 | * @param direction {@link #AAUDIO_DIRECTION_OUTPUT} or {@link #AAUDIO_DIRECTION_INPUT} | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 651 | */ | 
| Phil Burk | e2155ef | 2017-02-24 13:50:29 -0800 | [diff] [blame] | 652 | AAUDIO_API void AAudioStreamBuilder_setDirection(AAudioStreamBuilder* builder, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 653 | aaudio_direction_t direction) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 654 |  | 
|  | 655 | /** | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 656 | * Set the requested buffer capacity in frames. | 
| Phil Burk | 3df348f | 2017-02-08 11:41:55 -0800 | [diff] [blame] | 657 | * The final AAudioStream capacity may differ, but will probably be at least this big. | 
|  | 658 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 659 | * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}. | 
| Phil Burk | 3df348f | 2017-02-08 11:41:55 -0800 | [diff] [blame] | 660 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 661 | * Available since API level 26. | 
|  | 662 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 663 | * @param builder reference provided by AAudio_createStreamBuilder() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 664 | * @param numFrames the desired buffer capacity in frames or {@link #AAUDIO_UNSPECIFIED} | 
| Phil Burk | 3df348f | 2017-02-08 11:41:55 -0800 | [diff] [blame] | 665 | */ | 
| Phil Burk | e2155ef | 2017-02-24 13:50:29 -0800 | [diff] [blame] | 666 | AAUDIO_API void AAudioStreamBuilder_setBufferCapacityInFrames(AAudioStreamBuilder* builder, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 667 | int32_t numFrames) __INTRODUCED_IN(26); | 
| Phil Burk | e2fbb59 | 2017-05-01 15:05:52 -0700 | [diff] [blame] | 668 |  | 
|  | 669 | /** | 
|  | 670 | * Set the requested performance mode. | 
|  | 671 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 672 | * Supported modes are {@link #AAUDIO_PERFORMANCE_MODE_NONE}, | 
|  | 673 | * {@link #AAUDIO_PERFORMANCE_MODE_POWER_SAVING} * and {@link #AAUDIO_PERFORMANCE_MODE_LOW_LATENCY}. | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 674 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 675 | * The default, if you do not call this function, is {@link #AAUDIO_PERFORMANCE_MODE_NONE}. | 
| Phil Burk | e2fbb59 | 2017-05-01 15:05:52 -0700 | [diff] [blame] | 676 | * | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 677 | * You may not get the mode you requested. | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 678 | * You can call AAudioStream_getPerformanceMode() | 
|  | 679 | * to find out the final mode for the stream. | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 680 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 681 | * Available since API level 26. | 
|  | 682 | * | 
| Phil Burk | e2fbb59 | 2017-05-01 15:05:52 -0700 | [diff] [blame] | 683 | * @param builder reference provided by AAudio_createStreamBuilder() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 684 | * @param mode the desired performance mode, eg. {@link #AAUDIO_PERFORMANCE_MODE_LOW_LATENCY} | 
| Phil Burk | e2fbb59 | 2017-05-01 15:05:52 -0700 | [diff] [blame] | 685 | */ | 
|  | 686 | AAUDIO_API void AAudioStreamBuilder_setPerformanceMode(AAudioStreamBuilder* builder, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 687 | aaudio_performance_mode_t mode) __INTRODUCED_IN(26); | 
| Phil Burk | e2fbb59 | 2017-05-01 15:05:52 -0700 | [diff] [blame] | 688 |  | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 689 | /** | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 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 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 696 | * The default, if you do not call this function, is {@link #AAUDIO_USAGE_MEDIA}. | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 697 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 698 | * Available since API level 28. | 
| Phil Burk | 42452c0 | 2018-04-10 12:43:33 -0700 | [diff] [blame] | 699 | * | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 700 | * @param builder reference provided by AAudio_createStreamBuilder() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 701 | * @param usage the desired usage, eg. {@link #AAUDIO_USAGE_GAME} | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 702 | */ | 
|  | 703 | AAUDIO_API void AAudioStreamBuilder_setUsage(AAudioStreamBuilder* builder, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 704 | aaudio_usage_t usage) __INTRODUCED_IN(28); | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 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 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 713 | * The default, if you do not call this function, is {@link #AAUDIO_CONTENT_TYPE_MUSIC}. | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 714 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 715 | * Available since API level 28. | 
| Phil Burk | 42452c0 | 2018-04-10 12:43:33 -0700 | [diff] [blame] | 716 | * | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 717 | * @param builder reference provided by AAudio_createStreamBuilder() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 718 | * @param contentType the type of audio data, eg. {@link #AAUDIO_CONTENT_TYPE_SPEECH} | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 719 | */ | 
|  | 720 | AAUDIO_API void AAudioStreamBuilder_setContentType(AAudioStreamBuilder* builder, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 721 | aaudio_content_type_t contentType) __INTRODUCED_IN(28); | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 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 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 731 | * The default, if you do not call this function, is {@link #AAUDIO_INPUT_PRESET_VOICE_RECOGNITION}. | 
| Phil Burk | eaef9b9 | 2018-01-18 09:09:42 -0800 | [diff] [blame] | 732 | * That is because VOICE_RECOGNITION is the preset with the lowest latency | 
|  | 733 | * on many platforms. | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 734 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 735 | * Available since API level 28. | 
| Phil Burk | 42452c0 | 2018-04-10 12:43:33 -0700 | [diff] [blame] | 736 | * | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 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, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 741 | aaudio_input_preset_t inputPreset) __INTRODUCED_IN(28); | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 742 |  | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 743 | /** | 
|  | 744 | * Specify whether this stream audio may or may not be captured by other apps or the system. | 
|  | 745 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 746 | * The default is {@link #AAUDIO_ALLOW_CAPTURE_BY_ALL}. | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 747 | * | 
|  | 748 | * Note that an application can also set its global policy, in which case the most restrictive | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 749 | * policy is always applied. See {@link android.media.AudioAttributes#setAllowedCapturePolicy(int)} | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 750 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 751 | * Available since API level 29. | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 752 | * | 
|  | 753 | * @param builder reference provided by AAudio_createStreamBuilder() | 
| Glenn Kasten | d3080c3 | 2019-10-24 09:54:56 -0700 | [diff] [blame] | 754 | * @param capturePolicy the desired level of opt-out from being captured. | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 755 | */ | 
|  | 756 | AAUDIO_API void AAudioStreamBuilder_setAllowedCapturePolicy(AAudioStreamBuilder* builder, | 
|  | 757 | aaudio_allowed_capture_policy_t capturePolicy) __INTRODUCED_IN(29); | 
|  | 758 |  | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 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 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 764 | * The default, if you do not call this function, is {@link #AAUDIO_SESSION_ID_NONE}. | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 765 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 766 | * If set to {@link #AAUDIO_SESSION_ID_ALLOCATE} then a session ID will be allocated | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 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 | * | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 773 | * Session IDs from AAudio can be used with the Android Java APIs and vice versa. | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 774 | * So a session ID from an AAudio stream can be passed to Java | 
|  | 775 | * and effects applied using the Java AudioEffect API. | 
|  | 776 | * | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 777 | * Note that allocating or setting a session ID may result in a stream with higher latency. | 
|  | 778 | * | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 779 | * Allocated session IDs will always be positive and nonzero. | 
|  | 780 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 781 | * Available since API level 28. | 
| Phil Burk | 42452c0 | 2018-04-10 12:43:33 -0700 | [diff] [blame] | 782 | * | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 783 | * @param builder reference provided by AAudio_createStreamBuilder() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 784 | * @param sessionId an allocated sessionID or {@link #AAUDIO_SESSION_ID_ALLOCATE} | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 785 | */ | 
|  | 786 | AAUDIO_API void AAudioStreamBuilder_setSessionId(AAudioStreamBuilder* builder, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 787 | aaudio_session_id_t sessionId) __INTRODUCED_IN(28); | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 788 |  | 
| Eric Laurent | d17c850 | 2019-10-24 15:58:35 -0700 | [diff] [blame] | 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 |  | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 811 | /** | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 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 | * | 
| Phil Burk | ed0a3fe | 2017-12-05 14:27:43 -0800 | [diff] [blame] | 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. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 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> | 
| Phil Burk | ed0a3fe | 2017-12-05 14:27:43 -0800 | [diff] [blame] | 858 | * <li>stop or close the stream</li> | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 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> | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 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 | 
| Phil Burk | ed0a3fe | 2017-12-05 14:27:43 -0800 | [diff] [blame] | 875 | * @param numFrames the number of frames to be processed, which can vary | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 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. | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 889 | * So you cannot call AAudioStream_write() or AAudioStream_read() | 
|  | 890 | * on the same stream that has an active data callback. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 891 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 892 | * The callback function will start being called after AAudioStream_requestStart() | 
|  | 893 | * is called. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 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 | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 898 | * {@link #AAudioStream_dataCallback} for more information. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 899 | * | 
|  | 900 | * Note that the AAudio callbacks will never be called simultaneously from multiple threads. | 
|  | 901 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 902 | * Available since API level 26. | 
|  | 903 | * | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 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, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 910 | AAudioStream_dataCallback callback, void *userData) __INTRODUCED_IN(26); | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 911 |  | 
|  | 912 | /** | 
|  | 913 | * Set the requested data callback buffer size in frames. | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 914 | * See {@link #AAudioStream_dataCallback}. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 915 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 916 | * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED}. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 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 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 932 | * Available since API level 26. | 
|  | 933 | * | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 934 | * @param builder reference provided by AAudio_createStreamBuilder() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 935 | * @param numFrames the desired buffer size in frames or {@link #AAUDIO_UNSPECIFIED} | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 936 | */ | 
|  | 937 | AAUDIO_API void AAudioStreamBuilder_setFramesPerDataCallback(AAudioStreamBuilder* builder, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 938 | int32_t numFrames) __INTRODUCED_IN(26); | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 939 |  | 
|  | 940 | /** | 
|  | 941 | * Prototype for the callback function that is passed to | 
|  | 942 | * AAudioStreamBuilder_setErrorCallback(). | 
|  | 943 | * | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 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 | * | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 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 | /** | 
| Phil Burk | ed0a3fe | 2017-12-05 14:27:43 -0800 | [diff] [blame] | 970 | * Request that AAudio call this function if any error occurs or the stream is disconnected. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 971 | * | 
|  | 972 | * It will be called, for example, if a headset or a USB device is unplugged causing the stream's | 
| Phil Burk | ed0a3fe | 2017-12-05 14:27:43 -0800 | [diff] [blame] | 973 | * device to be unavailable or "disconnected". | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 974 | * Another possible cause of error would be a timeout or an unanticipated internal error. | 
|  | 975 | * | 
| Phil Burk | ed0a3fe | 2017-12-05 14:27:43 -0800 | [diff] [blame] | 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 | * | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 983 | * Note that the AAudio callbacks will never be called simultaneously from multiple threads. | 
|  | 984 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 985 | * Available since API level 26. | 
|  | 986 | * | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 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, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 993 | AAudioStream_errorCallback callback, void *userData) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 994 |  | 
|  | 995 | /** | 
|  | 996 | * Open a stream based on the options in the StreamBuilder. | 
|  | 997 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 998 | * AAudioStream_close() must be called when finished with the stream to recover | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 999 | * the memory and to free the associated resources. | 
|  | 1000 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1001 | * Available since API level 26. | 
|  | 1002 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1003 | * @param builder reference provided by AAudio_createStreamBuilder() | 
|  | 1004 | * @param stream pointer to a variable to receive the new stream reference | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1005 | * @return {@link #AAUDIO_OK} or a negative error. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1006 | */ | 
| Phil Burk | e2155ef | 2017-02-24 13:50:29 -0800 | [diff] [blame] | 1007 | AAUDIO_API aaudio_result_t  AAudioStreamBuilder_openStream(AAudioStreamBuilder* builder, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1008 | AAudioStream** stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1009 |  | 
|  | 1010 | /** | 
|  | 1011 | * Delete the resources associated with the StreamBuilder. | 
|  | 1012 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1013 | * Available since API level 26. | 
|  | 1014 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1015 | * @param builder reference provided by AAudio_createStreamBuilder() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1016 | * @return {@link #AAUDIO_OK} or a negative error. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1017 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1018 | AAUDIO_API aaudio_result_t  AAudioStreamBuilder_delete(AAudioStreamBuilder* builder) | 
|  | 1019 | __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1020 |  | 
|  | 1021 | // ============================================================ | 
|  | 1022 | // Stream Control | 
|  | 1023 | // ============================================================ | 
|  | 1024 |  | 
| Phil Burk | 8b4e05e | 2019-12-17 12:12:09 -0800 | [diff] [blame] | 1025 | #if __ANDROID_API__ >= 30 | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1026 | /** | 
| Phil Burk | 8b4e05e | 2019-12-17 12:12:09 -0800 | [diff] [blame] | 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. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1031 | * | 
| Phil Burk | 8b4e05e | 2019-12-17 12:12:09 -0800 | [diff] [blame] | 1032 | * After this call, the stream will be in {@link #AAUDIO_STREAM_STATE_CLOSING} | 
|  | 1033 | * | 
| Phil Burk | 4156176 | 2020-02-05 14:20:33 -0800 | [diff] [blame] | 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 | * | 
| Phil Burk | 4719048 | 2020-08-12 14:29:10 +0000 | [diff] [blame^] | 1038 | * NOTE: This function is only fully implemented for MMAP streams, | 
|  | 1039 | * which are low latency streams supported by some devices. | 
|  | 1040 | * On other "Legacy" streams some audio resources will still be in use | 
|  | 1041 | * and some callbacks may still be in process after this call. | 
|  | 1042 | * | 
| Phil Burk | 8b4e05e | 2019-12-17 12:12:09 -0800 | [diff] [blame] | 1043 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1044 | * @return {@link #AAUDIO_OK} or a negative error. | 
|  | 1045 | */ | 
|  | 1046 | AAUDIO_API aaudio_result_t  AAudioStream_release(AAudioStream* stream) __INTRODUCED_IN(30); | 
|  | 1047 | #endif // __ANDROID_API__ | 
|  | 1048 |  | 
|  | 1049 | /** | 
|  | 1050 | * Delete the internal data structures associated with the stream created | 
|  | 1051 | * by AAudioStreamBuilder_openStream(). | 
|  | 1052 | * | 
|  | 1053 | * If AAudioStream_release() has not been called then it will be called automatically. | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1054 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1055 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1056 | * @return {@link #AAUDIO_OK} or a negative error. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1057 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1058 | AAUDIO_API aaudio_result_t  AAudioStream_close(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1059 |  | 
|  | 1060 | /** | 
|  | 1061 | * Asynchronously request to start playing the stream. For output streams, one should | 
|  | 1062 | * write to the stream to fill the buffer before starting. | 
|  | 1063 | * Otherwise it will underflow. | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1064 | * After this call the state will be in {@link #AAUDIO_STREAM_STATE_STARTING} or | 
|  | 1065 | * {@link #AAUDIO_STREAM_STATE_STARTED}. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1066 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1067 | * Available since API level 26. | 
|  | 1068 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1069 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1070 | * @return {@link #AAUDIO_OK} or a negative error. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1071 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1072 | AAUDIO_API aaudio_result_t  AAudioStream_requestStart(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1073 |  | 
|  | 1074 | /** | 
|  | 1075 | * Asynchronous request for the stream to pause. | 
|  | 1076 | * Pausing a stream will freeze the data flow but not flush any buffers. | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1077 | * Use AAudioStream_requestStart() to resume playback after a pause. | 
|  | 1078 | * After this call the state will be in {@link #AAUDIO_STREAM_STATE_PAUSING} or | 
|  | 1079 | * {@link #AAUDIO_STREAM_STATE_PAUSED}. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1080 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1081 | * This will return {@link #AAUDIO_ERROR_UNIMPLEMENTED} for input streams. | 
| Phil Burk | 068c10f | 2017-05-08 16:36:41 -0700 | [diff] [blame] | 1082 | * For input streams use AAudioStream_requestStop(). | 
|  | 1083 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1084 | * Available since API level 26. | 
|  | 1085 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1086 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1087 | * @return {@link #AAUDIO_OK} or a negative error. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1088 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1089 | AAUDIO_API aaudio_result_t  AAudioStream_requestPause(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1090 |  | 
|  | 1091 | /** | 
|  | 1092 | * Asynchronous request for the stream to flush. | 
|  | 1093 | * Flushing will discard any pending data. | 
|  | 1094 | * This call only works if the stream is pausing or paused. TODO review | 
|  | 1095 | * Frame counters are not reset by a flush. They may be advanced. | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1096 | * After this call the state will be in {@link #AAUDIO_STREAM_STATE_FLUSHING} or | 
|  | 1097 | * {@link #AAUDIO_STREAM_STATE_FLUSHED}. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1098 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1099 | * This will return {@link #AAUDIO_ERROR_UNIMPLEMENTED} for input streams. | 
| Phil Burk | 068c10f | 2017-05-08 16:36:41 -0700 | [diff] [blame] | 1100 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1101 | * Available since API level 26. | 
|  | 1102 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1103 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1104 | * @return {@link #AAUDIO_OK} or a negative error. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1105 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1106 | AAUDIO_API aaudio_result_t  AAudioStream_requestFlush(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1107 |  | 
|  | 1108 | /** | 
|  | 1109 | * Asynchronous request for the stream to stop. | 
|  | 1110 | * The stream will stop after all of the data currently buffered has been played. | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1111 | * After this call the state will be in {@link #AAUDIO_STREAM_STATE_STOPPING} or | 
|  | 1112 | * {@link #AAUDIO_STREAM_STATE_STOPPED}. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1113 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1114 | * Available since API level 26. | 
|  | 1115 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1116 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1117 | * @return {@link #AAUDIO_OK} or a negative error. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1118 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1119 | AAUDIO_API aaudio_result_t  AAudioStream_requestStop(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1120 |  | 
|  | 1121 | /** | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1122 | * Query the current state of the client, eg. {@link #AAUDIO_STREAM_STATE_PAUSING} | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1123 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1124 | * This function will immediately return the state without updating the state. | 
|  | 1125 | * If you want to update the client state based on the server state then | 
|  | 1126 | * call AAudioStream_waitForStateChange() with currentState | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1127 | * set to {@link #AAUDIO_STREAM_STATE_UNKNOWN} and a zero timeout. | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1128 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1129 | * Available since API level 26. | 
|  | 1130 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1131 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1132 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1133 | AAUDIO_API aaudio_stream_state_t AAudioStream_getState(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1134 |  | 
|  | 1135 | /** | 
|  | 1136 | * Wait until the current state no longer matches the input state. | 
|  | 1137 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1138 | * This will update the current client state. | 
|  | 1139 | * | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1140 | * <pre><code> | 
| Phil Burk | ed0a3fe | 2017-12-05 14:27:43 -0800 | [diff] [blame] | 1141 | * aaudio_result_t result = AAUDIO_OK; | 
|  | 1142 | * aaudio_stream_state_t currentState = AAudioStream_getState(stream); | 
|  | 1143 | * aaudio_stream_state_t inputState = currentState; | 
|  | 1144 | * while (result == AAUDIO_OK && currentState != AAUDIO_STREAM_STATE_PAUSED) { | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1145 | *     result = AAudioStream_waitForStateChange( | 
| Phil Burk | ed0a3fe | 2017-12-05 14:27:43 -0800 | [diff] [blame] | 1146 | *                                   stream, inputState, ¤tState, MY_TIMEOUT_NANOS); | 
|  | 1147 | *     inputState = currentState; | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1148 | * } | 
|  | 1149 | * </code></pre> | 
|  | 1150 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1151 | * Available since API level 26. | 
|  | 1152 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1153 | * @param stream A reference provided by AAudioStreamBuilder_openStream() | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1154 | * @param inputState The state we want to avoid. | 
|  | 1155 | * @param nextState Pointer to a variable that will be set to the new state. | 
|  | 1156 | * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion. | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1157 | * @return {@link #AAUDIO_OK} or a negative error. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1158 | */ | 
| Phil Burk | e2155ef | 2017-02-24 13:50:29 -0800 | [diff] [blame] | 1159 | AAUDIO_API aaudio_result_t AAudioStream_waitForStateChange(AAudioStream* stream, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1160 | aaudio_stream_state_t inputState, aaudio_stream_state_t *nextState, | 
|  | 1161 | int64_t timeoutNanoseconds) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1162 |  | 
|  | 1163 | // ============================================================ | 
|  | 1164 | // Stream I/O | 
|  | 1165 | // ============================================================ | 
|  | 1166 |  | 
|  | 1167 | /** | 
|  | 1168 | * Read data from the stream. | 
|  | 1169 | * | 
|  | 1170 | * The call will wait until the read is complete or until it runs out of time. | 
|  | 1171 | * If timeoutNanos is zero then this call will not wait. | 
|  | 1172 | * | 
|  | 1173 | * Note that timeoutNanoseconds is a relative duration in wall clock time. | 
|  | 1174 | * Time will not stop if the thread is asleep. | 
|  | 1175 | * So it will be implemented using CLOCK_BOOTTIME. | 
|  | 1176 | * | 
|  | 1177 | * This call is "strong non-blocking" unless it has to wait for data. | 
|  | 1178 | * | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 1179 | * If the call times out then zero or a partial frame count will be returned. | 
|  | 1180 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1181 | * Available since API level 26. | 
|  | 1182 | * | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1183 | * @param stream A stream created using AAudioStreamBuilder_openStream(). | 
|  | 1184 | * @param buffer The address of the first sample. | 
|  | 1185 | * @param numFrames Number of frames to read. Only complete frames will be written. | 
|  | 1186 | * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion. | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1187 | * @return The number of frames actually read or a negative error. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1188 | */ | 
| Phil Burk | e2155ef | 2017-02-24 13:50:29 -0800 | [diff] [blame] | 1189 | AAUDIO_API aaudio_result_t AAudioStream_read(AAudioStream* stream, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1190 | void *buffer, int32_t numFrames, int64_t timeoutNanoseconds) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1191 |  | 
|  | 1192 | /** | 
|  | 1193 | * Write data to the stream. | 
|  | 1194 | * | 
|  | 1195 | * The call will wait until the write is complete or until it runs out of time. | 
|  | 1196 | * If timeoutNanos is zero then this call will not wait. | 
|  | 1197 | * | 
|  | 1198 | * Note that timeoutNanoseconds is a relative duration in wall clock time. | 
|  | 1199 | * Time will not stop if the thread is asleep. | 
|  | 1200 | * So it will be implemented using CLOCK_BOOTTIME. | 
|  | 1201 | * | 
|  | 1202 | * This call is "strong non-blocking" unless it has to wait for room in the buffer. | 
|  | 1203 | * | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 1204 | * If the call times out then zero or a partial frame count will be returned. | 
|  | 1205 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1206 | * Available since API level 26. | 
|  | 1207 | * | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1208 | * @param stream A stream created using AAudioStreamBuilder_openStream(). | 
|  | 1209 | * @param buffer The address of the first sample. | 
|  | 1210 | * @param numFrames Number of frames to write. Only complete frames will be written. | 
|  | 1211 | * @param timeoutNanoseconds Maximum number of nanoseconds to wait for completion. | 
|  | 1212 | * @return The number of frames actually written or a negative error. | 
|  | 1213 | */ | 
| Phil Burk | e2155ef | 2017-02-24 13:50:29 -0800 | [diff] [blame] | 1214 | AAUDIO_API aaudio_result_t AAudioStream_write(AAudioStream* stream, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1215 | const void *buffer, int32_t numFrames, int64_t timeoutNanoseconds) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1216 |  | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1217 | // ============================================================ | 
|  | 1218 | // Stream - queries | 
|  | 1219 | // ============================================================ | 
|  | 1220 |  | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1221 | /** | 
|  | 1222 | * This can be used to adjust the latency of the buffer by changing | 
|  | 1223 | * the threshold where blocking will occur. | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1224 | * By combining this with AAudioStream_getXRunCount(), the latency can be tuned | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1225 | * at run-time for each device. | 
|  | 1226 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1227 | * This cannot be set higher than AAudioStream_getBufferCapacityInFrames(). | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1228 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1229 | * Note that you will probably not get the exact size you request. | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 1230 | * You can check the return value or call AAudioStream_getBufferSizeInFrames() | 
|  | 1231 | * to see what the actual final size is. | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1232 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1233 | * Available since API level 26. | 
|  | 1234 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1235 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 1236 | * @param numFrames requested number of frames that can be filled without blocking | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1237 | * @return actual buffer size in frames or a negative error | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1238 | */ | 
| Phil Burk | e2155ef | 2017-02-24 13:50:29 -0800 | [diff] [blame] | 1239 | AAUDIO_API aaudio_result_t AAudioStream_setBufferSizeInFrames(AAudioStream* stream, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1240 | int32_t numFrames) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1241 |  | 
|  | 1242 | /** | 
|  | 1243 | * Query the maximum number of frames that can be filled without blocking. | 
|  | 1244 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1245 | * Available since API level 26. | 
|  | 1246 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1247 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1248 | * @return buffer size in frames. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1249 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1250 | AAUDIO_API int32_t AAudioStream_getBufferSizeInFrames(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1251 |  | 
|  | 1252 | /** | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1253 | * Query the number of frames that the application should read or write at | 
|  | 1254 | * one time for optimal performance. It is OK if an application writes | 
|  | 1255 | * a different number of frames. But the buffer size may need to be larger | 
|  | 1256 | * in order to avoid underruns or overruns. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1257 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1258 | * Note that this may or may not match the actual device burst size. | 
|  | 1259 | * For some endpoints, the burst size can vary dynamically. | 
|  | 1260 | * But these tend to be devices with high latency. | 
|  | 1261 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1262 | * Available since API level 26. | 
|  | 1263 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1264 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1265 | * @return burst size | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1266 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1267 | AAUDIO_API int32_t AAudioStream_getFramesPerBurst(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1268 |  | 
|  | 1269 | /** | 
|  | 1270 | * Query maximum buffer capacity in frames. | 
|  | 1271 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1272 | * Available since API level 26. | 
|  | 1273 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1274 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 1275 | * @return  buffer capacity in frames | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1276 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1277 | AAUDIO_API int32_t AAudioStream_getBufferCapacityInFrames(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1278 |  | 
|  | 1279 | /** | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 1280 | * Query the size of the buffer that will be passed to the dataProc callback | 
|  | 1281 | * in the numFrames parameter. | 
|  | 1282 | * | 
|  | 1283 | * This call can be used if the application needs to know the value of numFrames before | 
|  | 1284 | * the stream is started. This is not normally necessary. | 
|  | 1285 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1286 | * If a specific size was requested by calling | 
|  | 1287 | * AAudioStreamBuilder_setFramesPerDataCallback() then this will be the same size. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 1288 | * | 
| Phil Burk | ed0a3fe | 2017-12-05 14:27:43 -0800 | [diff] [blame] | 1289 | * If AAudioStreamBuilder_setFramesPerDataCallback() was not called then this will | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1290 | * return the size chosen by AAudio, or {@link #AAUDIO_UNSPECIFIED}. | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 1291 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1292 | * {@link #AAUDIO_UNSPECIFIED} indicates that the callback buffer size for this stream | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 1293 | * may vary from one dataProc callback to the next. | 
|  | 1294 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1295 | * Available since API level 26. | 
|  | 1296 | * | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 1297 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1298 | * @return callback buffer size in frames or {@link #AAUDIO_UNSPECIFIED} | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 1299 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1300 | AAUDIO_API int32_t AAudioStream_getFramesPerDataCallback(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | e057ca9 | 2017-03-28 11:31:34 -0700 | [diff] [blame] | 1301 |  | 
|  | 1302 | /** | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1303 | * An XRun is an Underrun or an Overrun. | 
|  | 1304 | * During playing, an underrun will occur if the stream is not written in time | 
|  | 1305 | * and the system runs out of valid data. | 
|  | 1306 | * During recording, an overrun will occur if the stream is not read in time | 
|  | 1307 | * and there is no place to put the incoming data so it is discarded. | 
|  | 1308 | * | 
|  | 1309 | * An underrun or overrun can cause an audible "pop" or "glitch". | 
|  | 1310 | * | 
| Phil Burk | 068c10f | 2017-05-08 16:36:41 -0700 | [diff] [blame] | 1311 | * Note that some INPUT devices may not support this function. | 
|  | 1312 | * In that case a 0 will always be returned. | 
|  | 1313 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1314 | * Available since API level 26. | 
|  | 1315 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1316 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1317 | * @return the underrun or overrun count | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1318 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1319 | AAUDIO_API int32_t AAudioStream_getXRunCount(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1320 |  | 
|  | 1321 | /** | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1322 | * Available since API level 26. | 
|  | 1323 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1324 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1325 | * @return actual sample rate | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1326 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1327 | AAUDIO_API int32_t AAudioStream_getSampleRate(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1328 |  | 
|  | 1329 | /** | 
| Phil Burk | 20523ed | 2017-04-24 17:04:01 -0700 | [diff] [blame] | 1330 | * A stream has one or more channels of data. | 
|  | 1331 | * A frame will contain one sample for each channel. | 
|  | 1332 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1333 | * Available since API level 26. | 
|  | 1334 | * | 
| Phil Burk | 20523ed | 2017-04-24 17:04:01 -0700 | [diff] [blame] | 1335 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1336 | * @return actual number of channels | 
|  | 1337 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1338 | AAUDIO_API int32_t AAudioStream_getChannelCount(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 20523ed | 2017-04-24 17:04:01 -0700 | [diff] [blame] | 1339 |  | 
|  | 1340 | /** | 
| Phil Burk | e74240d | 2017-08-03 15:25:43 -0700 | [diff] [blame] | 1341 | * Identical to AAudioStream_getChannelCount(). | 
|  | 1342 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1343 | * Available since API level 26. | 
|  | 1344 | * | 
| Phil Burk | e74240d | 2017-08-03 15:25:43 -0700 | [diff] [blame] | 1345 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1346 | * @return actual number of samples frame | 
|  | 1347 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1348 | AAUDIO_API int32_t AAudioStream_getSamplesPerFrame(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | e74240d | 2017-08-03 15:25:43 -0700 | [diff] [blame] | 1349 |  | 
|  | 1350 | /** | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1351 | * Available since API level 26. | 
|  | 1352 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1353 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Phil Burk | e2155ef | 2017-02-24 13:50:29 -0800 | [diff] [blame] | 1354 | * @return actual device ID | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1355 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1356 | AAUDIO_API int32_t AAudioStream_getDeviceId(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1357 |  | 
|  | 1358 | /** | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1359 | * Available since API level 26. | 
|  | 1360 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1361 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1362 | * @return actual data format | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1363 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1364 | AAUDIO_API aaudio_format_t AAudioStream_getFormat(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1365 |  | 
|  | 1366 | /** | 
|  | 1367 | * Provide actual sharing mode. | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1368 | * | 
|  | 1369 | * Available since API level 26. | 
|  | 1370 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1371 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1372 | * @return  actual sharing mode | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1373 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1374 | AAUDIO_API aaudio_sharing_mode_t AAudioStream_getSharingMode(AAudioStream* stream) | 
|  | 1375 | __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1376 |  | 
|  | 1377 | /** | 
| Phil Burk | e2fbb59 | 2017-05-01 15:05:52 -0700 | [diff] [blame] | 1378 | * Get the performance mode used by the stream. | 
|  | 1379 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1380 | * Available since API level 26. | 
|  | 1381 | * | 
| Phil Burk | e2fbb59 | 2017-05-01 15:05:52 -0700 | [diff] [blame] | 1382 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1383 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1384 | AAUDIO_API aaudio_performance_mode_t AAudioStream_getPerformanceMode(AAudioStream* stream) | 
|  | 1385 | __INTRODUCED_IN(26); | 
| Phil Burk | e2fbb59 | 2017-05-01 15:05:52 -0700 | [diff] [blame] | 1386 |  | 
|  | 1387 | /** | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1388 | * Available since API level 26. | 
|  | 1389 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1390 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1391 | * @return direction | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1392 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1393 | AAUDIO_API aaudio_direction_t AAudioStream_getDirection(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1394 |  | 
|  | 1395 | /** | 
|  | 1396 | * Passes back the number of frames that have been written since the stream was created. | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 1397 | * For an output stream, this will be advanced by the application calling write() | 
|  | 1398 | * or by a data callback. | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1399 | * For an input stream, this will be advanced by the endpoint. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1400 | * | 
|  | 1401 | * The frame position is monotonically increasing. | 
|  | 1402 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1403 | * Available since API level 26. | 
|  | 1404 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1405 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1406 | * @return frames written | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1407 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1408 | AAUDIO_API int64_t AAudioStream_getFramesWritten(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1409 |  | 
|  | 1410 | /** | 
|  | 1411 | * Passes back the number of frames that have been read since the stream was created. | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1412 | * For an output stream, this will be advanced by the endpoint. | 
| Phil Burk | 8149eed | 2018-05-24 14:09:46 -0700 | [diff] [blame] | 1413 | * For an input stream, this will be advanced by the application calling read() | 
|  | 1414 | * or by a data callback. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1415 | * | 
|  | 1416 | * The frame position is monotonically increasing. | 
|  | 1417 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1418 | * Available since API level 26. | 
|  | 1419 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1420 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1421 | * @return frames read | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1422 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1423 | AAUDIO_API int64_t AAudioStream_getFramesRead(AAudioStream* stream) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1424 |  | 
|  | 1425 | /** | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 1426 | * Passes back the session ID associated with this stream. | 
|  | 1427 | * | 
|  | 1428 | * The session ID can be used to associate a stream with effects processors. | 
|  | 1429 | * The effects are controlled using the Android AudioEffect Java API. | 
|  | 1430 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1431 | * If AAudioStreamBuilder_setSessionId() was | 
|  | 1432 | * called with {@link #AAUDIO_SESSION_ID_ALLOCATE} | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 1433 | * then a new session ID should be allocated once when the stream is opened. | 
|  | 1434 | * | 
|  | 1435 | * If AAudioStreamBuilder_setSessionId() was called with a previously allocated | 
|  | 1436 | * session ID then that value should be returned. | 
|  | 1437 | * | 
|  | 1438 | * If AAudioStreamBuilder_setSessionId() was not called then this function should | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1439 | * return {@link #AAUDIO_SESSION_ID_NONE}. | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 1440 | * | 
|  | 1441 | * The sessionID for a stream should not change once the stream has been opened. | 
|  | 1442 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1443 | * Available since API level 28. | 
| Phil Burk | 42452c0 | 2018-04-10 12:43:33 -0700 | [diff] [blame] | 1444 | * | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 1445 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1446 | * @return session ID or {@link #AAUDIO_SESSION_ID_NONE} | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 1447 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1448 | AAUDIO_API aaudio_session_id_t AAudioStream_getSessionId(AAudioStream* stream) __INTRODUCED_IN(28); | 
| Phil Burk | 7e7dcaa | 2018-01-03 15:16:15 -0800 | [diff] [blame] | 1449 |  | 
|  | 1450 | /** | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1451 | * Passes back the time at which a particular frame was presented. | 
|  | 1452 | * This can be used to synchronize audio with video or MIDI. | 
|  | 1453 | * It can also be used to align a recorded stream with a playback stream. | 
|  | 1454 | * | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1455 | * Timestamps are only valid when the stream is in {@link #AAUDIO_STREAM_STATE_STARTED}. | 
|  | 1456 | * {@link #AAUDIO_ERROR_INVALID_STATE} will be returned if the stream is not started. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1457 | * Note that because requestStart() is asynchronous, timestamps will not be valid until | 
|  | 1458 | * a short time after calling requestStart(). | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1459 | * So {@link #AAUDIO_ERROR_INVALID_STATE} should not be considered a fatal error. | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1460 | * Just try calling again later. | 
|  | 1461 | * | 
|  | 1462 | * If an error occurs, then the position and time will not be modified. | 
|  | 1463 | * | 
|  | 1464 | * The position and time passed back are monotonically increasing. | 
|  | 1465 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1466 | * Available since API level 26. | 
|  | 1467 | * | 
| Phil Burk | 3316d5e | 2017-02-15 11:23:01 -0800 | [diff] [blame] | 1468 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Phil Burk | ec15950 | 2017-07-25 17:33:47 -0700 | [diff] [blame] | 1469 | * @param clockid CLOCK_MONOTONIC or CLOCK_BOOTTIME | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1470 | * @param framePosition pointer to a variable to receive the position | 
|  | 1471 | * @param timeNanoseconds pointer to a variable to receive the time | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1472 | * @return {@link #AAUDIO_OK} or a negative error | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1473 | */ | 
| Phil Burk | e2155ef | 2017-02-24 13:50:29 -0800 | [diff] [blame] | 1474 | AAUDIO_API aaudio_result_t AAudioStream_getTimestamp(AAudioStream* stream, | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1475 | clockid_t clockid, int64_t *framePosition, int64_t *timeNanoseconds) __INTRODUCED_IN(26); | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1476 |  | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 1477 | /** | 
|  | 1478 | * Return the use case for the stream. | 
|  | 1479 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1480 | * Available since API level 28. | 
| Phil Burk | 42452c0 | 2018-04-10 12:43:33 -0700 | [diff] [blame] | 1481 | * | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 1482 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1483 | * @return frames read | 
|  | 1484 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1485 | AAUDIO_API aaudio_usage_t AAudioStream_getUsage(AAudioStream* stream) __INTRODUCED_IN(28); | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 1486 |  | 
|  | 1487 | /** | 
|  | 1488 | * Return the content type for the stream. | 
|  | 1489 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1490 | * Available since API level 28. | 
| Phil Burk | 42452c0 | 2018-04-10 12:43:33 -0700 | [diff] [blame] | 1491 | * | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 1492 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1493 | * @return content type, for example {@link #AAUDIO_CONTENT_TYPE_MUSIC} | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 1494 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1495 | AAUDIO_API aaudio_content_type_t AAudioStream_getContentType(AAudioStream* stream) | 
|  | 1496 | __INTRODUCED_IN(28); | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 1497 |  | 
|  | 1498 | /** | 
|  | 1499 | * Return the input preset for the stream. | 
|  | 1500 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1501 | * Available since API level 28. | 
| Phil Burk | 42452c0 | 2018-04-10 12:43:33 -0700 | [diff] [blame] | 1502 | * | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 1503 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1504 | * @return input preset, for example {@link #AAUDIO_INPUT_PRESET_CAMCORDER} | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 1505 | */ | 
| Elliott Hughes | 85a4153 | 2018-06-18 13:17:24 -0700 | [diff] [blame] | 1506 | AAUDIO_API aaudio_input_preset_t AAudioStream_getInputPreset(AAudioStream* stream) | 
|  | 1507 | __INTRODUCED_IN(28); | 
| Phil Burk | 361b142 | 2017-12-20 14:24:16 -0800 | [diff] [blame] | 1508 |  | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1509 | /** | 
|  | 1510 | * Return the policy that determines whether the audio may or may not be captured | 
|  | 1511 | * by other apps or the system. | 
|  | 1512 | * | 
| Elliott Hughes | 64a3b06 | 2019-10-29 10:09:30 -0700 | [diff] [blame] | 1513 | * Available since API level 29. | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1514 | * | 
|  | 1515 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
| Kevin Rocard | fb7e846 | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1516 | * @return the allowed capture policy, for example {@link #AAUDIO_ALLOW_CAPTURE_BY_ALL} | 
| Kevin Rocard | 68646ba | 2019-03-20 13:26:49 -0700 | [diff] [blame] | 1517 | */ | 
|  | 1518 | AAUDIO_API aaudio_allowed_capture_policy_t AAudioStream_getAllowedCapturePolicy( | 
|  | 1519 | AAudioStream* stream) __INTRODUCED_IN(29); | 
|  | 1520 |  | 
| Eric Laurent | d17c850 | 2019-10-24 15:58:35 -0700 | [diff] [blame] | 1521 |  | 
|  | 1522 | /** | 
|  | 1523 | * Return whether this input stream is marked as privacy sensitive or not. | 
|  | 1524 | * | 
|  | 1525 | * See {@link #AAudioStreamBuilder_setPrivacySensitive()}. | 
|  | 1526 | * | 
|  | 1527 | * Added in API level 30. | 
|  | 1528 | * | 
|  | 1529 | * @param stream reference provided by AAudioStreamBuilder_openStream() | 
|  | 1530 | * @return true if privacy sensitive, false otherwise | 
|  | 1531 | */ | 
|  | 1532 | AAUDIO_API bool AAudioStream_isPrivacySensitive(AAudioStream* stream) | 
|  | 1533 | __INTRODUCED_IN(30); | 
|  | 1534 |  | 
| Phil Burk | 5ed503c | 2017-02-01 09:38:15 -0800 | [diff] [blame] | 1535 | #ifdef __cplusplus | 
|  | 1536 | } | 
|  | 1537 | #endif | 
|  | 1538 |  | 
|  | 1539 | #endif //AAUDIO_AAUDIO_H | 
| Phil Burk | a45be8b | 2017-04-05 14:45:48 -0700 | [diff] [blame] | 1540 |  | 
|  | 1541 | /** @} */ |