AudioTrack.h revision c9b2e20f7c9a71e07ef398152709c76079decbcd
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License.
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License.
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#ifndef ANDROID_AUDIOTRACK_H
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define ANDROID_AUDIOTRACK_H
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h>
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h>
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IAudioFlinger.h>
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IAudioTrack.h>
2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/AudioSystem.h>
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/RefBase.h>
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Errors.h>
297562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/IInterface.h>
307562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/IMemory.h>
31a636433cbd09c0708b85f337ef45c0cdef3bcb4dGlenn Kasten#include <cutils/sched_policy.h>
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/threads.h>
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass audio_track_cblk_t;
39e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kastenclass AudioTrackClientProxy;
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
43b68a91a70bc8d0d18e7404e14443d4e4020b3635Glenn Kastenclass AudioTrack : virtual public RefBase
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    enum channel_index {
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        MONO   = 0,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LEFT   = 0,
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        RIGHT  = 1
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /* Events used by AudioTrack callback function (audio_track_cblk_t).
53ad2f6dbe14e601ae69f3697bc17106f9fd7d59d6Glenn Kasten     * Keep in sync with frameworks/base/media/java/android/media/AudioTrack.java NATIVE_EVENT_*.
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    enum event_type {
56083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten        EVENT_MORE_DATA = 0,        // Request to write more data to buffer.
57083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten                                    // If this event is delivered but the callback handler
58083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten                                    // does not want to write more data, the handler must explicitly
59083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten                                    // ignore the event by setting frameCount to zero.
60083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten        EVENT_UNDERRUN = 1,         // Buffer underrun occurred.
6185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten        EVENT_LOOP_END = 2,         // Sample loop end was reached; playback restarted from
6285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                                    // loop start if loop count was not 0.
6385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten        EVENT_MARKER = 3,           // Playback head is at the specified marker position
6485ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                                    // (See setMarkerPosition()).
6585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten        EVENT_NEW_POS = 4,          // Playback head is at a new position
6685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                                    // (See setPositionUpdatePeriod()).
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        EVENT_BUFFER_END = 5        // Playback head is at the end of the buffer.
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7099e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten    /* Client should declare Buffer on the stack and pass address to obtainBuffer()
7199e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     * and releaseBuffer().  See also callback_t for EVENT_MORE_DATA.
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    class Buffer
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    public:
7799e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten        size_t      frameCount;   // number of sample frames corresponding to size;
7899e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten                                  // on input it is the number of frames desired,
7999e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten                                  // on output is the number of frames actually filled
8099e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten
8199e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten        size_t      size;         // input/output in byte units
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        union {
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            void*       raw;
84362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten            short*      i16;    // signed 16-bit
85362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten            int8_t*     i8;     // unsigned 8-bit, offset by 0x80
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        };
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /* As a convenience, if a callback is supplied, a handler thread
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * is automatically created with the appropriate priority. This thread
9299e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     * invokes the callback when a new buffer becomes available or various conditions occur.
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Parameters:
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * event:   type of event notified (see enum AudioTrack::event_type).
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * user:    Pointer to context for use by the callback receiver.
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * info:    Pointer to optional parameter according to event type:
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *          - EVENT_MORE_DATA: pointer to AudioTrack::Buffer struct. The callback must not write
9999e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     *            more bytes than indicated by 'size' field and update 'size' if fewer bytes are
10099e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     *            written.
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *          - EVENT_UNDERRUN: unused.
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *          - EVENT_LOOP_END: pointer to an int indicating the number of loops remaining.
103362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     *          - EVENT_MARKER: pointer to an uint32_t containing the marker position in frames.
104362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     *          - EVENT_NEW_POS: pointer to an uint32_t containing the new position in frames.
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *          - EVENT_BUFFER_END: unused.
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
108d217a8c4632b3e3065f8c2a26b9ce4dc4c97171fGlenn Kasten    typedef void (*callback_t)(int event, void* user, void *info);
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11033005a932c60a0780fe9b7307d5988df3d9f6c26Chia-chi Yeh    /* Returns the minimum frame count required for the successful creation of
11133005a932c60a0780fe9b7307d5988df3d9f6c26Chia-chi Yeh     * an AudioTrack object.
11233005a932c60a0780fe9b7307d5988df3d9f6c26Chia-chi Yeh     * Returned status (from utils/Errors.h) can be:
11333005a932c60a0780fe9b7307d5988df3d9f6c26Chia-chi Yeh     *  - NO_ERROR: successful operation
11433005a932c60a0780fe9b7307d5988df3d9f6c26Chia-chi Yeh     *  - NO_INIT: audio server or audio hardware not initialized
11533005a932c60a0780fe9b7307d5988df3d9f6c26Chia-chi Yeh     */
11633005a932c60a0780fe9b7307d5988df3d9f6c26Chia-chi Yeh
117e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten     static status_t getMinFrameCount(size_t* frameCount,
118fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                                      audio_stream_type_t streamType = AUDIO_STREAM_DEFAULT,
11933005a932c60a0780fe9b7307d5988df3d9f6c26Chia-chi Yeh                                      uint32_t sampleRate = 0);
12033005a932c60a0780fe9b7307d5988df3d9f6c26Chia-chi Yeh
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /* Constructs an uninitialized AudioTrack. No connection with
122083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * AudioFlinger takes place.  Use set() after this.
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                        AudioTrack();
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
126ad2f6dbe14e601ae69f3697bc17106f9fd7d59d6Glenn Kasten    /* Creates an AudioTrack object and registers it with AudioFlinger.
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Once created, the track needs to be started before it can be used.
128083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * Unspecified values are set to appropriate default values.
129083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * With this constructor, the track is configured for streaming mode.
130083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * Data to be rendered is supplied by write() or by the callback EVENT_MORE_DATA.
131083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * Intermixing a combination of write() and non-ignored EVENT_MORE_DATA is deprecated.
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Parameters:
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * streamType:         Select the type of audio stream this track is attached to
136fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin     *                     (e.g. AUDIO_STREAM_MUSIC).
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * sampleRate:         Track sampling rate in Hz.
138fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin     * format:             Audio format (e.g AUDIO_FORMAT_PCM_16_BIT for signed
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *                     16 bits per sample).
14028b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten     * channelMask:        Channel mask.
141d8d6185c978c9b27ca69e7791785e0983ed9e8b8Eric Laurent     * frameCount:         Minimum size of track PCM buffer in frames. This defines the
142ad2f6dbe14e601ae69f3697bc17106f9fd7d59d6Glenn Kasten     *                     application's contribution to the
143d8d6185c978c9b27ca69e7791785e0983ed9e8b8Eric Laurent     *                     latency of the track. The actual size selected by the AudioTrack could be
144d8d6185c978c9b27ca69e7791785e0983ed9e8b8Eric Laurent     *                     larger if the requested size is not compatible with current audio HAL
145083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     *                     configuration.  Zero means to use a default value.
1460ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent     * flags:              See comments on audio_output_flags_t in <system/audio.h>.
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * cbf:                Callback function. If not null, this function is called periodically
148083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     *                     to provide new data and inform of marker, position updates, etc.
149362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * user:               Context for use by the callback receiver.
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * notificationFrames: The callback function is called each time notificationFrames PCM
151362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     *                     frames have been consumed from track input buffer.
152362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * sessionId:          Specific session ID, or zero to use default.
1534a4a0959bca78e03e3c3f486ba17829c28314d8cGlenn Kasten     * threadCanCallJava:  Whether callbacks are made from an attached thread and thus can call JNI.
1544a4a0959bca78e03e3c3f486ba17829c28314d8cGlenn Kasten     *                     If not present in parameter list, then fixed at false.
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
157fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                        AudioTrack( audio_stream_type_t streamType,
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                    uint32_t sampleRate  = 0,
159e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten                                    audio_format_t format = AUDIO_FORMAT_DEFAULT,
16028b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten                                    audio_channel_mask_t channelMask = 0,
16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                    int frameCount       = 0,
1620ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent                                    audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
163a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten                                    callback_t cbf       = NULL,
164a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten                                    void* user           = NULL,
165be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int notificationFrames = 0,
1664a4a0959bca78e03e3c3f486ba17829c28314d8cGlenn Kasten                                    int sessionId        = 0);
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
168083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten    /* Creates an audio track and registers it with AudioFlinger.
169083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * With this constructor, the track is configured for static buffer mode.
170083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * The format must not be 8-bit linear PCM.
171083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * Data to be rendered is passed in a shared memory buffer
172083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * identified by the argument sharedBuffer, which must be non-0.
173083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * The memory should be initialized to the desired data before calling start().
1744bae3649d504d590a546717a8e49f96a30d9a745Glenn Kasten     * The write() method is not supported in this case.
175362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * It is recommended to pass a callback function to be notified of playback end by an
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * EVENT_UNDERRUN event.
177083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * FIXME EVENT_MORE_DATA still occurs; it must be ignored.
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
180fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                        AudioTrack( audio_stream_type_t streamType,
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                    uint32_t sampleRate = 0,
182e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten                                    audio_format_t format = AUDIO_FORMAT_DEFAULT,
18328b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten                                    audio_channel_mask_t channelMask = 0,
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                    const sp<IMemory>& sharedBuffer = 0,
1850ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent                                    audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
186a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten                                    callback_t cbf      = NULL,
187a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten                                    void* user          = NULL,
188be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int notificationFrames = 0,
1894a4a0959bca78e03e3c3f486ba17829c28314d8cGlenn Kasten                                    int sessionId       = 0);
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /* Terminates the AudioTrack and unregisters it from AudioFlinger.
192362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * Also destroys all resources associated with the AudioTrack.
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                        ~AudioTrack();
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /* Initialize an uninitialized AudioTrack.
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Returned status (from utils/Errors.h) can be:
198362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     *  - NO_ERROR: successful initialization
199362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     *  - INVALID_OPERATION: AudioTrack is already initialized
20028b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten     *  - BAD_VALUE: invalid parameter (channelMask, format, sampleRate...)
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *  - NO_INIT: audio server or audio hardware not initialized
202083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * If sharedBuffer is non-0, the frameCount parameter is ignored and
203083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * replaced by the shared buffer's total allocated size in frame units.
204ad2f6dbe14e601ae69f3697bc17106f9fd7d59d6Glenn Kasten     */
205fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            status_t    set(audio_stream_type_t streamType = AUDIO_STREAM_DEFAULT,
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                            uint32_t sampleRate = 0,
207e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten                            audio_format_t format = AUDIO_FORMAT_DEFAULT,
20828b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten                            audio_channel_mask_t channelMask = 0,
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                            int frameCount      = 0,
2100ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent                            audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
211a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten                            callback_t cbf      = NULL,
212a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten                            void* user          = NULL,
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                            int notificationFrames = 0,
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                            const sp<IMemory>& sharedBuffer = 0,
215be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                            bool threadCanCallJava = false,
216ea7939a079b3600cab955760839b021326f8cfc3Glenn Kasten                            int sessionId       = 0);
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /* Result of constructing the AudioTrack. This must be checked
219362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * before using any AudioTrack API (except for set()), because using
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * an uninitialized AudioTrack produces undefined results.
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * See set() method above for possible return codes.
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
22301437b7cdaecf53acb46b50ff8b5d86b9d36eb20Glenn Kasten            status_t    initCheck() const   { return mStatus; }
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
225362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten    /* Returns this track's estimated latency in milliseconds.
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * This includes the latency due to AudioTrack buffer size, AudioMixer (if any)
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * and audio hardware driver.
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
229c9b2e20f7c9a71e07ef398152709c76079decbcdGlenn Kasten            uint32_t    latency() const     { return mLatency; }
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23199e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten    /* getters, see constructors and set() */
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23301437b7cdaecf53acb46b50ff8b5d86b9d36eb20Glenn Kasten            audio_stream_type_t streamType() const { return mStreamType; }
23401437b7cdaecf53acb46b50ff8b5d86b9d36eb20Glenn Kasten            audio_format_t format() const   { return mFormat; }
235b9980659501d0428d65d8292f3c32da69d37fbd2Glenn Kasten
236083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten    /* Return frame size in bytes, which for linear PCM is channelCount * (bit depth per channel / 8).
237b9980659501d0428d65d8292f3c32da69d37fbd2Glenn Kasten     * channelCount is determined from channelMask, and bit depth comes from format.
238083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * For non-linear formats, the frame size is typically 1 byte.
239b9980659501d0428d65d8292f3c32da69d37fbd2Glenn Kasten     */
24001437b7cdaecf53acb46b50ff8b5d86b9d36eb20Glenn Kasten            uint32_t    channelCount() const { return mChannelCount; }
241b9980659501d0428d65d8292f3c32da69d37fbd2Glenn Kasten
24201437b7cdaecf53acb46b50ff8b5d86b9d36eb20Glenn Kasten            uint32_t    frameCount() const  { return mFrameCount; }
24301437b7cdaecf53acb46b50ff8b5d86b9d36eb20Glenn Kasten            size_t      frameSize() const   { return mFrameSize; }
24401437b7cdaecf53acb46b50ff8b5d86b9d36eb20Glenn Kasten
245083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten    /* Return the static buffer specified in constructor or set(), or 0 for streaming mode */
24601437b7cdaecf53acb46b50ff8b5d86b9d36eb20Glenn Kasten            sp<IMemory> sharedBuffer() const { return mSharedBuffer; }
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /* After it's created the track is not active. Call start() to
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * make it active. If set, the callback will start being called.
250083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * If the track was previously paused, volume is ramped up over the first mix buffer.
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            void        start();
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
254083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten    /* Stop a track.
255083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * In static buffer mode, the track is stopped immediately.
256083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * In streaming mode, the callback will cease being called and
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * obtainBuffer returns STOPPED. Note that obtainBuffer() still works
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * and will fill up buffers until the pool is exhausted.
259083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * The stop does not occur immediately: any data remaining in the buffer
260083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * is first drained, mixed, and output, and only then is the track marked as stopped.
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            void        stop();
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            bool        stopped() const;
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2654bae3649d504d590a546717a8e49f96a30d9a745Glenn Kasten    /* Flush a stopped or paused track. All previously buffered data is discarded immediately.
2664bae3649d504d590a546717a8e49f96a30d9a745Glenn Kasten     * This has the effect of draining the buffers without mixing or output.
2674bae3649d504d590a546717a8e49f96a30d9a745Glenn Kasten     * Flush is intended for streaming mode, for example before switching to non-contiguous content.
2684bae3649d504d590a546717a8e49f96a30d9a745Glenn Kasten     * This function is a no-op if the track is not stopped or paused, or uses a static buffer.
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            void        flush();
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
272083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten    /* Pause a track. After pause, the callback will cease being called and
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * obtainBuffer returns STOPPED. Note that obtainBuffer() still works
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * and will fill up buffers until the pool is exhausted.
275083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * Volume is ramped down over the next mix buffer following the pause request,
276083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * and then the track is marked as paused.  It can be resumed with ramp up by start().
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            void        pause();
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
280362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten    /* Set volume for this track, mostly used for games' sound effects
281362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * left and right volumes. Levels must be >= 0.0 and <= 1.0.
282b1c0993b215c5c3eebd1c6bafc22bba23d57a70bGlenn Kasten     * This is the older API.  New applications should use setVolume(float) when possible.
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
284be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t    setVolume(float left, float right);
285b1c0993b215c5c3eebd1c6bafc22bba23d57a70bGlenn Kasten
286b1c0993b215c5c3eebd1c6bafc22bba23d57a70bGlenn Kasten    /* Set volume for all channels.  This is the preferred API for new applications,
287b1c0993b215c5c3eebd1c6bafc22bba23d57a70bGlenn Kasten     * especially for multi-channel content.
288b1c0993b215c5c3eebd1c6bafc22bba23d57a70bGlenn Kasten     */
289b1c0993b215c5c3eebd1c6bafc22bba23d57a70bGlenn Kasten            status_t    setVolume(float volume);
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
291362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten    /* Set the send level for this track. An auxiliary effect should be attached
292362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * to the track with attachEffect(). Level must be >= 0.0 and <= 1.0.
293be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     */
2942beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent            status_t    setAuxEffectSendLevel(float level);
295a5224f319e2ba4b51ddb4287705ccf8d4b8ecc51Glenn Kasten            void        getAuxEffectSendLevel(float* level) const;
296be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
297ad2f6dbe14e601ae69f3697bc17106f9fd7d59d6Glenn Kasten    /* Set sample rate for this track in Hz, mostly used for games' sound effects
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
2993b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten            status_t    setSampleRate(uint32_t sampleRate);
3003b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten
3013b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten    /* Return current sample rate in Hz, or 0 if unknown */
302a5224f319e2ba4b51ddb4287705ccf8d4b8ecc51Glenn Kasten            uint32_t    getSampleRate() const;
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /* Enables looping and sets the start and end points of looping.
305083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * Only supported for static buffer mode.
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Parameters:
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * loopStart:   loop start expressed as the number of PCM frames played since AudioTrack start.
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * loopEnd:     loop end expressed as the number of PCM frames played since AudioTrack start.
311362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * loopCount:   number of loops to execute. Calling setLoop() with loopCount == 0 cancels any
312362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     *              pending or active loop. loopCount = -1 means infinite looping.
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * For proper operation the following condition must be respected:
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *          (loopEnd-loopStart) <= framecount()
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t    setLoop(uint32_t loopStart, uint32_t loopEnd, int loopCount);
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
319362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten    /* Sets marker position. When playback reaches the number of frames specified, a callback with
320362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * event type EVENT_MARKER is called. Calling setMarkerPosition with marker == 0 cancels marker
321083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * notification callback.  To set a marker at a position which would compute as 0,
322083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * a workaround is to the set the marker at a nearby position such as -1 or 1.
32385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten     * If the AudioTrack has been opened with no callback function associated, the operation will
32485ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten     * fail.
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Parameters:
32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
328083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * marker:   marker position expressed in wrapping (overflow) frame units,
329083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     *           like the return value of getPosition().
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Returned status (from utils/Errors.h) can be:
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *  - NO_ERROR: successful operation
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *  - INVALID_OPERATION: the AudioTrack has no callback installed.
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t    setMarkerPosition(uint32_t marker);
336a5224f319e2ba4b51ddb4287705ccf8d4b8ecc51Glenn Kasten            status_t    getMarkerPosition(uint32_t *marker) const;
33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
338362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten    /* Sets position update period. Every time the number of frames specified has been played,
339362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * a callback with event type EVENT_NEW_POS is called.
340362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * Calling setPositionUpdatePeriod with updatePeriod == 0 cancels new position notification
341362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * callback.
34285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten     * If the AudioTrack has been opened with no callback function associated, the operation will
34385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten     * fail.
344083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * Extremely small values may be rounded up to a value the implementation can support.
34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Parameters:
34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * updatePeriod:  position update notification period expressed in frames.
34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
35089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Returned status (from utils/Errors.h) can be:
35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *  - NO_ERROR: successful operation
35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *  - INVALID_OPERATION: the AudioTrack has no callback installed.
35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t    setPositionUpdatePeriod(uint32_t updatePeriod);
355a5224f319e2ba4b51ddb4287705ccf8d4b8ecc51Glenn Kasten            status_t    getPositionUpdatePeriod(uint32_t *updatePeriod) const;
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /* Sets playback head position within AudioTrack buffer. The new position is specified
358362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * in number of frames.
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * This method must be called with the AudioTrack in paused or stopped state.
360362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * Note that the actual position set is <position> modulo the AudioTrack buffer size in frames.
361362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * Therefore using this method makes sense only when playing a "static" audio buffer
36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * as opposed to streaming.
36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * The getPosition() method on the other hand returns the total number of frames played since
36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * playback start.
36589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Parameters:
36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * position:  New playback head position within AudioTrack buffer.
36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Returned status (from utils/Errors.h) can be:
37189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *  - NO_ERROR: successful operation
372083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     *  - INVALID_OPERATION: the AudioTrack is not stopped or paused, or is streaming mode.
37385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten     *  - BAD_VALUE: The specified position is beyond the number of frames present in AudioTrack
37485ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten     *               buffer
37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
37689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t    setPosition(uint32_t position);
377083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten
378083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten    /* Return the total number of frames played since playback start.
379083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * The counter will wrap (overflow) periodically, e.g. every ~27 hours at 44.1 kHz.
380083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * It is reset to zero by flush(), reload(), and stop().
381083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     */
38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t    getPosition(uint32_t *position);
38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
384362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten    /* Forces AudioTrack buffer full condition. When playing a static buffer, this method avoids
38589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * rewriting the buffer before restarting playback after a stop.
38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * This method must be called with the AudioTrack in paused or stopped state.
387083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * Not allowed in streaming mode.
38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Returned status (from utils/Errors.h) can be:
39089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *  - NO_ERROR: successful operation
391083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     *  - INVALID_OPERATION: the AudioTrack is not stopped or paused, or is streaming mode.
39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t    reload();
39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
395362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten    /* Returns a handle on the audio output used by this AudioTrack.
396c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent     *
397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent     * Parameters:
398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent     *  none.
399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent     *
400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent     * Returned value:
401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent     *  handle on audio hardware output
402c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent     */
403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            audio_io_handle_t    getOutput();
404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
405362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten    /* Returns the unique session ID associated with this track.
406be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     *
407be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     * Parameters:
408be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     *  none.
409be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     *
410be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     * Returned value:
411362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     *  AudioTrack session ID.
412be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     */
41301437b7cdaecf53acb46b50ff8b5d86b9d36eb20Glenn Kasten            int    getSessionId() const { return mSessionId; }
414be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
415362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten    /* Attach track auxiliary output to specified effect. Use effectId = 0
416be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     * to detach track from effect.
417be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     *
418be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     * Parameters:
419be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     *
420be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     * effectId:  effectId obtained from AudioEffect::id().
421be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     *
422be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     * Returned status (from utils/Errors.h) can be:
423be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     *  - NO_ERROR: successful operation
424be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     *  - INVALID_OPERATION: the effect is not an auxiliary effect.
425be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     *  - BAD_VALUE: The specified effect ID is invalid
426be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     */
427be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t    attachAuxEffect(int effectId);
428be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
429362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten    /* Obtains a buffer of "frameCount" frames. The buffer must be
43099e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     * filled entirely, and then released with releaseBuffer().
43199e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     * If the track is stopped, obtainBuffer() returns
432362c4e697d8e9c034e964ac7b40227e054491547Glenn Kasten     * STOPPED instead of NO_ERROR as long as there are buffers available,
43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * at which point NO_MORE_BUFFERS is returned.
434ad2f6dbe14e601ae69f3697bc17106f9fd7d59d6Glenn Kasten     * Buffers will be returned until the pool
43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * is exhausted, at which point obtainBuffer() will either block
43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * or return WOULD_BLOCK depending on the value of the "blocking"
43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * parameter.
43899e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     *
439083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * obtainBuffer() and releaseBuffer() are deprecated for direct use by applications,
440083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * which should use write() or callback EVENT_MORE_DATA instead.
441083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     *
44299e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     * Interpretation of waitCount:
44399e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     *  +n  limits wait time to n * WAIT_PERIOD_MS,
44499e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     *  -1  causes an (almost) infinite wait time,
44599e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     *   0  non-blocking.
44605d499958e4030938ed77a924ebdd9899f36752eGlenn Kasten     *
44705d499958e4030938ed77a924ebdd9899f36752eGlenn Kasten     * Buffer fields
44805d499958e4030938ed77a924ebdd9899f36752eGlenn Kasten     * On entry:
44905d499958e4030938ed77a924ebdd9899f36752eGlenn Kasten     *  frameCount  number of frames requested
45005d499958e4030938ed77a924ebdd9899f36752eGlenn Kasten     * After error return:
45105d499958e4030938ed77a924ebdd9899f36752eGlenn Kasten     *  frameCount  0
45205d499958e4030938ed77a924ebdd9899f36752eGlenn Kasten     *  size        0
45322eb4e239fbe9103568147d566d7482e480350b8Glenn Kasten     *  raw         undefined
45405d499958e4030938ed77a924ebdd9899f36752eGlenn Kasten     * After successful return:
45505d499958e4030938ed77a924ebdd9899f36752eGlenn Kasten     *  frameCount  actual number of frames available, <= number requested
45605d499958e4030938ed77a924ebdd9899f36752eGlenn Kasten     *  size        actual number of bytes available
45705d499958e4030938ed77a924ebdd9899f36752eGlenn Kasten     *  raw         pointer to the buffer
45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
45989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        enum {
461335787fe43596f38ea2fa50b24c54d0823a3fb1dGlenn Kasten            NO_MORE_BUFFERS = 0x80000001,   // same name in AudioFlinger.h, ok to be different value
46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            STOPPED = 1
46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        };
46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t    obtainBuffer(Buffer* audioBuffer, int32_t waitCount);
46699e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten
46799e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten    /* Release a filled buffer of "frameCount" frames for AudioFlinger to process. */
46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            void        releaseBuffer(Buffer* audioBuffer);
46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /* As a convenience we provide a write() interface to the audio buffer.
47199e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     * This is implemented on top of obtainBuffer/releaseBuffer. For best
47299e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     * performance use callbacks. Returns actual number of bytes written >= 0,
47399e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     * or one of the following negative status codes:
47499e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     *      INVALID_OPERATION   AudioTrack is configured for shared buffer mode
47599e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     *      BAD_VALUE           size is invalid
47699e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     *      STOPPED             AudioTrack was stopped during the write
47799e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     *      NO_MORE_BUFFERS     when obtainBuffer() returns same
47899e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten     *      or any other error code returned by IAudioTrack::start() or restoreTrack_l().
479083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten     * Not supported for static buffer mode.
48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ssize_t     write(const void* buffer, size_t size);
48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /*
48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Dumps the state of an audio track.
48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
48689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t dump(int fd, const Vector<String16>& args) const;
48789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4884ff14bae91075eb274eb1c2975982358946e7e63John Grossmanprotected:
48989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /* copying audio tracks is not allowed */
49089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                        AudioTrack(const AudioTrack& other);
49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            AudioTrack& operator = (const AudioTrack& other);
49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
49389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /* a small internal class to handle the callback */
49489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    class AudioTrackThread : public Thread
49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
49689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    public:
49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        AudioTrackThread(AudioTrack& receiver, bool bCanCallJava = false);
4983acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten
4993acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten        // Do not call Thread::requestExitAndWait() without first calling requestExit().
5003acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten        // Thread::requestExitAndWait() is not virtual, and the implementation doesn't do enough.
5013acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten        virtual void        requestExit();
5023acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten
5033acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten                void        pause();    // suspend thread from execution at next loop boundary
5043acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten                void        resume();   // allow thread to execute, if not requested to exit
5053acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten
50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    private:
50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        friend class AudioTrack;
50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual bool        threadLoop();
50989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        AudioTrack& mReceiver;
510a997e7a7c5aa2fc7e95316218316f8b7b98786baGlenn Kasten        ~AudioTrackThread();
5113acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten        Mutex               mMyLock;    // Thread::mLock is private
5123acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten        Condition           mMyCond;    // Thread::mThreadExitedCondition is private
5133acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten        bool                mPaused;    // whether thread is currently paused
51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
51589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
51699e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten            // body of AudioTrackThread::threadLoop()
51789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            bool processAudioBuffer(const sp<AudioTrackThread>& thread);
518ea7939a079b3600cab955760839b021326f8cfc3Glenn Kasten
519d5ed6e88a9bea1879e41d7defaf1edea7c09f554Glenn Kasten            // caller must hold lock on mLock for all _l methods
520fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            status_t createTrack_l(audio_stream_type_t streamType,
52134f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent                                 uint32_t sampleRate,
522e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten                                 audio_format_t format,
523e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten                                 size_t frameCount,
5240ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent                                 audio_output_flags_t flags,
52534f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent                                 const sp<IMemory>& sharedBuffer,
526291f4d505aff81969e6666049d3cc3446f836af2Glenn Kasten                                 audio_io_handle_t output);
5274bae3649d504d590a546717a8e49f96a30d9a745Glenn Kasten
5284bae3649d504d590a546717a8e49f96a30d9a745Glenn Kasten            // can only be called when !mActive
5291703cdfee717b1b312bf8979816a9e2f16a82e5dEric Laurent            void flush_l();
5304bae3649d504d590a546717a8e49f96a30d9a745Glenn Kasten
5311703cdfee717b1b312bf8979816a9e2f16a82e5dEric Laurent            status_t setLoop_l(uint32_t loopStart, uint32_t loopEnd, int loopCount);
5321703cdfee717b1b312bf8979816a9e2f16a82e5dEric Laurent            audio_io_handle_t getOutput_l();
5331703cdfee717b1b312bf8979816a9e2f16a82e5dEric Laurent            status_t restoreTrack_l(audio_track_cblk_t*& cblk, bool fromStart);
5349a2aaf927e56a4b4acab23ef16b3f133a9f48a63Glenn Kasten            bool stopped_l() const { return !mActive; }
53589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
53689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IAudioTrack>         mAudioTrack;
53789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IMemory>             mCblkMemory;
53889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<AudioTrackThread>    mAudioTrackThread;
53989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
54089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    float                   mVolume[2];
541be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    float                   mSendLevel;
542e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten    uint32_t                mSampleRate;
543b603744e96b07b1d5bf745bde593fb2c025cefcfGlenn Kasten    size_t                  mFrameCount;            // corresponds to current IAudioTrack
544b603744e96b07b1d5bf745bde593fb2c025cefcfGlenn Kasten    size_t                  mReqFrameCount;         // frame count to request the next time a new
545b603744e96b07b1d5bf745bde593fb2c025cefcfGlenn Kasten                                                    // IAudioTrack is needed
54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
547a47f3165f53c8e8fb8907a94de7417e2c3047eebGlenn Kasten    audio_track_cblk_t*     mCblk;                  // re-load after mLock.unlock()
54822eb4e239fbe9103568147d566d7482e480350b8Glenn Kasten
54922eb4e239fbe9103568147d566d7482e480350b8Glenn Kasten            // Starting address of buffers in shared memory.  If there is a shared buffer, mBuffers
55022eb4e239fbe9103568147d566d7482e480350b8Glenn Kasten            // is the value of pointer() for the shared buffer, otherwise mBuffers points
55122eb4e239fbe9103568147d566d7482e480350b8Glenn Kasten            // immediately after the control block.  This address is for the mapping within client
55222eb4e239fbe9103568147d566d7482e480350b8Glenn Kasten            // address space.  AudioFlinger::TrackBase::mBuffer is for the server address space.
55322eb4e239fbe9103568147d566d7482e480350b8Glenn Kasten    void*                   mBuffers;
55422eb4e239fbe9103568147d566d7482e480350b8Glenn Kasten
55560a839204713e0f8258d082af83262b1eb33a6c3Glenn Kasten    audio_format_t          mFormat;                // as requested by client, not forced to 16-bit
556fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    audio_stream_type_t     mStreamType;
557e4756fe3a387615acb63c6a05788c8db9b5786cbGlenn Kasten    uint32_t                mChannelCount;
55828b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten    audio_channel_mask_t    mChannelMask;
55983a0382dc17364567667a4e6135db43f5bd92efcGlenn Kasten
56083a0382dc17364567667a4e6135db43f5bd92efcGlenn Kasten                // mFrameSize is equal to mFrameSizeAF for non-PCM or 16-bit PCM data.
56183a0382dc17364567667a4e6135db43f5bd92efcGlenn Kasten                // For 8-bit PCM data, mFrameSizeAF is
56283a0382dc17364567667a4e6135db43f5bd92efcGlenn Kasten                // twice as large because data is expanded to 16-bit before being stored in buffer.
56383a0382dc17364567667a4e6135db43f5bd92efcGlenn Kasten    size_t                  mFrameSize;             // app-level frame size
56483a0382dc17364567667a4e6135db43f5bd92efcGlenn Kasten    size_t                  mFrameSizeAF;           // AudioFlinger frame size
56583a0382dc17364567667a4e6135db43f5bd92efcGlenn Kasten
56689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t                mStatus;
56789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t                mLatency;
56889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5699a2aaf927e56a4b4acab23ef16b3f133a9f48a63Glenn Kasten    bool                    mActive;                // protected by mLock
57089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
57199e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten    callback_t              mCbf;                   // callback handler for events, or NULL
572ad2f6dbe14e601ae69f3697bc17106f9fd7d59d6Glenn Kasten    void*                   mUserData;              // for client callback handler
573ad2f6dbe14e601ae69f3697bc17106f9fd7d59d6Glenn Kasten
574ad2f6dbe14e601ae69f3697bc17106f9fd7d59d6Glenn Kasten    // for notification APIs
57585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten    uint32_t                mNotificationFramesReq; // requested number of frames between each
57685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                                                    // notification callback
57785ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten    uint32_t                mNotificationFramesAct; // actual number of frames between each
57885ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                                                    // notification callback
57989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IMemory>             mSharedBuffer;
58089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int                     mLoopCount;
58189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t                mRemainingFrames;
582083d1c1492d496960d5b28f4664ff02101736677Glenn Kasten    uint32_t                mMarkerPosition;        // in wrapping (overflow) frame units
5832c22aeb65e801f663a754d043062f85e49f77739Jean-Michel Trivi    bool                    mMarkerReached;
584ad2f6dbe14e601ae69f3697bc17106f9fd7d59d6Glenn Kasten    uint32_t                mNewPosition;           // in frames
585ad2f6dbe14e601ae69f3697bc17106f9fd7d59d6Glenn Kasten    uint32_t                mUpdatePeriod;          // in frames
586ad2f6dbe14e601ae69f3697bc17106f9fd7d59d6Glenn Kasten
587cd07594333cbe8b2c86c6609cce01a74d6cc33f8Jean-Michel Trivi    bool                    mFlushed; // FIXME will be made obsolete by making flush() synchronous
5880ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent    audio_output_flags_t    mFlags;
589be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    int                     mSessionId;
5902beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    int                     mAuxEffectId;
591d5ed6e88a9bea1879e41d7defaf1edea7c09f554Glenn Kasten
592d5ed6e88a9bea1879e41d7defaf1edea7c09f554Glenn Kasten    // When locking both mLock and mCblk->lock, must lock in this order to avoid deadlock:
593d5ed6e88a9bea1879e41d7defaf1edea7c09f554Glenn Kasten    //      1. mLock
594d5ed6e88a9bea1879e41d7defaf1edea7c09f554Glenn Kasten    //      2. mCblk->lock
595d5ed6e88a9bea1879e41d7defaf1edea7c09f554Glenn Kasten    // It is OK to lock only mCblk->lock.
5969a2aaf927e56a4b4acab23ef16b3f133a9f48a63Glenn Kasten    mutable Mutex           mLock;
597d5ed6e88a9bea1879e41d7defaf1edea7c09f554Glenn Kasten
5984ff14bae91075eb274eb1c2975982358946e7e63John Grossman    bool                    mIsTimed;
599879135196fd1c97deefc538c888037c56c2879a7Glenn Kasten    int                     mPreviousPriority;          // before start()
600a636433cbd09c0708b85f337ef45c0cdef3bcb4dGlenn Kasten    SchedPolicy             mPreviousSchedulingGroup;
601e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten    AudioTrackClientProxy*  mProxy;
60289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
60389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6044ff14bae91075eb274eb1c2975982358946e7e63John Grossmanclass TimedAudioTrack : public AudioTrack
6054ff14bae91075eb274eb1c2975982358946e7e63John Grossman{
6064ff14bae91075eb274eb1c2975982358946e7e63John Grossmanpublic:
6074ff14bae91075eb274eb1c2975982358946e7e63John Grossman    TimedAudioTrack();
6084ff14bae91075eb274eb1c2975982358946e7e63John Grossman
6094ff14bae91075eb274eb1c2975982358946e7e63John Grossman    /* allocate a shared memory buffer that can be passed to queueTimedBuffer */
6104ff14bae91075eb274eb1c2975982358946e7e63John Grossman    status_t allocateTimedBuffer(size_t size, sp<IMemory>* buffer);
6114ff14bae91075eb274eb1c2975982358946e7e63John Grossman
6124ff14bae91075eb274eb1c2975982358946e7e63John Grossman    /* queue a buffer obtained via allocateTimedBuffer for playback at the
613c3ae93f21280859086ae371428ffd32f39e76d50Glenn Kasten       given timestamp.  PTS units are microseconds on the media time timeline.
6144ff14bae91075eb274eb1c2975982358946e7e63John Grossman       The media time transform (set with setMediaTimeTransform) set by the
6154ff14bae91075eb274eb1c2975982358946e7e63John Grossman       audio producer will handle converting from media time to local time
6164ff14bae91075eb274eb1c2975982358946e7e63John Grossman       (perhaps going through the common time timeline in the case of
6174ff14bae91075eb274eb1c2975982358946e7e63John Grossman       synchronized multiroom audio case) */
6184ff14bae91075eb274eb1c2975982358946e7e63John Grossman    status_t queueTimedBuffer(const sp<IMemory>& buffer, int64_t pts);
6194ff14bae91075eb274eb1c2975982358946e7e63John Grossman
6204ff14bae91075eb274eb1c2975982358946e7e63John Grossman    /* define a transform between media time and either common time or
6214ff14bae91075eb274eb1c2975982358946e7e63John Grossman       local time */
6224ff14bae91075eb274eb1c2975982358946e7e63John Grossman    enum TargetTimeline {LOCAL_TIME, COMMON_TIME};
6234ff14bae91075eb274eb1c2975982358946e7e63John Grossman    status_t setMediaTimeTransform(const LinearTransform& xform,
6244ff14bae91075eb274eb1c2975982358946e7e63John Grossman                                   TargetTimeline target);
6254ff14bae91075eb274eb1c2975982358946e7e63John Grossman};
62689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
62789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
62889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
62989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif // ANDROID_AUDIOTRACK_H
630