| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2007 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 | #ifndef ANDROID_AUDIOTRACK_H | 
 | 18 | #define ANDROID_AUDIOTRACK_H | 
 | 19 |  | 
| Glenn Kasten | a636433 | 2012-04-19 09:35:04 -0700 | [diff] [blame] | 20 | #include <cutils/sched_policy.h> | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 21 | #include <media/AudioSystem.h> | 
| Glenn Kasten | ce70374 | 2013-07-19 16:33:58 -0700 | [diff] [blame] | 22 | #include <media/AudioTimestamp.h> | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 23 | #include <media/IAudioTrack.h> | 
| Ricardo Garcia | 5a8a95d | 2015-04-18 14:47:04 -0700 | [diff] [blame] | 24 | #include <media/AudioResamplerPublic.h> | 
| Andy Hung | 90e8a97 | 2015-11-09 16:42:40 -0800 | [diff] [blame] | 25 | #include <media/Modulo.h> | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 26 | #include <utils/threads.h> | 
 | 27 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 28 | namespace android { | 
 | 29 |  | 
 | 30 | // ---------------------------------------------------------------------------- | 
 | 31 |  | 
| Glenn Kasten | 01d3acb | 2014-02-06 08:24:07 -0800 | [diff] [blame] | 32 | struct audio_track_cblk_t; | 
| Glenn Kasten | e3aa659 | 2012-12-04 12:22:46 -0800 | [diff] [blame] | 33 | class AudioTrackClientProxy; | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 34 | class StaticAudioTrackClientProxy; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 35 |  | 
 | 36 | // ---------------------------------------------------------------------------- | 
 | 37 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 38 | class AudioTrack : public RefBase | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 39 | { | 
 | 40 | public: | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 41 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 42 |     /* Events used by AudioTrack callback function (callback_t). | 
| Glenn Kasten | ad2f6db | 2012-11-01 15:45:06 -0700 | [diff] [blame] | 43 |      * Keep in sync with frameworks/base/media/java/android/media/AudioTrack.java NATIVE_EVENT_*. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 44 |      */ | 
 | 45 |     enum event_type { | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 46 |         EVENT_MORE_DATA = 0,        // Request to write more data to buffer. | 
| Andy Hung | a7f0335 | 2015-05-31 21:54:49 -0700 | [diff] [blame] | 47 |                                     // This event only occurs for TRANSFER_CALLBACK. | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 48 |                                     // If this event is delivered but the callback handler | 
| Andy Hung | a7f0335 | 2015-05-31 21:54:49 -0700 | [diff] [blame] | 49 |                                     // does not want to write more data, the handler must | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 50 |                                     // ignore the event by setting frameCount to zero. | 
| Andy Hung | a7f0335 | 2015-05-31 21:54:49 -0700 | [diff] [blame] | 51 |                                     // This might occur, for example, if the application is | 
 | 52 |                                     // waiting for source data or is at the end of stream. | 
 | 53 |                                     // | 
 | 54 |                                     // For data filling, it is preferred that the callback | 
 | 55 |                                     // does not block and instead returns a short count on | 
 | 56 |                                     // the amount of data actually delivered | 
 | 57 |                                     // (or 0, if no data is currently available). | 
 | 58 |         EVENT_UNDERRUN = 1,         // Buffer underrun occurred. This will not occur for | 
 | 59 |                                     // static tracks. | 
| Glenn Kasten | 85ab62c | 2012-11-01 11:11:38 -0700 | [diff] [blame] | 60 |         EVENT_LOOP_END = 2,         // Sample loop end was reached; playback restarted from | 
| Andy Hung | a7f0335 | 2015-05-31 21:54:49 -0700 | [diff] [blame] | 61 |                                     // loop start if loop count was not 0 for a static track. | 
| Glenn Kasten | 85ab62c | 2012-11-01 11:11:38 -0700 | [diff] [blame] | 62 |         EVENT_MARKER = 3,           // Playback head is at the specified marker position | 
 | 63 |                                     // (See setMarkerPosition()). | 
 | 64 |         EVENT_NEW_POS = 4,          // Playback head is at a new position | 
 | 65 |                                     // (See setPositionUpdatePeriod()). | 
| Andy Hung | a7f0335 | 2015-05-31 21:54:49 -0700 | [diff] [blame] | 66 |         EVENT_BUFFER_END = 5,       // Playback has completed for a static track. | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 67 |         EVENT_NEW_IAUDIOTRACK = 6,  // IAudioTrack was re-created, either due to re-routing and | 
 | 68 |                                     // voluntary invalidation by mediaserver, or mediaserver crash. | 
| Richard Fitzgerald | ad3af33 | 2013-03-25 16:54:37 +0000 | [diff] [blame] | 69 |         EVENT_STREAM_END = 7,       // Sent after all the buffers queued in AF and HW are played | 
| Andy Hung | a7f0335 | 2015-05-31 21:54:49 -0700 | [diff] [blame] | 70 |                                     // back (after stop is called) for an offloaded track. | 
| Glenn Kasten | 679e569 | 2015-06-01 08:15:05 -0700 | [diff] [blame] | 71 | #if 0   // FIXME not yet implemented | 
| Glenn Kasten | ce70374 | 2013-07-19 16:33:58 -0700 | [diff] [blame] | 72 |         EVENT_NEW_TIMESTAMP = 8,    // Delivered periodically and when there's a significant change | 
 | 73 |                                     // in the mapping from frame position to presentation time. | 
 | 74 |                                     // See AudioTimestamp for the information included with event. | 
| Glenn Kasten | 679e569 | 2015-06-01 08:15:05 -0700 | [diff] [blame] | 75 | #endif | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 76 |     }; | 
 | 77 |  | 
| Glenn Kasten | 3f02be2 | 2015-03-09 11:59:04 -0700 | [diff] [blame] | 78 |     /* Client should declare a Buffer and pass the address to obtainBuffer() | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 79 |      * and releaseBuffer().  See also callback_t for EVENT_MORE_DATA. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 80 |      */ | 
 | 81 |  | 
 | 82 |     class Buffer | 
 | 83 |     { | 
 | 84 |     public: | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 85 |         // FIXME use m prefix | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 86 |         size_t      frameCount;   // number of sample frames corresponding to size; | 
| Glenn Kasten | 3f02be2 | 2015-03-09 11:59:04 -0700 | [diff] [blame] | 87 |                                   // on input to obtainBuffer() it is the number of frames desired, | 
 | 88 |                                   // on output from obtainBuffer() it is the number of available | 
 | 89 |                                   //    [empty slots for] frames to be filled | 
 | 90 |                                   // on input to releaseBuffer() it is currently ignored | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 91 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 92 |         size_t      size;         // input/output in bytes == frameCount * frameSize | 
| Glenn Kasten | 3f02be2 | 2015-03-09 11:59:04 -0700 | [diff] [blame] | 93 |                                   // on input to obtainBuffer() it is ignored | 
 | 94 |                                   // on output from obtainBuffer() it is the number of available | 
 | 95 |                                   //    [empty slots for] bytes to be filled, | 
 | 96 |                                   //    which is frameCount * frameSize | 
 | 97 |                                   // on input to releaseBuffer() it is the number of bytes to | 
 | 98 |                                   //    release | 
 | 99 |                                   // FIXME This is redundant with respect to frameCount.  Consider | 
 | 100 |                                   //    removing size and making frameCount the primary field. | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 101 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 102 |         union { | 
 | 103 |             void*       raw; | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 104 |             short*      i16;      // signed 16-bit | 
 | 105 |             int8_t*     i8;       // unsigned 8-bit, offset by 0x80 | 
| Glenn Kasten | b882e93 | 2015-03-20 10:54:24 -0700 | [diff] [blame] | 106 |         };                        // input to obtainBuffer(): unused, output: pointer to buffer | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 107 |     }; | 
 | 108 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 109 |     /* As a convenience, if a callback is supplied, a handler thread | 
 | 110 |      * is automatically created with the appropriate priority. This thread | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 111 |      * invokes the callback when a new buffer becomes available or various conditions occur. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 112 |      * Parameters: | 
 | 113 |      * | 
 | 114 |      * event:   type of event notified (see enum AudioTrack::event_type). | 
 | 115 |      * user:    Pointer to context for use by the callback receiver. | 
 | 116 |      * info:    Pointer to optional parameter according to event type: | 
 | 117 |      *          - EVENT_MORE_DATA: pointer to AudioTrack::Buffer struct. The callback must not write | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 118 |      *            more bytes than indicated by 'size' field and update 'size' if fewer bytes are | 
 | 119 |      *            written. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 120 |      *          - EVENT_UNDERRUN: unused. | 
 | 121 |      *          - EVENT_LOOP_END: pointer to an int indicating the number of loops remaining. | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 122 |      *          - EVENT_MARKER: pointer to const uint32_t containing the marker position in frames. | 
 | 123 |      *          - EVENT_NEW_POS: pointer to const uint32_t containing the new position in frames. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 124 |      *          - EVENT_BUFFER_END: unused. | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 125 |      *          - EVENT_NEW_IAUDIOTRACK: unused. | 
| Glenn Kasten | ce70374 | 2013-07-19 16:33:58 -0700 | [diff] [blame] | 126 |      *          - EVENT_STREAM_END: unused. | 
 | 127 |      *          - EVENT_NEW_TIMESTAMP: pointer to const AudioTimestamp. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 128 |      */ | 
 | 129 |  | 
| Glenn Kasten | d217a8c | 2011-06-01 15:20:35 -0700 | [diff] [blame] | 130 |     typedef void (*callback_t)(int event, void* user, void *info); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 131 |  | 
| Chia-chi Yeh | 33005a9 | 2010-06-16 06:33:13 +0800 | [diff] [blame] | 132 |     /* Returns the minimum frame count required for the successful creation of | 
 | 133 |      * an AudioTrack object. | 
 | 134 |      * Returned status (from utils/Errors.h) can be: | 
 | 135 |      *  - NO_ERROR: successful operation | 
 | 136 |      *  - NO_INIT: audio server or audio hardware not initialized | 
| Glenn Kasten | 6ca126d | 2013-07-31 12:25:00 -0700 | [diff] [blame] | 137 |      *  - BAD_VALUE: unsupported configuration | 
| Glenn Kasten | 66a0467 | 2014-01-08 08:53:44 -0800 | [diff] [blame] | 138 |      * frameCount is guaranteed to be non-zero if status is NO_ERROR, | 
 | 139 |      * and is undefined otherwise. | 
| Glenn Kasten | 6991ed2 | 2015-03-20 08:57:24 -0700 | [diff] [blame] | 140 |      * FIXME This API assumes a route, and so should be deprecated. | 
| Chia-chi Yeh | 33005a9 | 2010-06-16 06:33:13 +0800 | [diff] [blame] | 141 |      */ | 
 | 142 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 143 |     static status_t getMinFrameCount(size_t* frameCount, | 
 | 144 |                                      audio_stream_type_t streamType, | 
 | 145 |                                      uint32_t sampleRate); | 
 | 146 |  | 
 | 147 |     /* How data is transferred to AudioTrack | 
 | 148 |      */ | 
 | 149 |     enum transfer_type { | 
 | 150 |         TRANSFER_DEFAULT,   // not specified explicitly; determine from the other parameters | 
 | 151 |         TRANSFER_CALLBACK,  // callback EVENT_MORE_DATA | 
| Glenn Kasten | 0f5d691 | 2015-03-20 11:30:00 -0700 | [diff] [blame] | 152 |         TRANSFER_OBTAIN,    // call obtainBuffer() and releaseBuffer() | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 153 |         TRANSFER_SYNC,      // synchronous write() | 
 | 154 |         TRANSFER_SHARED,    // shared memory | 
 | 155 |     }; | 
| Chia-chi Yeh | 33005a9 | 2010-06-16 06:33:13 +0800 | [diff] [blame] | 156 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 157 |     /* Constructs an uninitialized AudioTrack. No connection with | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 158 |      * AudioFlinger takes place.  Use set() after this. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 159 |      */ | 
 | 160 |                         AudioTrack(); | 
 | 161 |  | 
| Glenn Kasten | ad2f6db | 2012-11-01 15:45:06 -0700 | [diff] [blame] | 162 |     /* Creates an AudioTrack object and registers it with AudioFlinger. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 163 |      * Once created, the track needs to be started before it can be used. | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 164 |      * Unspecified values are set to appropriate default values. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 165 |      * | 
 | 166 |      * Parameters: | 
 | 167 |      * | 
 | 168 |      * streamType:         Select the type of audio stream this track is attached to | 
| Dima Zavin | fce7a47 | 2011-04-19 22:30:36 -0700 | [diff] [blame] | 169 |      *                     (e.g. AUDIO_STREAM_MUSIC). | 
| Glenn Kasten | 7fd0422 | 2016-02-02 12:38:16 -0800 | [diff] [blame] | 170 |      * sampleRate:         Data source sampling rate in Hz.  Zero means to use the sink sample rate. | 
 | 171 |      *                     A non-zero value must be specified if AUDIO_OUTPUT_FLAG_DIRECT is set. | 
 | 172 |      *                     0 will not work with current policy implementation for direct output | 
 | 173 |      *                     selection where an exact match is needed for sampling rate. | 
| Andy Hung | abdb990 | 2015-01-12 15:08:22 -0800 | [diff] [blame] | 174 |      * format:             Audio format. For mixed tracks, any PCM format supported by server is OK. | 
 | 175 |      *                     For direct and offloaded tracks, the possible format(s) depends on the | 
 | 176 |      *                     output sink. | 
| Glenn Kasten | 2b2165c | 2014-01-13 08:53:36 -0800 | [diff] [blame] | 177 |      * channelMask:        Channel mask, such that audio_is_output_channel(channelMask) is true. | 
| Eric Laurent | d8d6185 | 2012-03-05 17:06:40 -0800 | [diff] [blame] | 178 |      * frameCount:         Minimum size of track PCM buffer in frames. This defines the | 
| Glenn Kasten | ad2f6db | 2012-11-01 15:45:06 -0700 | [diff] [blame] | 179 |      *                     application's contribution to the | 
| Eric Laurent | d8d6185 | 2012-03-05 17:06:40 -0800 | [diff] [blame] | 180 |      *                     latency of the track. The actual size selected by the AudioTrack could be | 
 | 181 |      *                     larger if the requested size is not compatible with current audio HAL | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 182 |      *                     configuration.  Zero means to use a default value. | 
| Eric Laurent | 0ca3cf9 | 2012-04-18 09:24:29 -0700 | [diff] [blame] | 183 |      * flags:              See comments on audio_output_flags_t in <system/audio.h>. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 184 |      * cbf:                Callback function. If not null, this function is called periodically | 
| Glenn Kasten | a501787 | 2015-03-20 10:56:35 -0700 | [diff] [blame] | 185 |      *                     to provide new data in TRANSFER_CALLBACK mode | 
 | 186 |      *                     and inform of marker, position updates, etc. | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 187 |      * user:               Context for use by the callback receiver. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 188 |      * notificationFrames: The callback function is called each time notificationFrames PCM | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 189 |      *                     frames have been consumed from track input buffer. | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 190 |      *                     This is expressed in units of frames at the initial source sample rate. | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 191 |      * sessionId:          Specific session ID, or zero to use default. | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 192 |      * transferType:       How data is transferred to AudioTrack. | 
| Glenn Kasten | a501787 | 2015-03-20 10:56:35 -0700 | [diff] [blame] | 193 |      * offloadInfo:        If not NULL, provides offload parameters for | 
 | 194 |      *                     AudioSystem::getOutputForAttr(). | 
 | 195 |      * uid:                User ID of the app which initially requested this AudioTrack | 
 | 196 |      *                     for power management tracking, or -1 for current user ID. | 
 | 197 |      * pid:                Process ID of the app which initially requested this AudioTrack | 
 | 198 |      *                     for power management tracking, or -1 for current process ID. | 
 | 199 |      * pAttributes:        If not NULL, supersedes streamType for use case selection. | 
| Ronghua Wu | faeb0f2 | 2015-05-21 12:20:21 -0700 | [diff] [blame] | 200 |      * doNotReconnect:     If set to true, AudioTrack won't automatically recreate the IAudioTrack | 
 | 201 |                            binder to AudioFlinger. | 
 | 202 |                            It will return an error instead.  The application will recreate | 
 | 203 |                            the track based on offloading or different channel configuration, etc. | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 204 |      * threadCanCallJava:  Not present in parameter list, and so is fixed at false. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 205 |      */ | 
 | 206 |  | 
| Glenn Kasten | fff6d71 | 2012-01-12 16:38:12 -0800 | [diff] [blame] | 207 |                         AudioTrack( audio_stream_type_t streamType, | 
| Glenn Kasten | 7437322 | 2013-08-02 15:51:35 -0700 | [diff] [blame] | 208 |                                     uint32_t sampleRate, | 
 | 209 |                                     audio_format_t format, | 
| Glenn Kasten | d198b85 | 2015-03-16 14:55:53 -0700 | [diff] [blame] | 210 |                                     audio_channel_mask_t channelMask, | 
| Glenn Kasten | bce50bf | 2014-02-27 15:29:51 -0800 | [diff] [blame] | 211 |                                     size_t frameCount    = 0, | 
| Eric Laurent | 0ca3cf9 | 2012-04-18 09:24:29 -0700 | [diff] [blame] | 212 |                                     audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE, | 
| Glenn Kasten | a0d6833 | 2012-01-27 16:47:15 -0800 | [diff] [blame] | 213 |                                     callback_t cbf       = NULL, | 
 | 214 |                                     void* user           = NULL, | 
| Glenn Kasten | 838b3d8 | 2014-02-27 15:30:41 -0800 | [diff] [blame] | 215 |                                     uint32_t notificationFrames = 0, | 
| Glenn Kasten | d848eb4 | 2016-03-08 13:42:11 -0800 | [diff] [blame] | 216 |                                     audio_session_t sessionId  = AUDIO_SESSION_ALLOCATE, | 
| Richard Fitzgerald | ad3af33 | 2013-03-25 16:54:37 +0000 | [diff] [blame] | 217 |                                     transfer_type transferType = TRANSFER_DEFAULT, | 
| Marco Nelissen | 462fd2f | 2013-01-14 14:12:05 -0800 | [diff] [blame] | 218 |                                     const audio_offload_info_t *offloadInfo = NULL, | 
| Marco Nelissen | d457c97 | 2014-02-11 08:47:07 -0800 | [diff] [blame] | 219 |                                     int uid = -1, | 
| Jean-Michel Trivi | d9d7fa0 | 2014-06-24 08:01:46 -0700 | [diff] [blame] | 220 |                                     pid_t pid = -1, | 
| Ronghua Wu | faeb0f2 | 2015-05-21 12:20:21 -0700 | [diff] [blame] | 221 |                                     const audio_attributes_t* pAttributes = NULL, | 
 | 222 |                                     bool doNotReconnect = false); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 223 |  | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 224 |     /* Creates an audio track and registers it with AudioFlinger. | 
 | 225 |      * With this constructor, the track is configured for static buffer mode. | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 226 |      * Data to be rendered is passed in a shared memory buffer | 
| Glenn Kasten | a501787 | 2015-03-20 10:56:35 -0700 | [diff] [blame] | 227 |      * identified by the argument sharedBuffer, which should be non-0. | 
 | 228 |      * If sharedBuffer is zero, this constructor is equivalent to the previous constructor | 
 | 229 |      * but without the ability to specify a non-zero value for the frameCount parameter. | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 230 |      * The memory should be initialized to the desired data before calling start(). | 
| Glenn Kasten | 4bae364 | 2012-11-30 13:41:12 -0800 | [diff] [blame] | 231 |      * The write() method is not supported in this case. | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 232 |      * It is recommended to pass a callback function to be notified of playback end by an | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 233 |      * EVENT_UNDERRUN event. | 
 | 234 |      */ | 
 | 235 |  | 
| Glenn Kasten | fff6d71 | 2012-01-12 16:38:12 -0800 | [diff] [blame] | 236 |                         AudioTrack( audio_stream_type_t streamType, | 
| Glenn Kasten | 7437322 | 2013-08-02 15:51:35 -0700 | [diff] [blame] | 237 |                                     uint32_t sampleRate, | 
 | 238 |                                     audio_format_t format, | 
 | 239 |                                     audio_channel_mask_t channelMask, | 
 | 240 |                                     const sp<IMemory>& sharedBuffer, | 
| Eric Laurent | 0ca3cf9 | 2012-04-18 09:24:29 -0700 | [diff] [blame] | 241 |                                     audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE, | 
| Glenn Kasten | a0d6833 | 2012-01-27 16:47:15 -0800 | [diff] [blame] | 242 |                                     callback_t cbf      = NULL, | 
 | 243 |                                     void* user          = NULL, | 
| Glenn Kasten | 838b3d8 | 2014-02-27 15:30:41 -0800 | [diff] [blame] | 244 |                                     uint32_t notificationFrames = 0, | 
| Glenn Kasten | d848eb4 | 2016-03-08 13:42:11 -0800 | [diff] [blame] | 245 |                                     audio_session_t sessionId   = AUDIO_SESSION_ALLOCATE, | 
| Richard Fitzgerald | ad3af33 | 2013-03-25 16:54:37 +0000 | [diff] [blame] | 246 |                                     transfer_type transferType = TRANSFER_DEFAULT, | 
| Marco Nelissen | 462fd2f | 2013-01-14 14:12:05 -0800 | [diff] [blame] | 247 |                                     const audio_offload_info_t *offloadInfo = NULL, | 
| Marco Nelissen | d457c97 | 2014-02-11 08:47:07 -0800 | [diff] [blame] | 248 |                                     int uid = -1, | 
| Jean-Michel Trivi | d9d7fa0 | 2014-06-24 08:01:46 -0700 | [diff] [blame] | 249 |                                     pid_t pid = -1, | 
| Ronghua Wu | faeb0f2 | 2015-05-21 12:20:21 -0700 | [diff] [blame] | 250 |                                     const audio_attributes_t* pAttributes = NULL, | 
 | 251 |                                     bool doNotReconnect = false); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 252 |  | 
 | 253 |     /* Terminates the AudioTrack and unregisters it from AudioFlinger. | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 254 |      * Also destroys all resources associated with the AudioTrack. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 255 |      */ | 
| Glenn Kasten | 2799d74 | 2013-05-30 14:33:29 -0700 | [diff] [blame] | 256 | protected: | 
 | 257 |                         virtual ~AudioTrack(); | 
 | 258 | public: | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 259 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 260 |     /* Initialize an AudioTrack that was created using the AudioTrack() constructor. | 
 | 261 |      * Don't call set() more than once, or after the AudioTrack() constructors that take parameters. | 
| Glenn Kasten | bfd3184 | 2015-03-20 09:01:44 -0700 | [diff] [blame] | 262 |      * set() is not multi-thread safe. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 263 |      * Returned status (from utils/Errors.h) can be: | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 264 |      *  - NO_ERROR: successful initialization | 
 | 265 |      *  - INVALID_OPERATION: AudioTrack is already initialized | 
| Glenn Kasten | 28b76b3 | 2012-07-03 17:24:41 -0700 | [diff] [blame] | 266 |      *  - BAD_VALUE: invalid parameter (channelMask, format, sampleRate...) | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 267 |      *  - NO_INIT: audio server or audio hardware not initialized | 
| Glenn Kasten | 53cec22 | 2013-08-29 09:01:02 -0700 | [diff] [blame] | 268 |      * If status is not equal to NO_ERROR, don't call any other APIs on this AudioTrack. | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 269 |      * If sharedBuffer is non-0, the frameCount parameter is ignored and | 
 | 270 |      * replaced by the shared buffer's total allocated size in frame units. | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 271 |      * | 
 | 272 |      * Parameters not listed in the AudioTrack constructors above: | 
 | 273 |      * | 
 | 274 |      * threadCanCallJava:  Whether callbacks are made from an attached thread and thus can call JNI. | 
| Eric Laurent | e83b55d | 2014-11-14 10:06:21 -0800 | [diff] [blame] | 275 |      * | 
 | 276 |      * Internal state post condition: | 
 | 277 |      *      (mStreamType == AUDIO_STREAM_DEFAULT) implies this AudioTrack has valid attributes | 
| Glenn Kasten | ad2f6db | 2012-11-01 15:45:06 -0700 | [diff] [blame] | 278 |      */ | 
| Glenn Kasten | 7437322 | 2013-08-02 15:51:35 -0700 | [diff] [blame] | 279 |             status_t    set(audio_stream_type_t streamType, | 
 | 280 |                             uint32_t sampleRate, | 
 | 281 |                             audio_format_t format, | 
 | 282 |                             audio_channel_mask_t channelMask, | 
| Glenn Kasten | bce50bf | 2014-02-27 15:29:51 -0800 | [diff] [blame] | 283 |                             size_t frameCount   = 0, | 
| Eric Laurent | 0ca3cf9 | 2012-04-18 09:24:29 -0700 | [diff] [blame] | 284 |                             audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE, | 
| Glenn Kasten | a0d6833 | 2012-01-27 16:47:15 -0800 | [diff] [blame] | 285 |                             callback_t cbf      = NULL, | 
 | 286 |                             void* user          = NULL, | 
| Glenn Kasten | 838b3d8 | 2014-02-27 15:30:41 -0800 | [diff] [blame] | 287 |                             uint32_t notificationFrames = 0, | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 288 |                             const sp<IMemory>& sharedBuffer = 0, | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 289 |                             bool threadCanCallJava = false, | 
| Glenn Kasten | d848eb4 | 2016-03-08 13:42:11 -0800 | [diff] [blame] | 290 |                             audio_session_t sessionId  = AUDIO_SESSION_ALLOCATE, | 
| Richard Fitzgerald | ad3af33 | 2013-03-25 16:54:37 +0000 | [diff] [blame] | 291 |                             transfer_type transferType = TRANSFER_DEFAULT, | 
| Marco Nelissen | 462fd2f | 2013-01-14 14:12:05 -0800 | [diff] [blame] | 292 |                             const audio_offload_info_t *offloadInfo = NULL, | 
| Marco Nelissen | d457c97 | 2014-02-11 08:47:07 -0800 | [diff] [blame] | 293 |                             int uid = -1, | 
| Jean-Michel Trivi | faabb51 | 2014-06-11 16:55:06 -0700 | [diff] [blame] | 294 |                             pid_t pid = -1, | 
| Ronghua Wu | faeb0f2 | 2015-05-21 12:20:21 -0700 | [diff] [blame] | 295 |                             const audio_attributes_t* pAttributes = NULL, | 
 | 296 |                             bool doNotReconnect = false); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 297 |  | 
| Glenn Kasten | 53cec22 | 2013-08-29 09:01:02 -0700 | [diff] [blame] | 298 |     /* Result of constructing the AudioTrack. This must be checked for successful initialization | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 299 |      * before using any AudioTrack API (except for set()), because using | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 300 |      * an uninitialized AudioTrack produces undefined results. | 
 | 301 |      * See set() method above for possible return codes. | 
 | 302 |      */ | 
| Glenn Kasten | 01437b7 | 2012-11-29 07:32:49 -0800 | [diff] [blame] | 303 |             status_t    initCheck() const   { return mStatus; } | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 304 |  | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 305 |     /* Returns this track's estimated latency in milliseconds. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 306 |      * This includes the latency due to AudioTrack buffer size, AudioMixer (if any) | 
 | 307 |      * and audio hardware driver. | 
 | 308 |      */ | 
| Glenn Kasten | c9b2e20 | 2013-02-26 11:32:32 -0800 | [diff] [blame] | 309 |             uint32_t    latency() const     { return mLatency; } | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 310 |  | 
| Phil Burk | 2812d9e | 2016-01-04 10:34:30 -0800 | [diff] [blame] | 311 |     /* Returns the number of application-level buffer underruns | 
 | 312 |      * since the AudioTrack was created. | 
 | 313 |      */ | 
 | 314 |             uint32_t    getUnderrunCount() const; | 
 | 315 |  | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 316 |     /* getters, see constructors and set() */ | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 317 |  | 
| Eric Laurent | e83b55d | 2014-11-14 10:06:21 -0800 | [diff] [blame] | 318 |             audio_stream_type_t streamType() const; | 
| Glenn Kasten | 01437b7 | 2012-11-29 07:32:49 -0800 | [diff] [blame] | 319 |             audio_format_t format() const   { return mFormat; } | 
| Glenn Kasten | b998065 | 2012-01-11 09:48:27 -0800 | [diff] [blame] | 320 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 321 |     /* Return frame size in bytes, which for linear PCM is | 
 | 322 |      * channelCount * (bit depth per channel / 8). | 
| Glenn Kasten | b998065 | 2012-01-11 09:48:27 -0800 | [diff] [blame] | 323 |      * channelCount is determined from channelMask, and bit depth comes from format. | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 324 |      * For non-linear formats, the frame size is typically 1 byte. | 
| Glenn Kasten | b998065 | 2012-01-11 09:48:27 -0800 | [diff] [blame] | 325 |      */ | 
| Glenn Kasten | 01437b7 | 2012-11-29 07:32:49 -0800 | [diff] [blame] | 326 |             size_t      frameSize() const   { return mFrameSize; } | 
 | 327 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 328 |             uint32_t    channelCount() const { return mChannelCount; } | 
| Glenn Kasten | bce50bf | 2014-02-27 15:29:51 -0800 | [diff] [blame] | 329 |             size_t      frameCount() const  { return mFrameCount; } | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 330 |  | 
| Phil Burk | c0adecb | 2016-01-08 12:44:11 -0800 | [diff] [blame] | 331 |     /* Return effective size of audio buffer that an application writes to | 
 | 332 |      * or a negative error if the track is uninitialized. | 
 | 333 |      */ | 
 | 334 |             ssize_t     getBufferSizeInFrames(); | 
 | 335 |  | 
 | 336 |     /* Set the effective size of audio buffer that an application writes to. | 
 | 337 |      * This is used to determine the amount of available room in the buffer, | 
 | 338 |      * which determines when a write will block. | 
 | 339 |      * This allows an application to raise and lower the audio latency. | 
 | 340 |      * The requested size may be adjusted so that it is | 
 | 341 |      * greater or equal to the absolute minimum and | 
 | 342 |      * less than or equal to the getBufferCapacityInFrames(). | 
 | 343 |      * It may also be adjusted slightly for internal reasons. | 
 | 344 |      * | 
 | 345 |      * Return the final size or a negative error if the track is unitialized | 
 | 346 |      * or does not support variable sizes. | 
 | 347 |      */ | 
 | 348 |             ssize_t     setBufferSizeInFrames(size_t size); | 
 | 349 |  | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 350 |     /* Return the static buffer specified in constructor or set(), or 0 for streaming mode */ | 
| Glenn Kasten | 01437b7 | 2012-11-29 07:32:49 -0800 | [diff] [blame] | 351 |             sp<IMemory> sharedBuffer() const { return mSharedBuffer; } | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 352 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 353 |     /* After it's created the track is not active. Call start() to | 
 | 354 |      * make it active. If set, the callback will start being called. | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 355 |      * If the track was previously paused, volume is ramped up over the first mix buffer. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 356 |      */ | 
| Richard Fitzgerald | b1a270d | 2013-05-14 12:12:21 +0100 | [diff] [blame] | 357 |             status_t        start(); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 358 |  | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 359 |     /* Stop a track. | 
 | 360 |      * In static buffer mode, the track is stopped immediately. | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 361 |      * In streaming mode, the callback will cease being called.  Note that obtainBuffer() still | 
 | 362 |      * works and will fill up buffers until the pool is exhausted, and then will return WOULD_BLOCK. | 
 | 363 |      * In streaming mode the stop does not occur immediately: any data remaining in the buffer | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 364 |      * is first drained, mixed, and output, and only then is the track marked as stopped. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 365 |      */ | 
 | 366 |             void        stop(); | 
 | 367 |             bool        stopped() const; | 
 | 368 |  | 
| Glenn Kasten | 4bae364 | 2012-11-30 13:41:12 -0800 | [diff] [blame] | 369 |     /* Flush a stopped or paused track. All previously buffered data is discarded immediately. | 
 | 370 |      * This has the effect of draining the buffers without mixing or output. | 
 | 371 |      * Flush is intended for streaming mode, for example before switching to non-contiguous content. | 
 | 372 |      * This function is a no-op if the track is not stopped or paused, or uses a static buffer. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 373 |      */ | 
 | 374 |             void        flush(); | 
 | 375 |  | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 376 |     /* Pause a track. After pause, the callback will cease being called and | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 377 |      * obtainBuffer returns WOULD_BLOCK. Note that obtainBuffer() still works | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 378 |      * and will fill up buffers until the pool is exhausted. | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 379 |      * Volume is ramped down over the next mix buffer following the pause request, | 
 | 380 |      * and then the track is marked as paused.  It can be resumed with ramp up by start(). | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 381 |      */ | 
 | 382 |             void        pause(); | 
 | 383 |  | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 384 |     /* Set volume for this track, mostly used for games' sound effects | 
 | 385 |      * left and right volumes. Levels must be >= 0.0 and <= 1.0. | 
| Glenn Kasten | b1c0993 | 2012-02-27 16:21:04 -0800 | [diff] [blame] | 386 |      * This is the older API.  New applications should use setVolume(float) when possible. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 387 |      */ | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 388 |             status_t    setVolume(float left, float right); | 
| Glenn Kasten | b1c0993 | 2012-02-27 16:21:04 -0800 | [diff] [blame] | 389 |  | 
 | 390 |     /* Set volume for all channels.  This is the preferred API for new applications, | 
 | 391 |      * especially for multi-channel content. | 
 | 392 |      */ | 
 | 393 |             status_t    setVolume(float volume); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 394 |  | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 395 |     /* Set the send level for this track. An auxiliary effect should be attached | 
 | 396 |      * to the track with attachEffect(). Level must be >= 0.0 and <= 1.0. | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 397 |      */ | 
| Eric Laurent | 2beeb50 | 2010-07-16 07:43:46 -0700 | [diff] [blame] | 398 |             status_t    setAuxEffectSendLevel(float level); | 
| Glenn Kasten | a5224f3 | 2012-01-04 12:41:44 -0800 | [diff] [blame] | 399 |             void        getAuxEffectSendLevel(float* level) const; | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 400 |  | 
| Glenn Kasten | 7fd0422 | 2016-02-02 12:38:16 -0800 | [diff] [blame] | 401 |     /* Set source sample rate for this track in Hz, mostly used for games' sound effects. | 
 | 402 |      * Zero is not permitted. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 403 |      */ | 
| Glenn Kasten | 3b16c76 | 2012-11-14 08:44:39 -0800 | [diff] [blame] | 404 |             status_t    setSampleRate(uint32_t sampleRate); | 
 | 405 |  | 
| Glenn Kasten | 7fd0422 | 2016-02-02 12:38:16 -0800 | [diff] [blame] | 406 |     /* Return current source sample rate in Hz. | 
 | 407 |      * If specified as zero in constructor or set(), this will be the sink sample rate. | 
 | 408 |      */ | 
| Glenn Kasten | a5224f3 | 2012-01-04 12:41:44 -0800 | [diff] [blame] | 409 |             uint32_t    getSampleRate() const; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 410 |  | 
| Lajos Molnar | 3a474aa | 2015-04-24 17:10:07 -0700 | [diff] [blame] | 411 |     /* Return the original source sample rate in Hz. This corresponds to the sample rate | 
 | 412 |      * if playback rate had normal speed and pitch. | 
 | 413 |      */ | 
 | 414 |             uint32_t    getOriginalSampleRate() const; | 
 | 415 |  | 
| Andy Hung | 8edb8dc | 2015-03-26 19:13:55 -0700 | [diff] [blame] | 416 |     /* Set source playback rate for timestretch | 
 | 417 |      * 1.0 is normal speed: < 1.0 is slower, > 1.0 is faster | 
 | 418 |      * 1.0 is normal pitch: < 1.0 is lower pitch, > 1.0 is higher pitch | 
 | 419 |      * | 
 | 420 |      * AUDIO_TIMESTRETCH_SPEED_MIN <= speed <= AUDIO_TIMESTRETCH_SPEED_MAX | 
 | 421 |      * AUDIO_TIMESTRETCH_PITCH_MIN <= pitch <= AUDIO_TIMESTRETCH_PITCH_MAX | 
 | 422 |      * | 
 | 423 |      * Speed increases the playback rate of media, but does not alter pitch. | 
 | 424 |      * Pitch increases the "tonal frequency" of media, but does not affect the playback rate. | 
 | 425 |      */ | 
| Ricardo Garcia | 5a8a95d | 2015-04-18 14:47:04 -0700 | [diff] [blame] | 426 |             status_t    setPlaybackRate(const AudioPlaybackRate &playbackRate); | 
| Andy Hung | 8edb8dc | 2015-03-26 19:13:55 -0700 | [diff] [blame] | 427 |  | 
 | 428 |     /* Return current playback rate */ | 
| Ricardo Garcia | 5a8a95d | 2015-04-18 14:47:04 -0700 | [diff] [blame] | 429 |             const AudioPlaybackRate& getPlaybackRate() const; | 
| Andy Hung | 8edb8dc | 2015-03-26 19:13:55 -0700 | [diff] [blame] | 430 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 431 |     /* Enables looping and sets the start and end points of looping. | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 432 |      * Only supported for static buffer mode. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 433 |      * | 
 | 434 |      * Parameters: | 
 | 435 |      * | 
| Glenn Kasten | 9c6745f | 2012-11-30 13:35:29 -0800 | [diff] [blame] | 436 |      * loopStart:   loop start in frames relative to start of buffer. | 
 | 437 |      * loopEnd:     loop end in frames relative to start of buffer. | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 438 |      * loopCount:   number of loops to execute. Calling setLoop() with loopCount == 0 cancels any | 
| Glenn Kasten | 9c6745f | 2012-11-30 13:35:29 -0800 | [diff] [blame] | 439 |      *              pending or active loop. loopCount == -1 means infinite looping. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 440 |      * | 
 | 441 |      * For proper operation the following condition must be respected: | 
| Glenn Kasten | 9c6745f | 2012-11-30 13:35:29 -0800 | [diff] [blame] | 442 |      *      loopCount != 0 implies 0 <= loopStart < loopEnd <= frameCount(). | 
 | 443 |      * | 
 | 444 |      * If the loop period (loopEnd - loopStart) is too small for the implementation to support, | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 445 |      * setLoop() will return BAD_VALUE.  loopCount must be >= -1. | 
| Glenn Kasten | 9c6745f | 2012-11-30 13:35:29 -0800 | [diff] [blame] | 446 |      * | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 447 |      */ | 
 | 448 |             status_t    setLoop(uint32_t loopStart, uint32_t loopEnd, int loopCount); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 449 |  | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 450 |     /* Sets marker position. When playback reaches the number of frames specified, a callback with | 
 | 451 |      * event type EVENT_MARKER is called. Calling setMarkerPosition with marker == 0 cancels marker | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 452 |      * notification callback.  To set a marker at a position which would compute as 0, | 
| Glenn Kasten | 2b2165c | 2014-01-13 08:53:36 -0800 | [diff] [blame] | 453 |      * a workaround is to set the marker at a nearby position such as ~0 or 1. | 
| Glenn Kasten | 85ab62c | 2012-11-01 11:11:38 -0700 | [diff] [blame] | 454 |      * If the AudioTrack has been opened with no callback function associated, the operation will | 
 | 455 |      * fail. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 456 |      * | 
 | 457 |      * Parameters: | 
 | 458 |      * | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 459 |      * marker:   marker position expressed in wrapping (overflow) frame units, | 
 | 460 |      *           like the return value of getPosition(). | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 461 |      * | 
 | 462 |      * Returned status (from utils/Errors.h) can be: | 
 | 463 |      *  - NO_ERROR: successful operation | 
 | 464 |      *  - INVALID_OPERATION: the AudioTrack has no callback installed. | 
 | 465 |      */ | 
 | 466 |             status_t    setMarkerPosition(uint32_t marker); | 
| Glenn Kasten | a5224f3 | 2012-01-04 12:41:44 -0800 | [diff] [blame] | 467 |             status_t    getMarkerPosition(uint32_t *marker) const; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 468 |  | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 469 |     /* Sets position update period. Every time the number of frames specified has been played, | 
 | 470 |      * a callback with event type EVENT_NEW_POS is called. | 
 | 471 |      * Calling setPositionUpdatePeriod with updatePeriod == 0 cancels new position notification | 
 | 472 |      * callback. | 
| Glenn Kasten | 85ab62c | 2012-11-01 11:11:38 -0700 | [diff] [blame] | 473 |      * If the AudioTrack has been opened with no callback function associated, the operation will | 
 | 474 |      * fail. | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 475 |      * Extremely small values may be rounded up to a value the implementation can support. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 476 |      * | 
 | 477 |      * Parameters: | 
 | 478 |      * | 
 | 479 |      * updatePeriod:  position update notification period expressed in frames. | 
 | 480 |      * | 
 | 481 |      * Returned status (from utils/Errors.h) can be: | 
 | 482 |      *  - NO_ERROR: successful operation | 
 | 483 |      *  - INVALID_OPERATION: the AudioTrack has no callback installed. | 
 | 484 |      */ | 
 | 485 |             status_t    setPositionUpdatePeriod(uint32_t updatePeriod); | 
| Glenn Kasten | a5224f3 | 2012-01-04 12:41:44 -0800 | [diff] [blame] | 486 |             status_t    getPositionUpdatePeriod(uint32_t *updatePeriod) const; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 487 |  | 
| Glenn Kasten | 9c6745f | 2012-11-30 13:35:29 -0800 | [diff] [blame] | 488 |     /* Sets playback head position. | 
 | 489 |      * Only supported for static buffer mode. | 
 | 490 |      * | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 491 |      * Parameters: | 
 | 492 |      * | 
| Glenn Kasten | 9c6745f | 2012-11-30 13:35:29 -0800 | [diff] [blame] | 493 |      * position:  New playback head position in frames relative to start of buffer. | 
 | 494 |      *            0 <= position <= frameCount().  Note that end of buffer is permitted, | 
 | 495 |      *            but will result in an immediate underrun if started. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 496 |      * | 
 | 497 |      * Returned status (from utils/Errors.h) can be: | 
 | 498 |      *  - NO_ERROR: successful operation | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 499 |      *  - INVALID_OPERATION: the AudioTrack is not stopped or paused, or is streaming mode. | 
| Glenn Kasten | 85ab62c | 2012-11-01 11:11:38 -0700 | [diff] [blame] | 500 |      *  - BAD_VALUE: The specified position is beyond the number of frames present in AudioTrack | 
 | 501 |      *               buffer | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 502 |      */ | 
 | 503 |             status_t    setPosition(uint32_t position); | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 504 |  | 
 | 505 |     /* Return the total number of frames played since playback start. | 
 | 506 |      * The counter will wrap (overflow) periodically, e.g. every ~27 hours at 44.1 kHz. | 
 | 507 |      * It is reset to zero by flush(), reload(), and stop(). | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 508 |      * | 
 | 509 |      * Parameters: | 
 | 510 |      * | 
 | 511 |      *  position:  Address where to return play head position. | 
 | 512 |      * | 
 | 513 |      * Returned status (from utils/Errors.h) can be: | 
 | 514 |      *  - NO_ERROR: successful operation | 
 | 515 |      *  - BAD_VALUE:  position is NULL | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 516 |      */ | 
| Glenn Kasten | 200092b | 2014-08-15 15:13:30 -0700 | [diff] [blame] | 517 |             status_t    getPosition(uint32_t *position); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 518 |  | 
| Glenn Kasten | 9c6745f | 2012-11-30 13:35:29 -0800 | [diff] [blame] | 519 |     /* For static buffer mode only, this returns the current playback position in frames | 
| Glenn Kasten | 02de892 | 2013-07-31 12:30:12 -0700 | [diff] [blame] | 520 |      * relative to start of buffer.  It is analogous to the position units used by | 
| Glenn Kasten | 9c6745f | 2012-11-30 13:35:29 -0800 | [diff] [blame] | 521 |      * setLoop() and setPosition().  After underrun, the position will be at end of buffer. | 
 | 522 |      */ | 
 | 523 |             status_t    getBufferPosition(uint32_t *position); | 
| Glenn Kasten | 9c6745f | 2012-11-30 13:35:29 -0800 | [diff] [blame] | 524 |  | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 525 |     /* Forces AudioTrack buffer full condition. When playing a static buffer, this method avoids | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 526 |      * rewriting the buffer before restarting playback after a stop. | 
 | 527 |      * This method must be called with the AudioTrack in paused or stopped state. | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 528 |      * Not allowed in streaming mode. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 529 |      * | 
 | 530 |      * Returned status (from utils/Errors.h) can be: | 
 | 531 |      *  - NO_ERROR: successful operation | 
| Glenn Kasten | 083d1c1 | 2012-11-30 15:00:36 -0800 | [diff] [blame] | 532 |      *  - INVALID_OPERATION: the AudioTrack is not stopped or paused, or is streaming mode. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 533 |      */ | 
 | 534 |             status_t    reload(); | 
 | 535 |  | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 536 |     /* Returns a handle on the audio output used by this AudioTrack. | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 537 |      * | 
 | 538 |      * Parameters: | 
 | 539 |      *  none. | 
 | 540 |      * | 
 | 541 |      * Returned value: | 
| Glenn Kasten | 142f519 | 2014-03-25 17:44:59 -0700 | [diff] [blame] | 542 |      *  handle on audio hardware output, or AUDIO_IO_HANDLE_NONE if the | 
 | 543 |      *  track needed to be re-created but that failed | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 544 |      */ | 
| Glenn Kasten | 32860f7 | 2015-03-20 08:55:18 -0700 | [diff] [blame] | 545 | private: | 
| Glenn Kasten | 38e905b | 2014-01-13 10:21:48 -0800 | [diff] [blame] | 546 |             audio_io_handle_t    getOutput() const; | 
| Glenn Kasten | 32860f7 | 2015-03-20 08:55:18 -0700 | [diff] [blame] | 547 | public: | 
| Eric Laurent | c2f1f07 | 2009-07-17 12:17:14 -0700 | [diff] [blame] | 548 |  | 
| Paul McLean | aa98119 | 2015-03-21 09:55:15 -0700 | [diff] [blame] | 549 |     /* Selects the audio device to use for output of this AudioTrack. A value of | 
 | 550 |      * AUDIO_PORT_HANDLE_NONE indicates default (AudioPolicyManager) routing. | 
 | 551 |      * | 
 | 552 |      * Parameters: | 
 | 553 |      *  The device ID of the selected device (as returned by the AudioDevicesManager API). | 
 | 554 |      * | 
 | 555 |      * Returned value: | 
 | 556 |      *  - NO_ERROR: successful operation | 
 | 557 |      *    TODO: what else can happen here? | 
 | 558 |      */ | 
 | 559 |             status_t    setOutputDevice(audio_port_handle_t deviceId); | 
 | 560 |  | 
| Eric Laurent | 296fb13 | 2015-05-01 11:38:42 -0700 | [diff] [blame] | 561 |     /* Returns the ID of the audio device selected for this AudioTrack. | 
| Paul McLean | aa98119 | 2015-03-21 09:55:15 -0700 | [diff] [blame] | 562 |      * A value of AUDIO_PORT_HANDLE_NONE indicates default (AudioPolicyManager) routing. | 
 | 563 |      * | 
 | 564 |      * Parameters: | 
 | 565 |      *  none. | 
 | 566 |      */ | 
 | 567 |      audio_port_handle_t getOutputDevice(); | 
 | 568 |  | 
| Eric Laurent | 296fb13 | 2015-05-01 11:38:42 -0700 | [diff] [blame] | 569 |      /* Returns the ID of the audio device actually used by the output to which this AudioTrack is | 
 | 570 |       * attached. | 
 | 571 |       * A value of AUDIO_PORT_HANDLE_NONE indicates the audio track is not attached to any output. | 
 | 572 |       * | 
 | 573 |       * Parameters: | 
 | 574 |       *  none. | 
 | 575 |       */ | 
 | 576 |      audio_port_handle_t getRoutedDeviceId(); | 
 | 577 |  | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 578 |     /* Returns the unique session ID associated with this track. | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 579 |      * | 
 | 580 |      * Parameters: | 
 | 581 |      *  none. | 
 | 582 |      * | 
 | 583 |      * Returned value: | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 584 |      *  AudioTrack session ID. | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 585 |      */ | 
| Glenn Kasten | d848eb4 | 2016-03-08 13:42:11 -0800 | [diff] [blame] | 586 |             audio_session_t getSessionId() const { return mSessionId; } | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 587 |  | 
| Glenn Kasten | 362c4e6 | 2011-12-14 10:28:06 -0800 | [diff] [blame] | 588 |     /* Attach track auxiliary output to specified effect. Use effectId = 0 | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 589 |      * to detach track from effect. | 
 | 590 |      * | 
 | 591 |      * Parameters: | 
 | 592 |      * | 
 | 593 |      * effectId:  effectId obtained from AudioEffect::id(). | 
 | 594 |      * | 
 | 595 |      * Returned status (from utils/Errors.h) can be: | 
 | 596 |      *  - NO_ERROR: successful operation | 
 | 597 |      *  - INVALID_OPERATION: the effect is not an auxiliary effect. | 
 | 598 |      *  - BAD_VALUE: The specified effect ID is invalid | 
 | 599 |      */ | 
 | 600 |             status_t    attachAuxEffect(int effectId); | 
 | 601 |  | 
| Glenn Kasten | 3f02be2 | 2015-03-09 11:59:04 -0700 | [diff] [blame] | 602 |     /* Public API for TRANSFER_OBTAIN mode. | 
 | 603 |      * Obtains a buffer of up to "audioBuffer->frameCount" empty slots for frames. | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 604 |      * After filling these slots with data, the caller should release them with releaseBuffer(). | 
 | 605 |      * If the track buffer is not full, obtainBuffer() returns as many contiguous | 
 | 606 |      * [empty slots for] frames as are available immediately. | 
| Glenn Kasten | b46f394 | 2015-03-09 12:00:30 -0700 | [diff] [blame] | 607 |      * | 
 | 608 |      * If nonContig is non-NULL, it is an output parameter that will be set to the number of | 
 | 609 |      * additional non-contiguous frames that are predicted to be available immediately, | 
 | 610 |      * if the client were to release the first frames and then call obtainBuffer() again. | 
 | 611 |      * This value is only a prediction, and needs to be confirmed. | 
 | 612 |      * It will be set to zero for an error return. | 
 | 613 |      * | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 614 |      * If the track buffer is full and track is stopped, obtainBuffer() returns WOULD_BLOCK | 
 | 615 |      * regardless of the value of waitCount. | 
 | 616 |      * If the track buffer is full and track is not stopped, obtainBuffer() blocks with a | 
 | 617 |      * maximum timeout based on waitCount; see chart below. | 
| Glenn Kasten | ad2f6db | 2012-11-01 15:45:06 -0700 | [diff] [blame] | 618 |      * Buffers will be returned until the pool | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 619 |      * is exhausted, at which point obtainBuffer() will either block | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 620 |      * or return WOULD_BLOCK depending on the value of the "waitCount" | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 621 |      * parameter. | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 622 |      * | 
 | 623 |      * Interpretation of waitCount: | 
 | 624 |      *  +n  limits wait time to n * WAIT_PERIOD_MS, | 
 | 625 |      *  -1  causes an (almost) infinite wait time, | 
 | 626 |      *   0  non-blocking. | 
| Glenn Kasten | 05d4999 | 2012-11-06 14:25:20 -0800 | [diff] [blame] | 627 |      * | 
 | 628 |      * Buffer fields | 
 | 629 |      * On entry: | 
| Glenn Kasten | 3f02be2 | 2015-03-09 11:59:04 -0700 | [diff] [blame] | 630 |      *  frameCount  number of [empty slots for] frames requested | 
 | 631 |      *  size        ignored | 
 | 632 |      *  raw         ignored | 
| Glenn Kasten | 05d4999 | 2012-11-06 14:25:20 -0800 | [diff] [blame] | 633 |      * After error return: | 
 | 634 |      *  frameCount  0 | 
 | 635 |      *  size        0 | 
| Glenn Kasten | 22eb4e2 | 2012-11-07 14:03:00 -0800 | [diff] [blame] | 636 |      *  raw         undefined | 
| Glenn Kasten | 05d4999 | 2012-11-06 14:25:20 -0800 | [diff] [blame] | 637 |      * After successful return: | 
| Glenn Kasten | 3f02be2 | 2015-03-09 11:59:04 -0700 | [diff] [blame] | 638 |      *  frameCount  actual number of [empty slots for] frames available, <= number requested | 
| Glenn Kasten | 05d4999 | 2012-11-06 14:25:20 -0800 | [diff] [blame] | 639 |      *  size        actual number of bytes available | 
 | 640 |      *  raw         pointer to the buffer | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 641 |      */ | 
| Glenn Kasten | b46f394 | 2015-03-09 12:00:30 -0700 | [diff] [blame] | 642 |             status_t    obtainBuffer(Buffer* audioBuffer, int32_t waitCount, | 
| Glenn Kasten | 0f5d691 | 2015-03-20 11:30:00 -0700 | [diff] [blame] | 643 |                                 size_t *nonContig = NULL); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 644 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 645 | private: | 
| Glenn Kasten | 02de892 | 2013-07-31 12:30:12 -0700 | [diff] [blame] | 646 |     /* If nonContig is non-NULL, it is an output parameter that will be set to the number of | 
| Glenn Kasten | b46f394 | 2015-03-09 12:00:30 -0700 | [diff] [blame] | 647 |      * additional non-contiguous frames that are predicted to be available immediately, | 
 | 648 |      * if the client were to release the first frames and then call obtainBuffer() again. | 
 | 649 |      * This value is only a prediction, and needs to be confirmed. | 
 | 650 |      * It will be set to zero for an error return. | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 651 |      * FIXME We could pass an array of Buffers instead of only one Buffer to obtainBuffer(), | 
 | 652 |      * in case the requested amount of frames is in two or more non-contiguous regions. | 
 | 653 |      * FIXME requested and elapsed are both relative times.  Consider changing to absolute time. | 
 | 654 |      */ | 
 | 655 |             status_t    obtainBuffer(Buffer* audioBuffer, const struct timespec *requested, | 
 | 656 |                                      struct timespec *elapsed = NULL, size_t *nonContig = NULL); | 
 | 657 | public: | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 658 |  | 
| Glenn Kasten | 3f02be2 | 2015-03-09 11:59:04 -0700 | [diff] [blame] | 659 |     /* Public API for TRANSFER_OBTAIN mode. | 
 | 660 |      * Release a filled buffer of frames for AudioFlinger to process. | 
 | 661 |      * | 
 | 662 |      * Buffer fields: | 
 | 663 |      *  frameCount  currently ignored but recommend to set to actual number of frames filled | 
 | 664 |      *  size        actual number of bytes filled, must be multiple of frameSize | 
 | 665 |      *  raw         ignored | 
| Glenn Kasten | 3f02be2 | 2015-03-09 11:59:04 -0700 | [diff] [blame] | 666 |      */ | 
| Glenn Kasten | 54a8a45 | 2015-03-09 12:03:00 -0700 | [diff] [blame] | 667 |             void        releaseBuffer(const Buffer* audioBuffer); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 668 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 669 |     /* As a convenience we provide a write() interface to the audio buffer. | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 670 |      * Input parameter 'size' is in byte units. | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 671 |      * This is implemented on top of obtainBuffer/releaseBuffer. For best | 
 | 672 |      * performance use callbacks. Returns actual number of bytes written >= 0, | 
 | 673 |      * or one of the following negative status codes: | 
| Glenn Kasten | 02de892 | 2013-07-31 12:30:12 -0700 | [diff] [blame] | 674 |      *      INVALID_OPERATION   AudioTrack is configured for static buffer or streaming mode | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 675 |      *      BAD_VALUE           size is invalid | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 676 |      *      WOULD_BLOCK         when obtainBuffer() returns same, or | 
 | 677 |      *                          AudioTrack was stopped during the write | 
| Andy Hung | 1f1db83 | 2015-06-08 13:26:10 -0700 | [diff] [blame] | 678 |      *      DEAD_OBJECT         when AudioFlinger dies or the output device changes and | 
 | 679 |      *                          the track cannot be automatically restored. | 
 | 680 |      *                          The application needs to recreate the AudioTrack | 
 | 681 |      *                          because the audio device changed or AudioFlinger died. | 
 | 682 |      *                          This typically occurs for direct or offload tracks | 
 | 683 |      *                          or if mDoNotReconnect is true. | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 684 |      *      or any other error code returned by IAudioTrack::start() or restoreTrack_l(). | 
| Glenn Kasten | d198b85 | 2015-03-16 14:55:53 -0700 | [diff] [blame] | 685 |      * Default behavior is to only return when all data has been transferred. Set 'blocking' to | 
| Jean-Michel Trivi | 720ad9d | 2014-02-04 11:00:59 -0800 | [diff] [blame] | 686 |      * false for the method to return immediately without waiting to try multiple times to write | 
 | 687 |      * the full content of the buffer. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 688 |      */ | 
| Jean-Michel Trivi | 720ad9d | 2014-02-04 11:00:59 -0800 | [diff] [blame] | 689 |             ssize_t     write(const void* buffer, size_t size, bool blocking = true); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 690 |  | 
 | 691 |     /* | 
 | 692 |      * Dumps the state of an audio track. | 
| Glenn Kasten | 85fc799 | 2015-03-20 10:04:25 -0700 | [diff] [blame] | 693 |      * Not a general-purpose API; intended only for use by media player service to dump its tracks. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 694 |      */ | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 695 |             status_t    dump(int fd, const Vector<String16>& args) const; | 
 | 696 |  | 
 | 697 |     /* | 
 | 698 |      * Return the total number of frames which AudioFlinger desired but were unavailable, | 
 | 699 |      * and thus which resulted in an underrun.  Reset to zero by stop(). | 
 | 700 |      */ | 
 | 701 |             uint32_t    getUnderrunFrames() const; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 702 |  | 
| Richard Fitzgerald | ad3af33 | 2013-03-25 16:54:37 +0000 | [diff] [blame] | 703 |     /* Get the flags */ | 
| Glenn Kasten | 23a7545 | 2014-01-13 10:37:17 -0800 | [diff] [blame] | 704 |             audio_output_flags_t getFlags() const { AutoMutex _l(mLock); return mFlags; } | 
| Richard Fitzgerald | ad3af33 | 2013-03-25 16:54:37 +0000 | [diff] [blame] | 705 |  | 
 | 706 |     /* Set parameters - only possible when using direct output */ | 
 | 707 |             status_t    setParameters(const String8& keyValuePairs); | 
 | 708 |  | 
 | 709 |     /* Get parameters */ | 
 | 710 |             String8     getParameters(const String8& keys); | 
 | 711 |  | 
| Glenn Kasten | ce70374 | 2013-07-19 16:33:58 -0700 | [diff] [blame] | 712 |     /* Poll for a timestamp on demand. | 
 | 713 |      * Use if EVENT_NEW_TIMESTAMP is not delivered often enough for your needs, | 
 | 714 |      * or if you need to get the most recent timestamp outside of the event callback handler. | 
 | 715 |      * Caution: calling this method too often may be inefficient; | 
 | 716 |      * if you need a high resolution mapping between frame position and presentation time, | 
 | 717 |      * consider implementing that at application level, based on the low resolution timestamps. | 
| Andy Hung | 7f1bc8a | 2014-09-12 14:43:11 -0700 | [diff] [blame] | 718 |      * Returns NO_ERROR    if timestamp is valid. | 
 | 719 |      *         WOULD_BLOCK if called in STOPPED or FLUSHED state, or if called immediately after | 
 | 720 |      *                     start/ACTIVE, when the number of frames consumed is less than the | 
 | 721 |      *                     overall hardware latency to physical output. In WOULD_BLOCK cases, | 
 | 722 |      *                     one might poll again, or use getPosition(), or use 0 position and | 
 | 723 |      *                     current time for the timestamp. | 
| Andy Hung | 6653c93 | 2015-06-08 13:27:48 -0700 | [diff] [blame] | 724 |      *         DEAD_OBJECT if AudioFlinger dies or the output device changes and | 
 | 725 |      *                     the track cannot be automatically restored. | 
 | 726 |      *                     The application needs to recreate the AudioTrack | 
 | 727 |      *                     because the audio device changed or AudioFlinger died. | 
 | 728 |      *                     This typically occurs for direct or offload tracks | 
 | 729 |      *                     or if mDoNotReconnect is true. | 
| Andy Hung | 7f1bc8a | 2014-09-12 14:43:11 -0700 | [diff] [blame] | 730 |      *         INVALID_OPERATION  if called on a FastTrack, wrong state, or some other error. | 
 | 731 |      * | 
| Glenn Kasten | 200092b | 2014-08-15 15:13:30 -0700 | [diff] [blame] | 732 |      * The timestamp parameter is undefined on return, if status is not NO_ERROR. | 
| Glenn Kasten | ce70374 | 2013-07-19 16:33:58 -0700 | [diff] [blame] | 733 |      */ | 
 | 734 |             status_t    getTimestamp(AudioTimestamp& timestamp); | 
 | 735 |  | 
| Eric Laurent | 296fb13 | 2015-05-01 11:38:42 -0700 | [diff] [blame] | 736 |     /* Add an AudioDeviceCallback. The caller will be notified when the audio device to which this | 
 | 737 |      * AudioTrack is routed is updated. | 
 | 738 |      * Replaces any previously installed callback. | 
 | 739 |      * Parameters: | 
 | 740 |      *  callback:  The callback interface | 
 | 741 |      * Returns NO_ERROR if successful. | 
 | 742 |      *         INVALID_OPERATION if the same callback is already installed. | 
 | 743 |      *         NO_INIT or PREMISSION_DENIED if AudioFlinger service is not reachable | 
 | 744 |      *         BAD_VALUE if the callback is NULL | 
 | 745 |      */ | 
 | 746 |             status_t addAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback); | 
 | 747 |  | 
 | 748 |     /* remove an AudioDeviceCallback. | 
 | 749 |      * Parameters: | 
 | 750 |      *  callback:  The callback interface | 
 | 751 |      * Returns NO_ERROR if successful. | 
 | 752 |      *         INVALID_OPERATION if the callback is not installed | 
 | 753 |      *         BAD_VALUE if the callback is NULL | 
 | 754 |      */ | 
 | 755 |             status_t removeAudioDeviceCallback( | 
 | 756 |                     const sp<AudioSystem::AudioDeviceCallback>& callback); | 
 | 757 |  | 
| John Grossman | 4ff14ba | 2012-02-08 16:37:41 -0800 | [diff] [blame] | 758 | protected: | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 759 |     /* copying audio tracks is not allowed */ | 
 | 760 |                         AudioTrack(const AudioTrack& other); | 
 | 761 |             AudioTrack& operator = (const AudioTrack& other); | 
 | 762 |  | 
 | 763 |     /* a small internal class to handle the callback */ | 
 | 764 |     class AudioTrackThread : public Thread | 
 | 765 |     { | 
 | 766 |     public: | 
 | 767 |         AudioTrackThread(AudioTrack& receiver, bool bCanCallJava = false); | 
| Glenn Kasten | 3acbd05 | 2012-02-28 10:39:56 -0800 | [diff] [blame] | 768 |  | 
 | 769 |         // Do not call Thread::requestExitAndWait() without first calling requestExit(). | 
 | 770 |         // Thread::requestExitAndWait() is not virtual, and the implementation doesn't do enough. | 
 | 771 |         virtual void        requestExit(); | 
 | 772 |  | 
 | 773 |                 void        pause();    // suspend thread from execution at next loop boundary | 
 | 774 |                 void        resume();   // allow thread to execute, if not requested to exit | 
| Andy Hung | 3c09c78 | 2014-12-29 18:39:32 -0800 | [diff] [blame] | 775 |                 void        wake();     // wake to handle changed notification conditions. | 
| Glenn Kasten | 3acbd05 | 2012-02-28 10:39:56 -0800 | [diff] [blame] | 776 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 777 |     private: | 
| Glenn Kasten | 5a6cd22 | 2013-09-20 09:20:45 -0700 | [diff] [blame] | 778 |                 void        pauseInternal(nsecs_t ns = 0LL); | 
 | 779 |                                         // like pause(), but only used internally within thread | 
 | 780 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 781 |         friend class AudioTrack; | 
 | 782 |         virtual bool        threadLoop(); | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 783 |         AudioTrack&         mReceiver; | 
 | 784 |         virtual ~AudioTrackThread(); | 
| Glenn Kasten | 3acbd05 | 2012-02-28 10:39:56 -0800 | [diff] [blame] | 785 |         Mutex               mMyLock;    // Thread::mLock is private | 
 | 786 |         Condition           mMyCond;    // Thread::mThreadExitedCondition is private | 
| Glenn Kasten | 5a6cd22 | 2013-09-20 09:20:45 -0700 | [diff] [blame] | 787 |         bool                mPaused;    // whether thread is requested to pause at next loop entry | 
 | 788 |         bool                mPausedInt; // whether thread internally requests pause | 
 | 789 |         nsecs_t             mPausedNs;  // if mPausedInt then associated timeout, otherwise ignored | 
| Andy Hung | 3c09c78 | 2014-12-29 18:39:32 -0800 | [diff] [blame] | 790 |         bool                mIgnoreNextPausedInt;   // skip any internal pause and go immediately | 
 | 791 |                                         // to processAudioBuffer() as state may have changed | 
 | 792 |                                         // since pause time calculated. | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 793 |     }; | 
 | 794 |  | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 795 |             // body of AudioTrackThread::threadLoop() | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 796 |             // returns the maximum amount of time before we would like to run again, where: | 
 | 797 |             //      0           immediately | 
 | 798 |             //      > 0         no later than this many nanoseconds from now | 
 | 799 |             //      NS_WHENEVER still active but no particular deadline | 
 | 800 |             //      NS_INACTIVE inactive so don't run again until re-started | 
 | 801 |             //      NS_NEVER    never again | 
 | 802 |             static const nsecs_t NS_WHENEVER = -1, NS_INACTIVE = -2, NS_NEVER = -3; | 
| Glenn Kasten | 7c7be1e | 2013-12-19 16:34:04 -0800 | [diff] [blame] | 803 |             nsecs_t processAudioBuffer(); | 
| Glenn Kasten | ea7939a | 2012-03-14 12:56:26 -0700 | [diff] [blame] | 804 |  | 
| Glenn Kasten | d5ed6e8 | 2012-11-02 13:05:14 -0700 | [diff] [blame] | 805 |             // caller must hold lock on mLock for all _l methods | 
| Richard Fitzgerald | ad3af33 | 2013-03-25 16:54:37 +0000 | [diff] [blame] | 806 |  | 
| Glenn Kasten | 200092b | 2014-08-15 15:13:30 -0700 | [diff] [blame] | 807 |             status_t createTrack_l(); | 
| Glenn Kasten | 4bae364 | 2012-11-30 13:41:12 -0800 | [diff] [blame] | 808 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 809 |             // can only be called when mState != STATE_ACTIVE | 
| Eric Laurent | 1703cdf | 2011-03-07 14:52:59 -0800 | [diff] [blame] | 810 |             void flush_l(); | 
| Glenn Kasten | 4bae364 | 2012-11-30 13:41:12 -0800 | [diff] [blame] | 811 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 812 |             void setLoop_l(uint32_t loopStart, uint32_t loopEnd, int loopCount); | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 813 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 814 |             // FIXME enum is faster than strcmp() for parameter 'from' | 
 | 815 |             status_t restoreTrack_l(const char *from); | 
 | 816 |  | 
| Phil Burk | 2812d9e | 2016-01-04 10:34:30 -0800 | [diff] [blame] | 817 |             uint32_t    getUnderrunCount_l() const; | 
 | 818 |  | 
| Glenn Kasten | a9757af | 2015-03-20 09:00:14 -0700 | [diff] [blame] | 819 |             bool     isOffloaded() const; | 
 | 820 |             bool     isDirect() const; | 
 | 821 |             bool     isOffloadedOrDirect() const; | 
 | 822 |  | 
| Glenn Kasten | 23a7545 | 2014-01-13 10:37:17 -0800 | [diff] [blame] | 823 |             bool     isOffloaded_l() const | 
| Richard Fitzgerald | b1a270d | 2013-05-14 12:12:21 +0100 | [diff] [blame] | 824 |                 { return (mFlags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) != 0; } | 
 | 825 |  | 
| Eric Laurent | ab5cdba | 2014-06-09 17:22:27 -0700 | [diff] [blame] | 826 |             bool     isOffloadedOrDirect_l() const | 
 | 827 |                 { return (mFlags & (AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD| | 
 | 828 |                                                 AUDIO_OUTPUT_FLAG_DIRECT)) != 0; } | 
 | 829 |  | 
 | 830 |             bool     isDirect_l() const | 
 | 831 |                 { return (mFlags & AUDIO_OUTPUT_FLAG_DIRECT) != 0; } | 
 | 832 |  | 
| Glenn Kasten | 200092b | 2014-08-15 15:13:30 -0700 | [diff] [blame] | 833 |             // increment mPosition by the delta of mServer, and return new value of mPosition | 
| Andy Hung | 90e8a97 | 2015-11-09 16:42:40 -0800 | [diff] [blame] | 834 |             Modulo<uint32_t> updateAndGetPosition_l(); | 
| Glenn Kasten | 200092b | 2014-08-15 15:13:30 -0700 | [diff] [blame] | 835 |  | 
| Andy Hung | 8edb8dc | 2015-03-26 19:13:55 -0700 | [diff] [blame] | 836 |             // check sample rate and speed is compatible with AudioTrack | 
 | 837 |             bool     isSampleRateSpeedAllowed_l(uint32_t sampleRate, float speed) const; | 
 | 838 |  | 
| Eric Laurent | 4d231dc | 2016-03-11 18:38:23 -0800 | [diff] [blame] | 839 |             void     restartIfDisabled(); | 
 | 840 |  | 
| Glenn Kasten | 38e905b | 2014-01-13 10:21:48 -0800 | [diff] [blame] | 841 |     // Next 4 fields may be changed if IAudioTrack is re-created, but always != 0 | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 842 |     sp<IAudioTrack>         mAudioTrack; | 
 | 843 |     sp<IMemory>             mCblkMemory; | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 844 |     audio_track_cblk_t*     mCblk;                  // re-load after mLock.unlock() | 
| Glenn Kasten | 38e905b | 2014-01-13 10:21:48 -0800 | [diff] [blame] | 845 |     audio_io_handle_t       mOutput;                // returned by AudioSystem::getOutput() | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 846 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 847 |     sp<AudioTrackThread>    mAudioTrackThread; | 
| Phil Burk | 33ff89b | 2015-11-30 11:16:01 -0800 | [diff] [blame] | 848 |     bool                    mThreadCanCallJava; | 
| Glenn Kasten | b5ccb2d | 2014-01-13 14:42:43 -0800 | [diff] [blame] | 849 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 850 |     float                   mVolume[2]; | 
| Eric Laurent | be916aa | 2010-06-01 23:49:17 -0700 | [diff] [blame] | 851 |     float                   mSendLevel; | 
| Glenn Kasten | b187de1 | 2014-12-30 08:18:15 -0800 | [diff] [blame] | 852 |     mutable uint32_t        mSampleRate;            // mutable because getSampleRate() can update it | 
| Lajos Molnar | 3a474aa | 2015-04-24 17:10:07 -0700 | [diff] [blame] | 853 |     uint32_t                mOriginalSampleRate; | 
| Ricardo Garcia | 5a8a95d | 2015-04-18 14:47:04 -0700 | [diff] [blame] | 854 |     AudioPlaybackRate       mPlaybackRate; | 
| Phil Burk | c0adecb | 2016-01-08 12:44:11 -0800 | [diff] [blame] | 855 |  | 
 | 856 |     // Corresponds to current IAudioTrack, value is reported back by AudioFlinger to the client. | 
 | 857 |     // This allocated buffer size is maintained by the proxy. | 
 | 858 |     size_t                  mFrameCount;            // maximum size of buffer | 
 | 859 |  | 
| Glenn Kasten | 396fabd | 2014-01-08 08:54:23 -0800 | [diff] [blame] | 860 |     size_t                  mReqFrameCount;         // frame count to request the first or next time | 
 | 861 |                                                     // a new IAudioTrack is needed, non-decreasing | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 862 |  | 
| Andy Hung | 9f9e21e | 2015-05-31 21:45:36 -0700 | [diff] [blame] | 863 |     // The following AudioFlinger server-side values are cached in createAudioTrack_l(). | 
 | 864 |     // These values can be used for informational purposes until the track is invalidated, | 
 | 865 |     // whereupon restoreTrack_l() calls createTrack_l() to update the values. | 
 | 866 |     uint32_t                mAfLatency;             // AudioFlinger latency in ms | 
 | 867 |     size_t                  mAfFrameCount;          // AudioFlinger frame count | 
 | 868 |     uint32_t                mAfSampleRate;          // AudioFlinger sample rate | 
 | 869 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 870 |     // constant after constructor or set() | 
| Glenn Kasten | 60a8392 | 2012-06-21 12:56:37 -0700 | [diff] [blame] | 871 |     audio_format_t          mFormat;                // as requested by client, not forced to 16-bit | 
| Eric Laurent | e83b55d | 2014-11-14 10:06:21 -0800 | [diff] [blame] | 872 |     audio_stream_type_t     mStreamType;            // mStreamType == AUDIO_STREAM_DEFAULT implies | 
 | 873 |                                                     // this AudioTrack has valid attributes | 
| Glenn Kasten | e4756fe | 2012-11-29 13:38:14 -0800 | [diff] [blame] | 874 |     uint32_t                mChannelCount; | 
| Glenn Kasten | 28b76b3 | 2012-07-03 17:24:41 -0700 | [diff] [blame] | 875 |     audio_channel_mask_t    mChannelMask; | 
| Glenn Kasten | dd5f4c8 | 2014-01-13 10:26:32 -0800 | [diff] [blame] | 876 |     sp<IMemory>             mSharedBuffer; | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 877 |     transfer_type           mTransfer; | 
| Glenn Kasten | b5ccb2d | 2014-01-13 14:42:43 -0800 | [diff] [blame] | 878 |     audio_offload_info_t    mOffloadInfoCopy; | 
 | 879 |     const audio_offload_info_t* mOffloadInfo; | 
| Jean-Michel Trivi | faabb51 | 2014-06-11 16:55:06 -0700 | [diff] [blame] | 880 |     audio_attributes_t      mAttributes; | 
| Glenn Kasten | 83a0382 | 2012-11-12 07:58:20 -0800 | [diff] [blame] | 881 |  | 
| Andy Hung | abdb990 | 2015-01-12 15:08:22 -0800 | [diff] [blame] | 882 |     size_t                  mFrameSize;             // frame size in bytes | 
| Glenn Kasten | 83a0382 | 2012-11-12 07:58:20 -0800 | [diff] [blame] | 883 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 884 |     status_t                mStatus; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 885 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 886 |     // can change dynamically when IAudioTrack invalidated | 
 | 887 |     uint32_t                mLatency;               // in ms | 
 | 888 |  | 
 | 889 |     // Indicates the current track state.  Protected by mLock. | 
 | 890 |     enum State { | 
 | 891 |         STATE_ACTIVE, | 
 | 892 |         STATE_STOPPED, | 
 | 893 |         STATE_PAUSED, | 
| Richard Fitzgerald | b1a270d | 2013-05-14 12:12:21 +0100 | [diff] [blame] | 894 |         STATE_PAUSED_STOPPING, | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 895 |         STATE_FLUSHED, | 
| Richard Fitzgerald | b1a270d | 2013-05-14 12:12:21 +0100 | [diff] [blame] | 896 |         STATE_STOPPING, | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 897 |     }                       mState; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 898 |  | 
| Glenn Kasten | 6ca126d | 2013-07-31 12:25:00 -0700 | [diff] [blame] | 899 |     // for client callback handler | 
| Glenn Kasten | 99e53b8 | 2012-01-19 08:59:58 -0800 | [diff] [blame] | 900 |     callback_t              mCbf;                   // callback handler for events, or NULL | 
| Glenn Kasten | 6ca126d | 2013-07-31 12:25:00 -0700 | [diff] [blame] | 901 |     void*                   mUserData; | 
| Glenn Kasten | ad2f6db | 2012-11-01 15:45:06 -0700 | [diff] [blame] | 902 |  | 
 | 903 |     // for notification APIs | 
| Glenn Kasten | 85ab62c | 2012-11-01 11:11:38 -0700 | [diff] [blame] | 904 |     uint32_t                mNotificationFramesReq; // requested number of frames between each | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 905 |                                                     // notification callback, | 
 | 906 |                                                     // at initial source sample rate | 
| Glenn Kasten | 85ab62c | 2012-11-01 11:11:38 -0700 | [diff] [blame] | 907 |     uint32_t                mNotificationFramesAct; // actual number of frames between each | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 908 |                                                     // notification callback, | 
 | 909 |                                                     // at initial source sample rate | 
| Glenn Kasten | 2fc1473 | 2013-08-05 14:58:14 -0700 | [diff] [blame] | 910 |     bool                    mRefreshRemaining;      // processAudioBuffer() should refresh | 
 | 911 |                                                     // mRemainingFrames and mRetryOnPartialBuffer | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 912 |  | 
| Andy Hung | 4ede21d | 2014-12-12 15:37:34 -0800 | [diff] [blame] | 913 |                                                     // used for static track cbf and restoration | 
 | 914 |     int32_t                 mLoopCount;             // last setLoop loopCount; zero means disabled | 
 | 915 |     uint32_t                mLoopStart;             // last setLoop loopStart | 
 | 916 |     uint32_t                mLoopEnd;               // last setLoop loopEnd | 
| Andy Hung | 53c3b5f | 2014-12-15 16:42:05 -0800 | [diff] [blame] | 917 |     int32_t                 mLoopCountNotified;     // the last loopCount notified by callback. | 
 | 918 |                                                     // mLoopCountNotified counts down, matching | 
 | 919 |                                                     // the remaining loop count for static track | 
 | 920 |                                                     // playback. | 
| Andy Hung | 4ede21d | 2014-12-12 15:37:34 -0800 | [diff] [blame] | 921 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 922 |     // These are private to processAudioBuffer(), and are not protected by a lock | 
 | 923 |     uint32_t                mRemainingFrames;       // number of frames to request in obtainBuffer() | 
 | 924 |     bool                    mRetryOnPartialBuffer;  // sleep and retry after partial obtainBuffer() | 
| Richard Fitzgerald | b1a270d | 2013-05-14 12:12:21 +0100 | [diff] [blame] | 925 |     uint32_t                mObservedSequence;      // last observed value of mSequence | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 926 |  | 
| Andy Hung | 90e8a97 | 2015-11-09 16:42:40 -0800 | [diff] [blame] | 927 |     Modulo<uint32_t>        mMarkerPosition;        // in wrapping (overflow) frame units | 
| Jean-Michel Trivi | 2c22aeb | 2009-03-24 18:11:07 -0700 | [diff] [blame] | 928 |     bool                    mMarkerReached; | 
| Andy Hung | 90e8a97 | 2015-11-09 16:42:40 -0800 | [diff] [blame] | 929 |     Modulo<uint32_t>        mNewPosition;           // in frames | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 930 |     uint32_t                mUpdatePeriod;          // in frames, zero means no EVENT_NEW_POS | 
| Glenn Kasten | d202733 | 2015-03-20 08:59:18 -0700 | [diff] [blame] | 931 |  | 
| Andy Hung | 90e8a97 | 2015-11-09 16:42:40 -0800 | [diff] [blame] | 932 |     Modulo<uint32_t>        mServer;                // in frames, last known mProxy->getPosition() | 
| Glenn Kasten | 200092b | 2014-08-15 15:13:30 -0700 | [diff] [blame] | 933 |                                                     // which is count of frames consumed by server, | 
 | 934 |                                                     // reset by new IAudioTrack, | 
 | 935 |                                                     // whether it is reset by stop() is TBD | 
| Andy Hung | 90e8a97 | 2015-11-09 16:42:40 -0800 | [diff] [blame] | 936 |     Modulo<uint32_t>        mPosition;              // in frames, like mServer except continues | 
| Glenn Kasten | 200092b | 2014-08-15 15:13:30 -0700 | [diff] [blame] | 937 |                                                     // monotonically after new IAudioTrack, | 
 | 938 |                                                     // and could be easily widened to uint64_t | 
| Andy Hung | 90e8a97 | 2015-11-09 16:42:40 -0800 | [diff] [blame] | 939 |     Modulo<uint32_t>        mReleased;              // count of frames released to server | 
| Glenn Kasten | 200092b | 2014-08-15 15:13:30 -0700 | [diff] [blame] | 940 |                                                     // but not necessarily consumed by server, | 
 | 941 |                                                     // reset by stop() but continues monotonically | 
 | 942 |                                                     // after new IAudioTrack to restore mPosition, | 
 | 943 |                                                     // and could be easily widened to uint64_t | 
| Andy Hung | 7f1bc8a | 2014-09-12 14:43:11 -0700 | [diff] [blame] | 944 |     int64_t                 mStartUs;               // the start time after flush or stop. | 
 | 945 |                                                     // only used for offloaded and direct tracks. | 
| Glenn Kasten | ad2f6db | 2012-11-01 15:45:06 -0700 | [diff] [blame] | 946 |  | 
| Phil Burk | 1b42097 | 2015-04-22 10:52:21 -0700 | [diff] [blame] | 947 |     bool                    mPreviousTimestampValid;// true if mPreviousTimestamp is valid | 
| Andy Hung | c8e09c6 | 2015-06-03 23:43:36 -0700 | [diff] [blame] | 948 |     bool                    mTimestampStartupGlitchReported; // reduce log spam | 
| Phil Burk | 4c5a367 | 2015-04-30 16:18:53 -0700 | [diff] [blame] | 949 |     bool                    mRetrogradeMotionReported; // reduce log spam | 
| Phil Burk | 1b42097 | 2015-04-22 10:52:21 -0700 | [diff] [blame] | 950 |     AudioTimestamp          mPreviousTimestamp;     // used to detect retrograde motion | 
 | 951 |  | 
| Phil Burk | 2812d9e | 2016-01-04 10:34:30 -0800 | [diff] [blame] | 952 |     uint32_t                mUnderrunCountOffset;   // updated when restoring tracks | 
 | 953 |  | 
| Haynes Mathew George | ae34ed2 | 2016-01-28 11:58:39 -0800 | [diff] [blame] | 954 |     audio_output_flags_t    mFlags;                 // same as mOrigFlags, except for bits that may | 
 | 955 |                                                     // be denied by client or server, such as | 
 | 956 |                                                     // AUDIO_OUTPUT_FLAG_FAST.  mLock must be | 
 | 957 |                                                     // held to read or write those bits reliably. | 
 | 958 |     audio_output_flags_t    mOrigFlags;             // as specified in constructor or set(), const | 
| Glenn Kasten | 23a7545 | 2014-01-13 10:37:17 -0800 | [diff] [blame] | 959 |  | 
| Ronghua Wu | faeb0f2 | 2015-05-21 12:20:21 -0700 | [diff] [blame] | 960 |     bool                    mDoNotReconnect; | 
 | 961 |  | 
| Glenn Kasten | d848eb4 | 2016-03-08 13:42:11 -0800 | [diff] [blame] | 962 |     audio_session_t         mSessionId; | 
| Eric Laurent | 2beeb50 | 2010-07-16 07:43:46 -0700 | [diff] [blame] | 963 |     int                     mAuxEffectId; | 
| Glenn Kasten | d5ed6e8 | 2012-11-02 13:05:14 -0700 | [diff] [blame] | 964 |  | 
| Glenn Kasten | 9a2aaf9 | 2012-01-03 09:42:47 -0800 | [diff] [blame] | 965 |     mutable Mutex           mLock; | 
| Glenn Kasten | d5ed6e8 | 2012-11-02 13:05:14 -0700 | [diff] [blame] | 966 |  | 
| Glenn Kasten | 8791351 | 2011-06-22 16:15:25 -0700 | [diff] [blame] | 967 |     int                     mPreviousPriority;          // before start() | 
| Glenn Kasten | a636433 | 2012-04-19 09:35:04 -0700 | [diff] [blame] | 968 |     SchedPolicy             mPreviousSchedulingGroup; | 
| Glenn Kasten | a07f17c | 2013-04-23 12:39:37 -0700 | [diff] [blame] | 969 |     bool                    mAwaitBoost;    // thread should wait for priority boost before running | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 970 |  | 
 | 971 |     // The proxy should only be referenced while a lock is held because the proxy isn't | 
 | 972 |     // multi-thread safe, especially the SingleStateQueue part of the proxy. | 
 | 973 |     // An exception is that a blocking ClientProxy::obtainBuffer() may be called without a lock, | 
 | 974 |     // provided that the caller also holds an extra reference to the proxy and shared memory to keep | 
 | 975 |     // them around in case they are replaced during the obtainBuffer(). | 
 | 976 |     sp<StaticAudioTrackClientProxy> mStaticProxy;   // for type safety only | 
 | 977 |     sp<AudioTrackClientProxy>       mProxy;         // primary owner of the memory | 
 | 978 |  | 
 | 979 |     bool                    mInUnderrun;            // whether track is currently in underrun state | 
| Haynes Mathew George | 7064fd2 | 2014-01-08 13:59:53 -0800 | [diff] [blame] | 980 |     uint32_t                mPausedPosition; | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 981 |  | 
| Paul McLean | aa98119 | 2015-03-21 09:55:15 -0700 | [diff] [blame] | 982 |     // For Device Selection API | 
 | 983 |     //  a value of AUDIO_PORT_HANDLE_NONE indicated default (AudioPolicyManager) routing. | 
| Paul McLean | 466dc8e | 2015-04-17 13:15:36 -0600 | [diff] [blame] | 984 |     audio_port_handle_t     mSelectedDeviceId; | 
| Paul McLean | aa98119 | 2015-03-21 09:55:15 -0700 | [diff] [blame] | 985 |  | 
| Glenn Kasten | 9f80dd2 | 2012-12-18 15:57:32 -0800 | [diff] [blame] | 986 | private: | 
 | 987 |     class DeathNotifier : public IBinder::DeathRecipient { | 
 | 988 |     public: | 
 | 989 |         DeathNotifier(AudioTrack* audioTrack) : mAudioTrack(audioTrack) { } | 
 | 990 |     protected: | 
 | 991 |         virtual void        binderDied(const wp<IBinder>& who); | 
 | 992 |     private: | 
 | 993 |         const wp<AudioTrack> mAudioTrack; | 
 | 994 |     }; | 
 | 995 |  | 
 | 996 |     sp<DeathNotifier>       mDeathNotifier; | 
 | 997 |     uint32_t                mSequence;              // incremented for each new IAudioTrack attempt | 
| Marco Nelissen | 462fd2f | 2013-01-14 14:12:05 -0800 | [diff] [blame] | 998 |     int                     mClientUid; | 
| Marco Nelissen | d457c97 | 2014-02-11 08:47:07 -0800 | [diff] [blame] | 999 |     pid_t                   mClientPid; | 
| Eric Laurent | 296fb13 | 2015-05-01 11:38:42 -0700 | [diff] [blame] | 1000 |  | 
 | 1001 |     sp<AudioSystem::AudioDeviceCallback> mDeviceCallback; | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1002 | }; | 
 | 1003 |  | 
| The Android Open Source Project | 89fa4ad | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1004 | }; // namespace android | 
 | 1005 |  | 
 | 1006 | #endif // ANDROID_AUDIOTRACK_H |