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