AudioTrack.h revision ffa3695a012d22c6c81cf311232c5c84c06f9219
1e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/*
2e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Copyright (C) 2007 The Android Open Source Project
3e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
4e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Licensed under the Apache License, Version 2.0 (the "License");
5e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * you may not use this file except in compliance with the License.
6e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * You may obtain a copy of the License at
7e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
8e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *      http://www.apache.org/licenses/LICENSE-2.0
9e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
10e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Unless required by applicable law or agreed to in writing, software
11e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * distributed under the License is distributed on an "AS IS" BASIS,
12e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * See the License for the specific language governing permissions and
14e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * limitations under the License.
15e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */
16e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
17e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#ifndef ANDROID_AUDIOTRACK_H
18e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define ANDROID_AUDIOTRACK_H
19e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
20e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <cutils/sched_policy.h>
21e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/AudioSystem.h>
22e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/AudioTimestamp.h>
23e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/IAudioTrack.h>
24e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/AudioResamplerPublic.h>
25e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/Modulo.h>
26e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/threads.h>
27e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
28e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace android {
29e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
30e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// ----------------------------------------------------------------------------
31e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
32e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct audio_track_cblk_t;
33e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass AudioTrackClientProxy;
34e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass StaticAudioTrackClientProxy;
35e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
36e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// ----------------------------------------------------------------------------
37e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
38e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass AudioTrack : public RefBase
39e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{
40e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic:
41e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
42e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Events used by AudioTrack callback function (callback_t).
43e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Keep in sync with frameworks/base/media/java/android/media/AudioTrack.java NATIVE_EVENT_*.
44e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
45e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    enum event_type {
46e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        EVENT_MORE_DATA = 0,        // Request to write more data to buffer.
47e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // This event only occurs for TRANSFER_CALLBACK.
48e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // If this event is delivered but the callback handler
49e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // does not want to write more data, the handler must
50e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // ignore the event by setting frameCount to zero.
51e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // This might occur, for example, if the application is
52e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // waiting for source data or is at the end of stream.
53e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    //
54e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // For data filling, it is preferred that the callback
55e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // does not block and instead returns a short count on
56e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // the amount of data actually delivered
57e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // (or 0, if no data is currently available).
58e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        EVENT_UNDERRUN = 1,         // Buffer underrun occurred. This will not occur for
59e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // static tracks.
60e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        EVENT_LOOP_END = 2,         // Sample loop end was reached; playback restarted from
61e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // loop start if loop count was not 0 for a static track.
62e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        EVENT_MARKER = 3,           // Playback head is at the specified marker position
63e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // (See setMarkerPosition()).
64e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        EVENT_NEW_POS = 4,          // Playback head is at a new position
65e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // (See setPositionUpdatePeriod()).
66e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        EVENT_BUFFER_END = 5,       // Playback has completed for a static track.
67e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        EVENT_NEW_IAUDIOTRACK = 6,  // IAudioTrack was re-created, either due to re-routing and
68e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // voluntary invalidation by mediaserver, or mediaserver crash.
69e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        EVENT_STREAM_END = 7,       // Sent after all the buffers queued in AF and HW are played
70e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // back (after stop is called) for an offloaded track.
71e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#if 0   // FIXME not yet implemented
72e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        EVENT_NEW_TIMESTAMP = 8,    // Delivered periodically and when there's a significant change
73e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // in the mapping from frame position to presentation time.
74e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    // See AudioTimestamp for the information included with event.
75e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#endif
76e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    };
77e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
78e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Client should declare a Buffer and pass the address to obtainBuffer()
79e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * and releaseBuffer().  See also callback_t for EVENT_MORE_DATA.
80e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
81e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
82e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    class Buffer
83e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    {
84e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    public:
85e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // FIXME use m prefix
86e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        size_t      frameCount;   // number of sample frames corresponding to size;
87e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                  // on input to obtainBuffer() it is the number of frames desired,
88e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                  // on output from obtainBuffer() it is the number of available
89e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                  //    [empty slots for] frames to be filled
90e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                  // on input to releaseBuffer() it is currently ignored
91e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
92e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        size_t      size;         // input/output in bytes == frameCount * frameSize
93e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                  // on input to obtainBuffer() it is ignored
94e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                  // on output from obtainBuffer() it is the number of available
95e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                  //    [empty slots for] bytes to be filled,
96e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                  //    which is frameCount * frameSize
97e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                  // on input to releaseBuffer() it is the number of bytes to
98e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                  //    release
99e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                  // FIXME This is redundant with respect to frameCount.  Consider
100e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                  //    removing size and making frameCount the primary field.
101e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
102e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        union {
103e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            void*       raw;
104e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            short*      i16;      // signed 16-bit
105e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            int8_t*     i8;       // unsigned 8-bit, offset by 0x80
106e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        };                        // input to obtainBuffer(): unused, output: pointer to buffer
107e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    };
108e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
109e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* As a convenience, if a callback is supplied, a handler thread
110e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * is automatically created with the appropriate priority. This thread
111e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * invokes the callback when a new buffer becomes available or various conditions occur.
112e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
113e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
114e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * event:   type of event notified (see enum AudioTrack::event_type).
115e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * user:    Pointer to context for use by the callback receiver.
116e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * info:    Pointer to optional parameter according to event type:
117e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *          - EVENT_MORE_DATA: pointer to AudioTrack::Buffer struct. The callback must not write
118e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *            more bytes than indicated by 'size' field and update 'size' if fewer bytes are
119e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *            written.
120e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *          - EVENT_UNDERRUN: unused.
121e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *          - EVENT_LOOP_END: pointer to an int indicating the number of loops remaining.
122e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *          - EVENT_MARKER: pointer to const uint32_t containing the marker position in frames.
123e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *          - EVENT_NEW_POS: pointer to const uint32_t containing the new position in frames.
124e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *          - EVENT_BUFFER_END: unused.
125e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *          - EVENT_NEW_IAUDIOTRACK: unused.
126e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *          - EVENT_STREAM_END: unused.
127e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *          - EVENT_NEW_TIMESTAMP: pointer to const AudioTimestamp.
128e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
129e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
130e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    typedef void (*callback_t)(int event, void* user, void *info);
131e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
132e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Returns the minimum frame count required for the successful creation of
133e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * an AudioTrack object.
134e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returned status (from utils/Errors.h) can be:
135e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - NO_ERROR: successful operation
136e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - NO_INIT: audio server or audio hardware not initialized
137e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - BAD_VALUE: unsupported configuration
138e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * frameCount is guaranteed to be non-zero if status is NO_ERROR,
139e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * and is undefined otherwise.
140e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * FIXME This API assumes a route, and so should be deprecated.
141e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
142e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
143e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    static status_t getMinFrameCount(size_t* frameCount,
144e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                     audio_stream_type_t streamType,
145e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                     uint32_t sampleRate);
146e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
147e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* How data is transferred to AudioTrack
148e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
149e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    enum transfer_type {
150e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        TRANSFER_DEFAULT,   // not specified explicitly; determine from the other parameters
151e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        TRANSFER_CALLBACK,  // callback EVENT_MORE_DATA
152e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        TRANSFER_OBTAIN,    // call obtainBuffer() and releaseBuffer()
153e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        TRANSFER_SYNC,      // synchronous write()
154e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        TRANSFER_SHARED,    // shared memory
155e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    };
156e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
157e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Constructs an uninitialized AudioTrack. No connection with
158e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * AudioFlinger takes place.  Use set() after this.
159e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
160e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                        AudioTrack();
161e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
162e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Creates an AudioTrack object and registers it with AudioFlinger.
163e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Once created, the track needs to be started before it can be used.
164e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Unspecified values are set to appropriate default values.
165e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
166e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
167e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
168e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * streamType:         Select the type of audio stream this track is attached to
169e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     (e.g. AUDIO_STREAM_MUSIC).
170e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * sampleRate:         Data source sampling rate in Hz.  Zero means to use the sink sample rate.
171e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     A non-zero value must be specified if AUDIO_OUTPUT_FLAG_DIRECT is set.
172e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     0 will not work with current policy implementation for direct output
173e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     selection where an exact match is needed for sampling rate.
174e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * format:             Audio format. For mixed tracks, any PCM format supported by server is OK.
175e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     For direct and offloaded tracks, the possible format(s) depends on the
176e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     output sink.
177e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * channelMask:        Channel mask, such that audio_is_output_channel(channelMask) is true.
178e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * frameCount:         Minimum size of track PCM buffer in frames. This defines the
179e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     application's contribution to the
180e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     latency of the track. The actual size selected by the AudioTrack could be
181e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     larger if the requested size is not compatible with current audio HAL
182e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     configuration.  Zero means to use a default value.
183e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * flags:              See comments on audio_output_flags_t in <system/audio.h>.
184e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * cbf:                Callback function. If not null, this function is called periodically
185e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     to provide new data in TRANSFER_CALLBACK mode
186e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     and inform of marker, position updates, etc.
187e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * user:               Context for use by the callback receiver.
188e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * notificationFrames: The callback function is called each time notificationFrames PCM
189e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     frames have been consumed from track input buffer by server.
190e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     Zero means to use a default value, which is typically:
191e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                      - fast tracks: HAL buffer size, even if track frameCount is larger
192e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                      - normal tracks: 1/2 of track frameCount
193e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     A positive value means that many frames at initial source sample rate.
194e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     A negative value for this parameter specifies the negative of the
195e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     requested number of notifications (sub-buffers) in the entire buffer.
196e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     For fast tracks, the FastMixer will process one sub-buffer at a time.
197e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     The size of each sub-buffer is determined by the HAL.
198e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     To get "double buffering", for example, one should pass -2.
199e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     The minimum number of sub-buffers is 1 (expressed as -1),
200e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     and the maximum number of sub-buffers is 8 (expressed as -8).
201e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     Negative is only permitted for fast tracks, and if frameCount is zero.
202e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     TODO It is ugly to overload a parameter in this way depending on
203e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     whether it is positive, negative, or zero.  Consider splitting apart.
204e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * sessionId:          Specific session ID, or zero to use default.
205e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * transferType:       How data is transferred to AudioTrack.
206e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * offloadInfo:        If not NULL, provides offload parameters for
207e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     AudioSystem::getOutputForAttr().
208e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * uid:                User ID of the app which initially requested this AudioTrack
209e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     for power management tracking, or -1 for current user ID.
210e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * pid:                Process ID of the app which initially requested this AudioTrack
211e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     for power management tracking, or -1 for current process ID.
212e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * pAttributes:        If not NULL, supersedes streamType for use case selection.
213e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * doNotReconnect:     If set to true, AudioTrack won't automatically recreate the IAudioTrack
214e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                           binder to AudioFlinger.
215e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                           It will return an error instead.  The application will recreate
216e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                           the track based on offloading or different channel configuration, etc.
217e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * maxRequiredSpeed:   For PCM tracks, this creates an appropriate buffer size that will allow
218e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     maxRequiredSpeed playback. Values less than 1.0f and greater than
219e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     AUDIO_TIMESTRETCH_SPEED_MAX will be clamped.  For non-PCM tracks
220e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     and direct or offloaded tracks, this parameter is ignored.
221e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * threadCanCallJava:  Not present in parameter list, and so is fixed at false.
222e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
223e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
224e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                        AudioTrack( audio_stream_type_t streamType,
225e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    uint32_t sampleRate,
226e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    audio_format_t format,
227e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    audio_channel_mask_t channelMask,
228e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    size_t frameCount    = 0,
229e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
230e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    callback_t cbf       = NULL,
231e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    void* user           = NULL,
232e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    int32_t notificationFrames = 0,
233e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    audio_session_t sessionId  = AUDIO_SESSION_ALLOCATE,
234e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    transfer_type transferType = TRANSFER_DEFAULT,
235e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    const audio_offload_info_t *offloadInfo = NULL,
236e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    uid_t uid = AUDIO_UID_INVALID,
237e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    pid_t pid = -1,
238e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    const audio_attributes_t* pAttributes = NULL,
239e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    bool doNotReconnect = false,
240e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    float maxRequiredSpeed = 1.0f);
241e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
242e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Creates an audio track and registers it with AudioFlinger.
243e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * With this constructor, the track is configured for static buffer mode.
244e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Data to be rendered is passed in a shared memory buffer
245e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * identified by the argument sharedBuffer, which should be non-0.
246e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * If sharedBuffer is zero, this constructor is equivalent to the previous constructor
247e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * but without the ability to specify a non-zero value for the frameCount parameter.
248e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * The memory should be initialized to the desired data before calling start().
249e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * The write() method is not supported in this case.
250e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * It is recommended to pass a callback function to be notified of playback end by an
251e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * EVENT_UNDERRUN event.
252e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
253e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
254e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                        AudioTrack( audio_stream_type_t streamType,
255e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    uint32_t sampleRate,
256e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    audio_format_t format,
257e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    audio_channel_mask_t channelMask,
258e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    const sp<IMemory>& sharedBuffer,
259e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
260e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    callback_t cbf      = NULL,
261e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    void* user          = NULL,
262e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    int32_t notificationFrames = 0,
263e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    audio_session_t sessionId   = AUDIO_SESSION_ALLOCATE,
264e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    transfer_type transferType = TRANSFER_DEFAULT,
265e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    const audio_offload_info_t *offloadInfo = NULL,
266e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    uid_t uid = AUDIO_UID_INVALID,
267e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    pid_t pid = -1,
268e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    const audio_attributes_t* pAttributes = NULL,
269e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    bool doNotReconnect = false,
270e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    float maxRequiredSpeed = 1.0f);
271e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
272e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Terminates the AudioTrack and unregisters it from AudioFlinger.
273e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Also destroys all resources associated with the AudioTrack.
274e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
275e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprotected:
276e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                        virtual ~AudioTrack();
277e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic:
278e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
279e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Initialize an AudioTrack that was created using the AudioTrack() constructor.
280e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Don't call set() more than once, or after the AudioTrack() constructors that take parameters.
281e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * set() is not multi-thread safe.
282e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returned status (from utils/Errors.h) can be:
283e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - NO_ERROR: successful initialization
284e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - INVALID_OPERATION: AudioTrack is already initialized
285e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - BAD_VALUE: invalid parameter (channelMask, format, sampleRate...)
286e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - NO_INIT: audio server or audio hardware not initialized
287e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * If status is not equal to NO_ERROR, don't call any other APIs on this AudioTrack.
288e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * If sharedBuffer is non-0, the frameCount parameter is ignored and
289e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * replaced by the shared buffer's total allocated size in frame units.
290e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
291e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters not listed in the AudioTrack constructors above:
292e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
293e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * threadCanCallJava:  Whether callbacks are made from an attached thread and thus can call JNI.
294e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
295e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Internal state post condition:
296e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *      (mStreamType == AUDIO_STREAM_DEFAULT) implies this AudioTrack has valid attributes
297e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
298e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    set(audio_stream_type_t streamType,
299e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            uint32_t sampleRate,
300e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            audio_format_t format,
301e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            audio_channel_mask_t channelMask,
302e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            size_t frameCount   = 0,
303e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
304e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            callback_t cbf      = NULL,
305e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            void* user          = NULL,
306e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            int32_t notificationFrames = 0,
307e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            const sp<IMemory>& sharedBuffer = 0,
308e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            bool threadCanCallJava = false,
309e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            audio_session_t sessionId  = AUDIO_SESSION_ALLOCATE,
310e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            transfer_type transferType = TRANSFER_DEFAULT,
311e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            const audio_offload_info_t *offloadInfo = NULL,
312e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            uid_t uid = AUDIO_UID_INVALID,
313e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            pid_t pid = -1,
314e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            const audio_attributes_t* pAttributes = NULL,
315e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            bool doNotReconnect = false,
316e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            float maxRequiredSpeed = 1.0f);
317e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
318e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Result of constructing the AudioTrack. This must be checked for successful initialization
319e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * before using any AudioTrack API (except for set()), because using
320e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * an uninitialized AudioTrack produces undefined results.
321e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * See set() method above for possible return codes.
322e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
323e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    initCheck() const   { return mStatus; }
324e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
325e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Returns this track's estimated latency in milliseconds.
326e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * This includes the latency due to AudioTrack buffer size, AudioMixer (if any)
327e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * and audio hardware driver.
328e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
329fb12e20e426bc6bcff06e39fba45a931cf787040Haynes Mathew George            uint32_t    latency();
330e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
331e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Returns the number of application-level buffer underruns
332e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * since the AudioTrack was created.
333e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
334e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            uint32_t    getUnderrunCount() const;
335e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
336e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* getters, see constructors and set() */
337e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
338e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            audio_stream_type_t streamType() const;
339e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            audio_format_t format() const   { return mFormat; }
340e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
341e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Return frame size in bytes, which for linear PCM is
342e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * channelCount * (bit depth per channel / 8).
343e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * channelCount is determined from channelMask, and bit depth comes from format.
344e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * For non-linear formats, the frame size is typically 1 byte.
345e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
346e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            size_t      frameSize() const   { return mFrameSize; }
347e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
348e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            uint32_t    channelCount() const { return mChannelCount; }
349e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            size_t      frameCount() const  { return mFrameCount; }
350e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
351b588402d48c9634fa72e7e13ca6d6f2a0766cb98Phil Burk    /*
352b588402d48c9634fa72e7e13ca6d6f2a0766cb98Phil Burk     * Return the period of the notification callback in frames.
353b588402d48c9634fa72e7e13ca6d6f2a0766cb98Phil Burk     * This value is set when the AudioTrack is constructed.
354b588402d48c9634fa72e7e13ca6d6f2a0766cb98Phil Burk     * It can be modified if the AudioTrack is rerouted.
355b588402d48c9634fa72e7e13ca6d6f2a0766cb98Phil Burk     */
356b588402d48c9634fa72e7e13ca6d6f2a0766cb98Phil Burk            uint32_t    getNotificationPeriodInFrames() const { return mNotificationFramesAct; }
357e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
358e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Return effective size of audio buffer that an application writes to
359e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * or a negative error if the track is uninitialized.
360e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
361e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ssize_t     getBufferSizeInFrames();
362e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
363e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Returns the buffer duration in microseconds at current playback rate.
364e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
365e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    getBufferDurationInUs(int64_t *duration);
366e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
367e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Set the effective size of audio buffer that an application writes to.
368e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * This is used to determine the amount of available room in the buffer,
369e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * which determines when a write will block.
370e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * This allows an application to raise and lower the audio latency.
371e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * The requested size may be adjusted so that it is
372e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * greater or equal to the absolute minimum and
373e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * less than or equal to the getBufferCapacityInFrames().
374e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * It may also be adjusted slightly for internal reasons.
375e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
376e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Return the final size or a negative error if the track is unitialized
377e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * or does not support variable sizes.
378e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
379e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ssize_t     setBufferSizeInFrames(size_t size);
380e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
381e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Return the static buffer specified in constructor or set(), or 0 for streaming mode */
382e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            sp<IMemory> sharedBuffer() const { return mSharedBuffer; }
383e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
384e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* After it's created the track is not active. Call start() to
385e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * make it active. If set, the callback will start being called.
386e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * If the track was previously paused, volume is ramped up over the first mix buffer.
387e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
388e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t        start();
389e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
390e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Stop a track.
391e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * In static buffer mode, the track is stopped immediately.
392e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * In streaming mode, the callback will cease being called.  Note that obtainBuffer() still
393e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * works and will fill up buffers until the pool is exhausted, and then will return WOULD_BLOCK.
394e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * In streaming mode the stop does not occur immediately: any data remaining in the buffer
395e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * is first drained, mixed, and output, and only then is the track marked as stopped.
396e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
397e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            void        stop();
398e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            bool        stopped() const;
399e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
400e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Flush a stopped or paused track. All previously buffered data is discarded immediately.
401e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * This has the effect of draining the buffers without mixing or output.
402e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Flush is intended for streaming mode, for example before switching to non-contiguous content.
403e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * This function is a no-op if the track is not stopped or paused, or uses a static buffer.
404e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
405e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            void        flush();
406e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
407e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Pause a track. After pause, the callback will cease being called and
408e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * obtainBuffer returns WOULD_BLOCK. Note that obtainBuffer() still works
409e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * and will fill up buffers until the pool is exhausted.
410e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Volume is ramped down over the next mix buffer following the pause request,
411e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * and then the track is marked as paused.  It can be resumed with ramp up by start().
412e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
413e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            void        pause();
414e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
415e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Set volume for this track, mostly used for games' sound effects
416e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * left and right volumes. Levels must be >= 0.0 and <= 1.0.
417e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * This is the older API.  New applications should use setVolume(float) when possible.
418e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
419e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    setVolume(float left, float right);
420e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
421e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Set volume for all channels.  This is the preferred API for new applications,
422e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * especially for multi-channel content.
423e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
424e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    setVolume(float volume);
425e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
426e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Set the send level for this track. An auxiliary effect should be attached
427e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * to the track with attachEffect(). Level must be >= 0.0 and <= 1.0.
428e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
429e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    setAuxEffectSendLevel(float level);
430e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            void        getAuxEffectSendLevel(float* level) const;
431e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
432e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Set source sample rate for this track in Hz, mostly used for games' sound effects.
433e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Zero is not permitted.
434e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
435e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    setSampleRate(uint32_t sampleRate);
436e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
437e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Return current source sample rate in Hz.
438e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * If specified as zero in constructor or set(), this will be the sink sample rate.
439e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
440e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            uint32_t    getSampleRate() const;
441e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
442e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Return the original source sample rate in Hz. This corresponds to the sample rate
443e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * if playback rate had normal speed and pitch.
444e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
445e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            uint32_t    getOriginalSampleRate() const;
446e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
447e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Set source playback rate for timestretch
448e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * 1.0 is normal speed: < 1.0 is slower, > 1.0 is faster
449e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * 1.0 is normal pitch: < 1.0 is lower pitch, > 1.0 is higher pitch
450e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
451e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * AUDIO_TIMESTRETCH_SPEED_MIN <= speed <= AUDIO_TIMESTRETCH_SPEED_MAX
452e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * AUDIO_TIMESTRETCH_PITCH_MIN <= pitch <= AUDIO_TIMESTRETCH_PITCH_MAX
453e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
454e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Speed increases the playback rate of media, but does not alter pitch.
455e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Pitch increases the "tonal frequency" of media, but does not affect the playback rate.
456e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
457e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    setPlaybackRate(const AudioPlaybackRate &playbackRate);
458e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
459e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Return current playback rate */
460e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            const AudioPlaybackRate& getPlaybackRate() const;
461e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
462e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Enables looping and sets the start and end points of looping.
463e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Only supported for static buffer mode.
464e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
465e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
466e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
467e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * loopStart:   loop start in frames relative to start of buffer.
468e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * loopEnd:     loop end in frames relative to start of buffer.
469e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * loopCount:   number of loops to execute. Calling setLoop() with loopCount == 0 cancels any
470e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *              pending or active loop. loopCount == -1 means infinite looping.
471e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
472e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * For proper operation the following condition must be respected:
473e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *      loopCount != 0 implies 0 <= loopStart < loopEnd <= frameCount().
474e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
475e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * If the loop period (loopEnd - loopStart) is too small for the implementation to support,
476e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * setLoop() will return BAD_VALUE.  loopCount must be >= -1.
477e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
478e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
479e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    setLoop(uint32_t loopStart, uint32_t loopEnd, int loopCount);
480e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
481e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Sets marker position. When playback reaches the number of frames specified, a callback with
482e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * event type EVENT_MARKER is called. Calling setMarkerPosition with marker == 0 cancels marker
483e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * notification callback.  To set a marker at a position which would compute as 0,
484e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * a workaround is to set the marker at a nearby position such as ~0 or 1.
485e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * If the AudioTrack has been opened with no callback function associated, the operation will
486e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * fail.
487e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
488e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
489e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
490e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * marker:   marker position expressed in wrapping (overflow) frame units,
491e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *           like the return value of getPosition().
492e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
493e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returned status (from utils/Errors.h) can be:
494e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - NO_ERROR: successful operation
495e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - INVALID_OPERATION: the AudioTrack has no callback installed.
496e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
497e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    setMarkerPosition(uint32_t marker);
498e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    getMarkerPosition(uint32_t *marker) const;
499e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
500e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Sets position update period. Every time the number of frames specified has been played,
501e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * a callback with event type EVENT_NEW_POS is called.
502e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Calling setPositionUpdatePeriod with updatePeriod == 0 cancels new position notification
503e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * callback.
504e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * If the AudioTrack has been opened with no callback function associated, the operation will
505e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * fail.
506e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Extremely small values may be rounded up to a value the implementation can support.
507e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
508e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
509e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
510e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * updatePeriod:  position update notification period expressed in frames.
511e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
512e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returned status (from utils/Errors.h) can be:
513e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - NO_ERROR: successful operation
514e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - INVALID_OPERATION: the AudioTrack has no callback installed.
515e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
516e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    setPositionUpdatePeriod(uint32_t updatePeriod);
517e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    getPositionUpdatePeriod(uint32_t *updatePeriod) const;
518e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
519e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Sets playback head position.
520e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Only supported for static buffer mode.
521e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
522e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
523e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
524e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * position:  New playback head position in frames relative to start of buffer.
525e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *            0 <= position <= frameCount().  Note that end of buffer is permitted,
526e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *            but will result in an immediate underrun if started.
527e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
528e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returned status (from utils/Errors.h) can be:
529e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - NO_ERROR: successful operation
530e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - INVALID_OPERATION: the AudioTrack is not stopped or paused, or is streaming mode.
531e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - BAD_VALUE: The specified position is beyond the number of frames present in AudioTrack
532e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *               buffer
533e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
534e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    setPosition(uint32_t position);
535e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
536e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Return the total number of frames played since playback start.
537e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * The counter will wrap (overflow) periodically, e.g. every ~27 hours at 44.1 kHz.
538e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * It is reset to zero by flush(), reload(), and stop().
539e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
540e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
541e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
542e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  position:  Address where to return play head position.
543e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
544e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returned status (from utils/Errors.h) can be:
545e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - NO_ERROR: successful operation
546e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - BAD_VALUE:  position is NULL
547e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
548e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    getPosition(uint32_t *position);
549e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
550e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* For static buffer mode only, this returns the current playback position in frames
551e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * relative to start of buffer.  It is analogous to the position units used by
552e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * setLoop() and setPosition().  After underrun, the position will be at end of buffer.
553e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
554e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    getBufferPosition(uint32_t *position);
555e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
556e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Forces AudioTrack buffer full condition. When playing a static buffer, this method avoids
557e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * rewriting the buffer before restarting playback after a stop.
558e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * This method must be called with the AudioTrack in paused or stopped state.
559e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Not allowed in streaming mode.
560e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
561e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returned status (from utils/Errors.h) can be:
562e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - NO_ERROR: successful operation
563e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - INVALID_OPERATION: the AudioTrack is not stopped or paused, or is streaming mode.
564e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
565e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    reload();
566e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
567adbb75af4d3224194b9b772855db93fae19cf4cePhil Burk    /**
568adbb75af4d3224194b9b772855db93fae19cf4cePhil Burk     * @param transferType
569adbb75af4d3224194b9b772855db93fae19cf4cePhil Burk     * @return text string that matches the enum name
570adbb75af4d3224194b9b772855db93fae19cf4cePhil Burk     */
571adbb75af4d3224194b9b772855db93fae19cf4cePhil Burk            static const char * convertTransferToText(transfer_type transferType);
572adbb75af4d3224194b9b772855db93fae19cf4cePhil Burk
573e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Returns a handle on the audio output used by this AudioTrack.
574e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
575e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
576e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  none.
577e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
578e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returned value:
579e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  handle on audio hardware output, or AUDIO_IO_HANDLE_NONE if the
580e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  track needed to be re-created but that failed
581e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
582e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate:
583e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            audio_io_handle_t    getOutput() const;
584e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic:
585e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
586e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Selects the audio device to use for output of this AudioTrack. A value of
587e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * AUDIO_PORT_HANDLE_NONE indicates default (AudioPolicyManager) routing.
588e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
589e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
590e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  The device ID of the selected device (as returned by the AudioDevicesManager API).
591e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
592e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returned value:
593e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - NO_ERROR: successful operation
594e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *    TODO: what else can happen here?
595e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
596e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    setOutputDevice(audio_port_handle_t deviceId);
597e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
598e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Returns the ID of the audio device selected for this AudioTrack.
599e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * A value of AUDIO_PORT_HANDLE_NONE indicates default (AudioPolicyManager) routing.
600e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
601e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
602e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  none.
603e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
604e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     audio_port_handle_t getOutputDevice();
605e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
606e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     /* Returns the ID of the audio device actually used by the output to which this AudioTrack is
607e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman      * attached.
608e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman      * A value of AUDIO_PORT_HANDLE_NONE indicates the audio track is not attached to any output.
609e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman      *
610e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman      * Parameters:
611e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman      *  none.
612e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman      */
613e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     audio_port_handle_t getRoutedDeviceId();
614e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
615e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Returns the unique session ID associated with this track.
616e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
617e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
618e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  none.
619e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
620e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returned value:
621e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  AudioTrack session ID.
622e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
623e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            audio_session_t getSessionId() const { return mSessionId; }
624e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
625e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Attach track auxiliary output to specified effect. Use effectId = 0
626e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * to detach track from effect.
627e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
628e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
629e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
630e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * effectId:  effectId obtained from AudioEffect::id().
631e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
632e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returned status (from utils/Errors.h) can be:
633e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - NO_ERROR: successful operation
634e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - INVALID_OPERATION: the effect is not an auxiliary effect.
635e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  - BAD_VALUE: The specified effect ID is invalid
636e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
637e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    attachAuxEffect(int effectId);
638e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
639e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Public API for TRANSFER_OBTAIN mode.
640e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Obtains a buffer of up to "audioBuffer->frameCount" empty slots for frames.
641e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * After filling these slots with data, the caller should release them with releaseBuffer().
642e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * If the track buffer is not full, obtainBuffer() returns as many contiguous
643e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * [empty slots for] frames as are available immediately.
644e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
645e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * If nonContig is non-NULL, it is an output parameter that will be set to the number of
646e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * additional non-contiguous frames that are predicted to be available immediately,
647e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * if the client were to release the first frames and then call obtainBuffer() again.
648e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * This value is only a prediction, and needs to be confirmed.
649e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * It will be set to zero for an error return.
650e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
651e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * If the track buffer is full and track is stopped, obtainBuffer() returns WOULD_BLOCK
652e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * regardless of the value of waitCount.
653e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * If the track buffer is full and track is not stopped, obtainBuffer() blocks with a
654e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * maximum timeout based on waitCount; see chart below.
655e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Buffers will be returned until the pool
656e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * is exhausted, at which point obtainBuffer() will either block
657e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * or return WOULD_BLOCK depending on the value of the "waitCount"
658e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * parameter.
659e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
660e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Interpretation of waitCount:
661e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  +n  limits wait time to n * WAIT_PERIOD_MS,
662e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  -1  causes an (almost) infinite wait time,
663e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *   0  non-blocking.
664e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
665e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Buffer fields
666e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * On entry:
667e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  frameCount  number of [empty slots for] frames requested
668e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  size        ignored
669e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  raw         ignored
670e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * After error return:
671e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  frameCount  0
672e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  size        0
673e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  raw         undefined
674e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * After successful return:
675e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  frameCount  actual number of [empty slots for] frames available, <= number requested
676e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  size        actual number of bytes available
677e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  raw         pointer to the buffer
678e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
679e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    obtainBuffer(Buffer* audioBuffer, int32_t waitCount,
680e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                size_t *nonContig = NULL);
681e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
682e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate:
683e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* If nonContig is non-NULL, it is an output parameter that will be set to the number of
684e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * additional non-contiguous frames that are predicted to be available immediately,
685e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * if the client were to release the first frames and then call obtainBuffer() again.
686e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * This value is only a prediction, and needs to be confirmed.
687e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * It will be set to zero for an error return.
688e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * FIXME We could pass an array of Buffers instead of only one Buffer to obtainBuffer(),
689e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * in case the requested amount of frames is in two or more non-contiguous regions.
690e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * FIXME requested and elapsed are both relative times.  Consider changing to absolute time.
691e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
692e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    obtainBuffer(Buffer* audioBuffer, const struct timespec *requested,
693e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                     struct timespec *elapsed = NULL, size_t *nonContig = NULL);
694e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic:
695e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
696e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Public API for TRANSFER_OBTAIN mode.
697e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Release a filled buffer of frames for AudioFlinger to process.
698e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
699e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Buffer fields:
700e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  frameCount  currently ignored but recommend to set to actual number of frames filled
701e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  size        actual number of bytes filled, must be multiple of frameSize
702e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  raw         ignored
703e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
704e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            void        releaseBuffer(const Buffer* audioBuffer);
705e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
706e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* As a convenience we provide a write() interface to the audio buffer.
707e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Input parameter 'size' is in byte units.
708e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * This is implemented on top of obtainBuffer/releaseBuffer. For best
709e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * performance use callbacks. Returns actual number of bytes written >= 0,
710e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * or one of the following negative status codes:
711e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *      INVALID_OPERATION   AudioTrack is configured for static buffer or streaming mode
712e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *      BAD_VALUE           size is invalid
713e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *      WOULD_BLOCK         when obtainBuffer() returns same, or
714e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                          AudioTrack was stopped during the write
715e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *      DEAD_OBJECT         when AudioFlinger dies or the output device changes and
716e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                          the track cannot be automatically restored.
717e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                          The application needs to recreate the AudioTrack
718e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                          because the audio device changed or AudioFlinger died.
719e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                          This typically occurs for direct or offload tracks
720e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                          or if mDoNotReconnect is true.
721e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *      or any other error code returned by IAudioTrack::start() or restoreTrack_l().
722e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Default behavior is to only return when all data has been transferred. Set 'blocking' to
723e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * false for the method to return immediately without waiting to try multiple times to write
724e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * the full content of the buffer.
725e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
726e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ssize_t     write(const void* buffer, size_t size, bool blocking = true);
727e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
728e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /*
729e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Dumps the state of an audio track.
730e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Not a general-purpose API; intended only for use by media player service to dump its tracks.
731e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
732e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    dump(int fd, const Vector<String16>& args) const;
733e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
734e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /*
735e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Return the total number of frames which AudioFlinger desired but were unavailable,
736e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * and thus which resulted in an underrun.  Reset to zero by stop().
737e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
738e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            uint32_t    getUnderrunFrames() const;
739e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
740e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Get the flags */
741e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            audio_output_flags_t getFlags() const { AutoMutex _l(mLock); return mFlags; }
742e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
743e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Set parameters - only possible when using direct output */
744e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    setParameters(const String8& keyValuePairs);
745e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
746e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Sets the volume shaper object */
747e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            VolumeShaper::Status applyVolumeShaper(
748e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                    const sp<VolumeShaper::Configuration>& configuration,
749e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                    const sp<VolumeShaper::Operation>& operation);
750e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
751e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Gets the volume shaper state */
752e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            sp<VolumeShaper::State> getVolumeShaperState(int id);
753e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
754e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Get parameters */
755e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            String8     getParameters(const String8& keys);
756e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
757e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Poll for a timestamp on demand.
758e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Use if EVENT_NEW_TIMESTAMP is not delivered often enough for your needs,
759e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * or if you need to get the most recent timestamp outside of the event callback handler.
760e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Caution: calling this method too often may be inefficient;
761e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * if you need a high resolution mapping between frame position and presentation time,
762e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * consider implementing that at application level, based on the low resolution timestamps.
763e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returns NO_ERROR    if timestamp is valid.
764e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *         WOULD_BLOCK if called in STOPPED or FLUSHED state, or if called immediately after
765e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     start/ACTIVE, when the number of frames consumed is less than the
766e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     overall hardware latency to physical output. In WOULD_BLOCK cases,
767e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     one might poll again, or use getPosition(), or use 0 position and
768e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     current time for the timestamp.
769e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *         DEAD_OBJECT if AudioFlinger dies or the output device changes and
770e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     the track cannot be automatically restored.
771e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     The application needs to recreate the AudioTrack
772e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     because the audio device changed or AudioFlinger died.
773e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     This typically occurs for direct or offload tracks
774e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     or if mDoNotReconnect is true.
775e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *         INVALID_OPERATION  wrong state, or some other error.
776e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
777e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * The timestamp parameter is undefined on return, if status is not NO_ERROR.
778e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
779e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    getTimestamp(AudioTimestamp& timestamp);
780e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate:
781e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t    getTimestamp_l(AudioTimestamp& timestamp);
782e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic:
783e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
784e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Return the extended timestamp, with additional timebase info and improved drain behavior.
785e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
786e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * This is similar to the AudioTrack.java API:
787e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * getTimestamp(@NonNull AudioTimestamp timestamp, @AudioTimestamp.Timebase int timebase)
788e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
789e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Some differences between this method and the getTimestamp(AudioTimestamp& timestamp) method
790e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
791e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *   1. stop() by itself does not reset the frame position.
792e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *      A following start() resets the frame position to 0.
793e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *   2. flush() by itself does not reset the frame position.
794e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *      The frame position advances by the number of frames flushed,
795e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *      when the first frame after flush reaches the audio sink.
796e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *   3. BOOTTIME clock offsets are provided to help synchronize with
797e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *      non-audio streams, e.g. sensor data.
798e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *   4. Position is returned with 64 bits of resolution.
799e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
800e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
801e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  timestamp: A pointer to the caller allocated ExtendedTimestamp.
802e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
803e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returns NO_ERROR    on success; timestamp is filled with valid data.
804e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *         BAD_VALUE   if timestamp is NULL.
805e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *         WOULD_BLOCK if called immediately after start() when the number
806e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     of frames consumed is less than the
807e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     overall hardware latency to physical output. In WOULD_BLOCK cases,
808e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     one might poll again, or use getPosition(), or use 0 position and
809e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     current time for the timestamp.
810e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     If WOULD_BLOCK is returned, the timestamp is still
811e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     modified with the LOCATION_CLIENT portion filled.
812e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *         DEAD_OBJECT if AudioFlinger dies or the output device changes and
813e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     the track cannot be automatically restored.
814e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     The application needs to recreate the AudioTrack
815e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     because the audio device changed or AudioFlinger died.
816e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     This typically occurs for direct or offloaded tracks
817e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     or if mDoNotReconnect is true.
818e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *         INVALID_OPERATION  if called on a offloaded or direct track.
819e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                     Use getTimestamp(AudioTimestamp& timestamp) instead.
820e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
821e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t getTimestamp(ExtendedTimestamp *timestamp);
822e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate:
823e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t getTimestamp_l(ExtendedTimestamp *timestamp);
824e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic:
825e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
826e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Add an AudioDeviceCallback. The caller will be notified when the audio device to which this
827e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * AudioTrack is routed is updated.
828e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Replaces any previously installed callback.
829e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
830e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  callback:  The callback interface
831e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returns NO_ERROR if successful.
832e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *         INVALID_OPERATION if the same callback is already installed.
833e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *         NO_INIT or PREMISSION_DENIED if AudioFlinger service is not reachable
834e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *         BAD_VALUE if the callback is NULL
835e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
836e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t addAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback);
837e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
838e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* remove an AudioDeviceCallback.
839e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Parameters:
840e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *  callback:  The callback interface
841e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returns NO_ERROR if successful.
842e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *         INVALID_OPERATION if the callback is not installed
843e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *         BAD_VALUE if the callback is NULL
844e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
845e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t removeAudioDeviceCallback(
846e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                    const sp<AudioSystem::AudioDeviceCallback>& callback);
847e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
848e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* Obtain the pending duration in milliseconds for playback of pure PCM
849e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * (mixable without embedded timing) data remaining in AudioTrack.
850e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
851e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * This is used to estimate the drain time for the client-server buffer
852e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * so the choice of ExtendedTimestamp::LOCATION_SERVER is default.
853e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * One may optionally request to find the duration to play through the HAL
854e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * by specifying a location ExtendedTimestamp::LOCATION_KERNEL; however,
855e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * INVALID_OPERATION may be returned if the kernel location is unavailable.
856e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
857e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * Returns NO_ERROR  if successful.
858e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *         INVALID_OPERATION if ExtendedTimestamp::LOCATION_KERNEL cannot be obtained
859e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *                   or the AudioTrack does not contain pure PCM data.
860e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *         BAD_VALUE if msec is nullptr or location is invalid.
861e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
862e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t pendingDuration(int32_t *msec,
863e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                    ExtendedTimestamp::Location location = ExtendedTimestamp::LOCATION_SERVER);
864e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
865e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* hasStarted() is used to determine if audio is now audible at the device after
866e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * a start() command. The underlying implementation checks a nonzero timestamp position
867e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * or increment for the audible assumption.
868e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
869e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * hasStarted() returns true if the track has been started() and audio is audible
870e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * and no subsequent pause() or flush() has been called.  Immediately after pause() or
871e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * flush() hasStarted() will return false.
872e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
873e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * If stop() has been called, hasStarted() will return true if audio is still being
874e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * delivered or has finished delivery (even if no audio was written) for both offloaded
875e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * and normal tracks. This property removes a race condition in checking hasStarted()
876e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * for very short clips, where stop() must be called to finish drain.
877e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *
878e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * In all cases, hasStarted() may turn false briefly after a subsequent start() is called
879e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * until audio becomes audible again.
880e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
881e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            bool hasStarted(); // not const
882e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
883f370264dfa5237524a3535f5242a0c68cbbb13ebAndy Hung            bool isPlaying() {
884f370264dfa5237524a3535f5242a0c68cbbb13ebAndy Hung                AutoMutex lock(mLock);
885f370264dfa5237524a3535f5242a0c68cbbb13ebAndy Hung                return mState == STATE_ACTIVE || mState == STATE_STOPPING;
886f370264dfa5237524a3535f5242a0c68cbbb13ebAndy Hung            }
887e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprotected:
888e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* copying audio tracks is not allowed */
889e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                        AudioTrack(const AudioTrack& other);
890e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            AudioTrack& operator = (const AudioTrack& other);
891e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
892e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /* a small internal class to handle the callback */
893e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    class AudioTrackThread : public Thread
894e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    {
895e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    public:
896e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        AudioTrackThread(AudioTrack& receiver, bool bCanCallJava = false);
897e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
898e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // Do not call Thread::requestExitAndWait() without first calling requestExit().
899e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // Thread::requestExitAndWait() is not virtual, and the implementation doesn't do enough.
900e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        virtual void        requestExit();
901e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
902e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                void        pause();    // suspend thread from execution at next loop boundary
903e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                void        resume();   // allow thread to execute, if not requested to exit
904e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                void        wake();     // wake to handle changed notification conditions.
905e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
906e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    private:
907e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                void        pauseInternal(nsecs_t ns = 0LL);
908e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                        // like pause(), but only used internally within thread
909e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
910e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        friend class AudioTrack;
911e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        virtual bool        threadLoop();
912e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        AudioTrack&         mReceiver;
913e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        virtual ~AudioTrackThread();
914e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        Mutex               mMyLock;    // Thread::mLock is private
915e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        Condition           mMyCond;    // Thread::mThreadExitedCondition is private
916e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool                mPaused;    // whether thread is requested to pause at next loop entry
917e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool                mPausedInt; // whether thread internally requests pause
918e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        nsecs_t             mPausedNs;  // if mPausedInt then associated timeout, otherwise ignored
919e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool                mIgnoreNextPausedInt;   // skip any internal pause and go immediately
920e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                        // to processAudioBuffer() as state may have changed
921e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                        // since pause time calculated.
922e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    };
923e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
924e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            // body of AudioTrackThread::threadLoop()
925e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            // returns the maximum amount of time before we would like to run again, where:
926e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            //      0           immediately
927e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            //      > 0         no later than this many nanoseconds from now
928e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            //      NS_WHENEVER still active but no particular deadline
929e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            //      NS_INACTIVE inactive so don't run again until re-started
930e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            //      NS_NEVER    never again
931e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            static const nsecs_t NS_WHENEVER = -1, NS_INACTIVE = -2, NS_NEVER = -3;
932e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            nsecs_t processAudioBuffer();
933e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
934e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            // caller must hold lock on mLock for all _l methods
935e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
936fb12e20e426bc6bcff06e39fba45a931cf787040Haynes Mathew George            void updateLatency_l(); // updates mAfLatency and mLatency from AudioSystem cache
937fb12e20e426bc6bcff06e39fba45a931cf787040Haynes Mathew George
938e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t createTrack_l();
939e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
940e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            // can only be called when mState != STATE_ACTIVE
941e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            void flush_l();
942e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
943e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            void setLoop_l(uint32_t loopStart, uint32_t loopEnd, int loopCount);
944e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
945e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            // FIXME enum is faster than strcmp() for parameter 'from'
946e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            status_t restoreTrack_l(const char *from);
947e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
948e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            uint32_t    getUnderrunCount_l() const;
949e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
950e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            bool     isOffloaded() const;
951e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            bool     isDirect() const;
952e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            bool     isOffloadedOrDirect() const;
953e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
954e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            bool     isOffloaded_l() const
955e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                { return (mFlags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) != 0; }
956e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
957e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            bool     isOffloadedOrDirect_l() const
958e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                { return (mFlags & (AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|
959e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                AUDIO_OUTPUT_FLAG_DIRECT)) != 0; }
960e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
961e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            bool     isDirect_l() const
962e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                { return (mFlags & AUDIO_OUTPUT_FLAG_DIRECT) != 0; }
963e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
964e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            // pure pcm data is mixable (which excludes HW_AV_SYNC, with embedded timing)
965e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            bool     isPurePcmData_l() const
966e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                { return audio_is_linear_pcm(mFormat)
967e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                        && (mAttributes.flags & AUDIO_FLAG_HW_AV_SYNC) == 0; }
968e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
969e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            // increment mPosition by the delta of mServer, and return new value of mPosition
970e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            Modulo<uint32_t> updateAndGetPosition_l();
971e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
972e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            // check sample rate and speed is compatible with AudioTrack
973fb12e20e426bc6bcff06e39fba45a931cf787040Haynes Mathew George            bool     isSampleRateSpeedAllowed_l(uint32_t sampleRate, float speed);
974e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
975e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            void     restartIfDisabled();
976e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
977e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // Next 4 fields may be changed if IAudioTrack is re-created, but always != 0
978e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<IAudioTrack>         mAudioTrack;
979e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<IMemory>             mCblkMemory;
980e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    audio_track_cblk_t*     mCblk;                  // re-load after mLock.unlock()
981e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    audio_io_handle_t       mOutput;                // returned by AudioSystem::getOutput()
982e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
983e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<AudioTrackThread>    mAudioTrackThread;
984e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool                    mThreadCanCallJava;
985e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
986e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    float                   mVolume[2];
987e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    float                   mSendLevel;
988e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    mutable uint32_t        mSampleRate;            // mutable because getSampleRate() can update it
989e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mOriginalSampleRate;
990e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    AudioPlaybackRate       mPlaybackRate;
991e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    float                   mMaxRequiredSpeed;      // use PCM buffer size to allow this speed
992e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
993e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // Corresponds to current IAudioTrack, value is reported back by AudioFlinger to the client.
994e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // This allocated buffer size is maintained by the proxy.
995e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    size_t                  mFrameCount;            // maximum size of buffer
996e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
997e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    size_t                  mReqFrameCount;         // frame count to request the first or next time
998e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // a new IAudioTrack is needed, non-decreasing
999e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1000e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // The following AudioFlinger server-side values are cached in createAudioTrack_l().
1001e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // These values can be used for informational purposes until the track is invalidated,
1002e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // whereupon restoreTrack_l() calls createTrack_l() to update the values.
1003e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mAfLatency;             // AudioFlinger latency in ms
1004e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    size_t                  mAfFrameCount;          // AudioFlinger frame count
1005e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mAfSampleRate;          // AudioFlinger sample rate
1006e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1007e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // constant after constructor or set()
1008e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    audio_format_t          mFormat;                // as requested by client, not forced to 16-bit
1009e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    audio_stream_type_t     mStreamType;            // mStreamType == AUDIO_STREAM_DEFAULT implies
1010e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // this AudioTrack has valid attributes
1011e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mChannelCount;
1012e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    audio_channel_mask_t    mChannelMask;
1013e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<IMemory>             mSharedBuffer;
1014e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    transfer_type           mTransfer;
1015e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    audio_offload_info_t    mOffloadInfoCopy;
1016e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    const audio_offload_info_t* mOffloadInfo;
1017e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    audio_attributes_t      mAttributes;
1018e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1019e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    size_t                  mFrameSize;             // frame size in bytes
1020e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1021e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    status_t                mStatus;
1022e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1023e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // can change dynamically when IAudioTrack invalidated
1024e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mLatency;               // in ms
1025e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1026e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // Indicates the current track state.  Protected by mLock.
1027e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    enum State {
1028e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        STATE_ACTIVE,
1029e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        STATE_STOPPED,
1030e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        STATE_PAUSED,
1031e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        STATE_PAUSED_STOPPING,
1032e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        STATE_FLUSHED,
1033e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        STATE_STOPPING,
1034e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    }                       mState;
1035e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1036e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // for client callback handler
1037e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    callback_t              mCbf;                   // callback handler for events, or NULL
1038e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    void*                   mUserData;
1039e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1040e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // for notification APIs
1041e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1042e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // next 2 fields are const after constructor or set()
1043e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mNotificationFramesReq; // requested number of frames between each
1044e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // notification callback,
1045e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // at initial source sample rate
1046e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mNotificationsPerBufferReq;
1047e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // requested number of notifications per buffer,
1048e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // currently only used for fast tracks with
1049e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // default track buffer size
1050e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1051e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mNotificationFramesAct; // actual number of frames between each
1052e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // notification callback,
1053e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // at initial source sample rate
1054e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool                    mRefreshRemaining;      // processAudioBuffer() should refresh
1055e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // mRemainingFrames and mRetryOnPartialBuffer
1056e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1057e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // used for static track cbf and restoration
1058e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    int32_t                 mLoopCount;             // last setLoop loopCount; zero means disabled
1059e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mLoopStart;             // last setLoop loopStart
1060e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mLoopEnd;               // last setLoop loopEnd
1061e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    int32_t                 mLoopCountNotified;     // the last loopCount notified by callback.
1062e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // mLoopCountNotified counts down, matching
1063e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // the remaining loop count for static track
1064e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // playback.
1065e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1066e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // These are private to processAudioBuffer(), and are not protected by a lock
1067e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mRemainingFrames;       // number of frames to request in obtainBuffer()
1068e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool                    mRetryOnPartialBuffer;  // sleep and retry after partial obtainBuffer()
1069e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mObservedSequence;      // last observed value of mSequence
1070e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1071e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    Modulo<uint32_t>        mMarkerPosition;        // in wrapping (overflow) frame units
1072e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool                    mMarkerReached;
1073e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    Modulo<uint32_t>        mNewPosition;           // in frames
1074e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mUpdatePeriod;          // in frames, zero means no EVENT_NEW_POS
1075e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1076e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    Modulo<uint32_t>        mServer;                // in frames, last known mProxy->getPosition()
1077e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // which is count of frames consumed by server,
1078e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // reset by new IAudioTrack,
1079e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // whether it is reset by stop() is TBD
1080e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    Modulo<uint32_t>        mPosition;              // in frames, like mServer except continues
1081e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // monotonically after new IAudioTrack,
1082e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // and could be easily widened to uint64_t
1083e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    Modulo<uint32_t>        mReleased;              // count of frames released to server
1084e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // but not necessarily consumed by server,
1085e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // reset by stop() but continues monotonically
1086e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // after new IAudioTrack to restore mPosition,
1087e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // and could be easily widened to uint64_t
1088ffa3695a012d22c6c81cf311232c5c84c06f9219Andy Hung    int64_t                 mStartFromZeroUs;       // the start time after flush or stop,
1089ffa3695a012d22c6c81cf311232c5c84c06f9219Andy Hung                                                    // when position should be 0.
1090e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // only used for offloaded and direct tracks.
1091ffa3695a012d22c6c81cf311232c5c84c06f9219Andy Hung    int64_t                 mStartNs;               // the time when start() is called.
1092e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    ExtendedTimestamp       mStartEts;              // Extended timestamp at start for normal
1093e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // AudioTracks.
1094e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    AudioTimestamp          mStartTs;               // Timestamp at start for offloaded or direct
1095e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // AudioTracks.
1096e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1097e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool                    mPreviousTimestampValid;// true if mPreviousTimestamp is valid
1098e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool                    mTimestampStartupGlitchReported; // reduce log spam
1099e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool                    mRetrogradeMotionReported; // reduce log spam
1100e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    AudioTimestamp          mPreviousTimestamp;     // used to detect retrograde motion
1101e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    ExtendedTimestamp::Location mPreviousLocation;  // location used for previous timestamp
1102e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1103e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mUnderrunCountOffset;   // updated when restoring tracks
1104e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1105e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    int64_t                 mFramesWritten;         // total frames written. reset to zero after
1106e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // the start() following stop(). It is not
1107e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // changed after restoring the track or
1108e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // after flush.
1109e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    int64_t                 mFramesWrittenServerOffset; // An offset to server frames due to
1110e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // restoring AudioTrack, or stop/start.
1111e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // This offset is also used for static tracks.
1112e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    int64_t                 mFramesWrittenAtRestore; // Frames written at restore point (or frames
1113e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // delivered for static tracks).
1114e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // -1 indicates no previous restore point.
1115e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1116e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    audio_output_flags_t    mFlags;                 // same as mOrigFlags, except for bits that may
1117e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // be denied by client or server, such as
1118e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // AUDIO_OUTPUT_FLAG_FAST.  mLock must be
1119e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                                    // held to read or write those bits reliably.
1120e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    audio_output_flags_t    mOrigFlags;             // as specified in constructor or set(), const
1121e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1122e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool                    mDoNotReconnect;
1123e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1124e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    audio_session_t         mSessionId;
1125e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    int                     mAuxEffectId;
1126e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1127e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    mutable Mutex           mLock;
1128e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1129e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    int                     mPreviousPriority;          // before start()
1130e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    SchedPolicy             mPreviousSchedulingGroup;
1131e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool                    mAwaitBoost;    // thread should wait for priority boost before running
1132e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1133e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // The proxy should only be referenced while a lock is held because the proxy isn't
1134e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // multi-thread safe, especially the SingleStateQueue part of the proxy.
1135e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // An exception is that a blocking ClientProxy::obtainBuffer() may be called without a lock,
1136e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // provided that the caller also holds an extra reference to the proxy and shared memory to keep
1137e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // them around in case they are replaced during the obtainBuffer().
1138e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<StaticAudioTrackClientProxy> mStaticProxy;   // for type safety only
1139e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<AudioTrackClientProxy>       mProxy;         // primary owner of the memory
1140e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1141e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool                    mInUnderrun;            // whether track is currently in underrun state
1142e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mPausedPosition;
1143e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1144e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // For Device Selection API
1145e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    //  a value of AUDIO_PORT_HANDLE_NONE indicated default (AudioPolicyManager) routing.
11469ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent    audio_port_handle_t    mSelectedDeviceId; // Device requested by the application.
11479ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent    audio_port_handle_t    mRoutedDeviceId;   // Device actually selected by audio policy manager:
11489ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent                                              // May not match the app selection depending on other
11499ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent                                              // activity and connected devices.
1150e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1151e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<VolumeHandler>       mVolumeHandler;
1152e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1153e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate:
1154e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    class DeathNotifier : public IBinder::DeathRecipient {
1155e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    public:
1156e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        DeathNotifier(AudioTrack* audioTrack) : mAudioTrack(audioTrack) { }
1157e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    protected:
1158e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        virtual void        binderDied(const wp<IBinder>& who);
1159e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    private:
1160e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        const wp<AudioTrack> mAudioTrack;
1161e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    };
1162e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1163e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<DeathNotifier>       mDeathNotifier;
1164e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t                mSequence;              // incremented for each new IAudioTrack attempt
1165e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uid_t                   mClientUid;
1166e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    pid_t                   mClientPid;
1167e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1168e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<AudioSystem::AudioDeviceCallback> mDeviceCallback;
1169e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    audio_port_handle_t     mPortId;  // unique ID allocated by audio policy
1170e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman};
1171e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1172e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; // namespace android
1173e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
1174e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#endif // ANDROID_AUDIOTRACK_H
1175