AudioTrack.h revision fff6d715a8db0daf08a50634f242c40268de3d49
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_AUDIOTRACK_H
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_AUDIOTRACK_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioFlinger.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioTrack.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/AudioSystem.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2780a60ba85b5c2ed40e8685a16ce6d3ed31ef0929Joe Onorato#include <utils/RefBase.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <binder/IInterface.h>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <binder/IMemory.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h>
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
36a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick
3718e939623556928f73fcc7511c85a537929a4a7eDan Egnorclass audio_track_cblk_t;
3818e939623556928f73fcc7511c85a537929a4a7eDan Egnor
3918e939623556928f73fcc7511c85a537929a4a7eDan Egnor// ----------------------------------------------------------------------------
4018e939623556928f73fcc7511c85a537929a4a7eDan Egnor
41a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrickclass AudioTrack : virtual public RefBase
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum channel_index {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MONO   = 0,
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LEFT   = 0,
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        RIGHT  = 1
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50a833cbbed087bf6869905a43166757a6436ad34fDave Bort    /* Events used by AudioTrack callback function (audio_track_cblk_t).
51a833cbbed087bf6869905a43166757a6436ad34fDave Bort     */
52a833cbbed087bf6869905a43166757a6436ad34fDave Bort    enum event_type {
53a833cbbed087bf6869905a43166757a6436ad34fDave Bort        EVENT_MORE_DATA = 0,        // Request to write more data to PCM buffer.
54a833cbbed087bf6869905a43166757a6436ad34fDave Bort        EVENT_UNDERRUN = 1,         // PCM buffer underrun occured.
55a833cbbed087bf6869905a43166757a6436ad34fDave Bort        EVENT_LOOP_END = 2,         // Sample loop end was reached; playback restarted from loop start if loop count was not 0.
56a833cbbed087bf6869905a43166757a6436ad34fDave Bort        EVENT_MARKER = 3,           // Playback head is at the specified marker position (See setMarkerPosition()).
57a833cbbed087bf6869905a43166757a6436ad34fDave Bort        EVENT_NEW_POS = 4,          // Playback head is at a new position (See setPositionUpdatePeriod()).
58a833cbbed087bf6869905a43166757a6436ad34fDave Bort        EVENT_BUFFER_END = 5        // Playback head is at the end of the buffer.
59a833cbbed087bf6869905a43166757a6436ad34fDave Bort    };
60a833cbbed087bf6869905a43166757a6436ad34fDave Bort
61a833cbbed087bf6869905a43166757a6436ad34fDave Bort    /* Create Buffer on the stack and pass it to obtainBuffer()
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and releaseBuffer().
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
64c1e8aa4c448807fc3ee9d21e8b67bb886fa065aaMike Lockwood
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Buffer
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enum {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            MUTE    = 0x00000001
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t    flags;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        audio_format_t format; // but AUDIO_FORMAT_PCM_8_BIT -> AUDIO_FORMAT_PCM_16_BIT
7375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        // accessed directly by WebKit ANP callback
74dace230043314d6fab1c5ced4b031eaccd814c25Dianne Hackborn        int         channelCount; // will be removed in the future, do not use
75603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana        size_t      frameCount;
76603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana        size_t      size;
77603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana        union {
78603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana            void*       raw;
79b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn            short*      i16;    // signed 16-bit
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int8_t*     i8;     // unsigned 8-bit, offset by 0x80
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
83b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* As a convenience, if a callback is supplied, a handler thread
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is automatically created with the appropriate priority. This thread
878d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert     * invokes the callback when a new buffer becomes available or an underrun condition occurs.
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Parameters:
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
90f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn     * event:   type of event notified (see enum AudioTrack::event_type).
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * user:    Pointer to context for use by the callback receiver.
9227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel     * info:    Pointer to optional parameter according to event type:
938cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn     *          - EVENT_MORE_DATA: pointer to AudioTrack::Buffer struct. The callback must not write
948cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn     *          more bytes than indicated by 'size' field and update 'size' if less bytes are
9587bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn     *          written.
964528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate     *          - EVENT_UNDERRUN: unused.
974528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate     *          - EVENT_LOOP_END: pointer to an int indicating the number of loops remaining.
984528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate     *          - EVENT_MARKER: pointer to an uint32_t containing the marker position in frames.
99bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly     *          - EVENT_NEW_POS: pointer to an uint32_t containing the new position in frames.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *          - EVENT_BUFFER_END: unused.
10116fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly     */
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1033f41673265dcaaef058703311c5481e8a51fd8beJiafa Liu    typedef void (*callback_t)(int event, void* user, void *info);
1049f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackborn
105b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn    /* Returns the minimum frame count required for the successful creation of
1061ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * an AudioTrack object.
1071ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * Returned status (from utils/Errors.h) can be:
1089f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackborn     *  - NO_ERROR: successful operation
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  - NO_INIT: audio server or audio hardware not initialized
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
111b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     static status_t getMinFrameCount(int* frameCount,
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      audio_stream_type_t streamType = AUDIO_STREAM_DEFAULT,
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      uint32_t sampleRate = 0);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1168946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu    /* Constructs an uninitialized AudioTrack. No connection with
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * AudioFlinger takes place.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
119c4308f01c965571dc2354107c3574df113e397eeMike Lockwood                        AudioTrack();
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1214d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat    /* Creates an audio track and registers it with AudioFlinger.
122eb9cbb8fdddf4c887004b20b504083035d57a15fMike Lockwood     * Once created, the track needs to be started before it can be used.
123f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly     * Unspecified values are set to the audio hardware's current
124f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly     * values.
125f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly     *
126f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly     * Parameters:
127367f41f8f61126c2ab34a34cc676756a9fc23ac2Nick Pelly     *
128f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly     * streamType:         Select the type of audio stream this track is attached to
129f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly     *                     (e.g. AUDIO_STREAM_MUSIC).
130f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly     * sampleRate:         Track sampling rate in Hz.
131eb9cbb8fdddf4c887004b20b504083035d57a15fMike Lockwood     * format:             Audio format (e.g AUDIO_FORMAT_PCM_16_BIT for signed
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     16 bits per sample).
133873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat     * channelMask:        Channel mask: see audio_channels_t.
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * frameCount:         Total size of track PCM buffer in frames. This defines the
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     latency of the track.
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * flags:              Reserved for future use.
1378ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * cbf:                Callback function. If not null, this function is called periodically
1383a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood     *                     to request new PCM data.
1394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn     * user:               Context for use by the callback receiver.
1404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn     * notificationFrames: The callback function is called each time notificationFrames PCM
1418cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn     *                     frames have been consumed from track input buffer.
14275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * sessionId:          Specific session ID, or zero to use default.
14375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        AudioTrack( audio_stream_type_t streamType,
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    uint32_t sampleRate  = 0,
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    audio_format_t format = AUDIO_FORMAT_DEFAULT,
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int channelMask      = 0,
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int frameCount       = 0,
150361ec7711aa689aa70c5473348f4a1bc91bc1c06Alex Gruenstein                                    uint32_t flags       = 0,
151361ec7711aa689aa70c5473348f4a1bc91bc1c06Alex Gruenstein                                    callback_t cbf       = 0,
152f85aa5a4d4e6f1ef7e07638568e27d709b8085c6Charles Chen                                    void* user           = 0,
153f85aa5a4d4e6f1ef7e07638568e27d709b8085c6Charles Chen                                    int notificationFrames = 0,
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int sessionId = 0);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
156c028be4f3b8c7476b46859f66c3f33d528adf181Suchi Amalapurapu    /* Creates an audio track and registers it with AudioFlinger. With this constructor,
157c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * the PCM data to be rendered by AudioTrack is passed in a shared memory buffer
158c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * identified by the argument sharedBuffer. This prototype is for static buffer playback.
159487529a70cd1479ae8d6bbfb356be7e72542c185Christopher Tate     * PCM data must be present in memory before the AudioTrack is started.
160f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor     * The write() and flush() methods are not supported in this case.
161c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * It is recommended to pass a callback function to be notified of playback end by an
1620cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato     * EVENT_UNDERRUN event.
1630cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato     */
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        AudioTrack( audio_stream_type_t streamType,
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    uint32_t sampleRate = 0,
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    audio_format_t format = AUDIO_FORMAT_DEFAULT,
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int channelMask     = 0,
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const sp<IMemory>& sharedBuffer = 0,
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    uint32_t flags      = 0,
171499cb9f516062b654952d282f211bee44c31a3c2Winson Chung                                    callback_t cbf      = 0,
17281f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung                                    void* user          = 0,
173a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                                    int notificationFrames = 0,
174a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                                    int sessionId = 0);
175a55c321329ae52a2db7a4f2bd36673a20b8f271dMike Lockwood
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Terminates the AudioTrack and unregisters it from AudioFlinger.
17715e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood     * Also destroys all resources associated with the AudioTrack.
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ~AudioTrack();
180c1e8aa4c448807fc3ee9d21e8b67bb886fa065aaMike Lockwood
18122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Initialize an uninitialized AudioTrack.
183d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * Returned status (from utils/Errors.h) can be:
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  - NO_ERROR: successful initialization
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  - INVALID_OPERATION: AudioTrack is already initialized
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  - BAD_VALUE: invalid parameter (channels, format, sampleRate...)
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  - NO_INIT: audio server or audio hardware not initialized
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * */
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    set(audio_stream_type_t streamType = AUDIO_STREAM_DEFAULT,
19004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                            uint32_t sampleRate = 0,
19104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                            audio_format_t format = AUDIO_FORMAT_DEFAULT,
1927640caaf912a7eefacc3e2108c5afd70f7b072a4noda                            int channelMask     = 0,
193e91bc680b731a5d97f066b2e6c9c99b3c7dd5c58John Wang                            int frameCount      = 0,
1949207b1e7c8ad4bbef3530d2b047bf6587f2988c4Raphael                            uint32_t flags      = 0,
19555567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan                            callback_t cbf      = 0,
1962d94231ef91c732f649ff7af9520ee9eac441b16Chung-yih Wang                            void* user          = 0,
1972d94231ef91c732f649ff7af9520ee9eac441b16Chung-yih Wang                            int notificationFrames = 0,
1982d94231ef91c732f649ff7af9520ee9eac441b16Chung-yih Wang                            const sp<IMemory>& sharedBuffer = 0,
1992d94231ef91c732f649ff7af9520ee9eac441b16Chung-yih Wang                            bool threadCanCallJava = false,
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int sessionId = 0);
20145e6dbf90b24543c90f8c6b0426e9b70c934838dDoug Zongker
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Result of constructing the AudioTrack. This must be checked
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * before using any AudioTrack API (except for set()), because using
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * an uninitialized AudioTrack produces undefined results.
20680a60ba85b5c2ed40e8685a16ce6d3ed31ef0929Joe Onorato     * See set() method above for possible return codes.
20780a60ba85b5c2ed40e8685a16ce6d3ed31ef0929Joe Onorato     */
20880a60ba85b5c2ed40e8685a16ce6d3ed31ef0929Joe Onorato            status_t    initCheck() const;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Returns this track's estimated latency in milliseconds.
211570bb5618a015c105e44eb1447dae5e0a34f3849Brian Carlstrom     * This includes the latency due to AudioTrack buffer size, AudioMixer (if any)
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and audio hardware driver.
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t     latency() const;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
216ac075190b9a6f10c2f24c3e3d1de035aa0329fa4Guang Zhu    /* getters, see constructor */
217ac075190b9a6f10c2f24c3e3d1de035aa0329fa4Guang Zhu
218ac075190b9a6f10c2f24c3e3d1de035aa0329fa4Guang Zhu            audio_stream_type_t streamType() const;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            audio_format_t format() const;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int         channelCount() const;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t    frameCount() const;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int         frameSize() const;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IMemory>& sharedBuffer();
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* After it's created the track is not active. Call start() to
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * make it active. If set, the callback will start being called.
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void        start();
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Stop a track. If set, the callback will cease being called and
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * obtainBuffer returns STOPPED. Note that obtainBuffer() still works
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and will fill up buffers until the pool is exhausted.
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void        stop();
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool        stopped() const;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Flush a stopped track. All pending buffers are discarded.
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This function has no effect if the track is not stopped.
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void        flush();
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
243603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana    /* Pause a track. If set, the callback will cease being called and
244603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana     * obtainBuffer returns STOPPED. Note that obtainBuffer() still works
245603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana     * and will fill up buffers until the pool is exhausted.
246603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana     */
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void        pause();
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249459ba8639a8d1a9b0fb7ff4ada68bf1fe262eaaaNick Pelly    /* Mute or unmute this track.
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * While muted, the callback, if set, is still called.
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2521ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            void        mute(bool);
253c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana            bool        muted() const;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Set volume for this track, mostly used for games' sound effects
256c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * left and right volumes. Levels must be >= 0.0 and <= 1.0.
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
258f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly            status_t    setVolume(float left, float right);
259f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly            void        getVolume(float* left, float* right);
260f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Set the send level for this track. An auxiliary effect should be attached
262f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor     * to the track with attachEffect(). Level must be >= 0.0 and <= 1.0.
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
264aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pelly            status_t    setAuxEffectSendLevel(float level);
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void        getAuxEffectSendLevel(float* level);
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Set sample rate for this track, mostly used for games' sound effects
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    setSampleRate(int sampleRate);
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t    getSampleRate();
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Enables looping and sets the start and end points of looping.
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Parameters:
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * loopStart:   loop start expressed as the number of PCM frames played since AudioTrack start.
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * loopEnd:     loop end expressed as the number of PCM frames played since AudioTrack start.
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * loopCount:   number of loops to execute. Calling setLoop() with loopCount == 0 cancels any
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              pending or active loop. loopCount = -1 means infinite looping.
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For proper operation the following condition must be respected:
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *          (loopEnd-loopStart) <= framecount()
283d8b51a2ba8ee82be81414c0e80158e82b2c361d9Raphael     */
28455567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan            status_t    setLoop(uint32_t loopStart, uint32_t loopEnd, int loopCount);
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    getLoop(uint32_t *loopStart, uint32_t *loopEnd, int *loopCount);
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Sets marker position. When playback reaches the number of frames specified, a callback with
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * event type EVENT_MARKER is called. Calling setMarkerPosition with marker == 0 cancels marker
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * notification callback.
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the AudioTrack has been opened with no callback function associated, the operation will fail.
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Parameters:
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * marker:   marker position expressed in frames.
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returned status (from utils/Errors.h) can be:
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  - NO_ERROR: successful operation
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  - INVALID_OPERATION: the AudioTrack has no callback installed.
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    setMarkerPosition(uint32_t marker);
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    getMarkerPosition(uint32_t *marker);
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
304e70f61b1160e953e5e4d18d30a463fa9ba821779Brett Chabot    /* Sets position update period. Every time the number of frames specified has been played,
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a callback with event type EVENT_NEW_POS is called.
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calling setPositionUpdatePeriod with updatePeriod == 0 cancels new position notification
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * callback.
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the AudioTrack has been opened with no callback function associated, the operation will fail.
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Parameters:
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * updatePeriod:  position update notification period expressed in frames.
313a833cbbed087bf6869905a43166757a6436ad34fDave Bort     *
314a833cbbed087bf6869905a43166757a6436ad34fDave Bort     * Returned status (from utils/Errors.h) can be:
315a833cbbed087bf6869905a43166757a6436ad34fDave Bort     *  - NO_ERROR: successful operation
316a833cbbed087bf6869905a43166757a6436ad34fDave Bort     *  - INVALID_OPERATION: the AudioTrack has no callback installed.
317a833cbbed087bf6869905a43166757a6436ad34fDave Bort     */
318cf9a01377483ad3a29496b64b5863d81e583dee9Brian Carlstrom            status_t    setPositionUpdatePeriod(uint32_t updatePeriod);
319cf9a01377483ad3a29496b64b5863d81e583dee9Brian Carlstrom            status_t    getPositionUpdatePeriod(uint32_t *updatePeriod);
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Sets playback head position within AudioTrack buffer. The new position is specified
322e599a9d24b416d693ce60c97339f18c927aef5dbDirk Balfanz     * in number of frames.
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method must be called with the AudioTrack in paused or stopped state.
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that the actual position set is <position> modulo the AudioTrack buffer size in frames.
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Therefore using this method makes sense only when playing a "static" audio buffer
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as opposed to streaming.
327a9602db3d5a6c9bc5a7a31b4fe3cc141235ad332Brian Carlstrom     * The getPosition() method on the other hand returns the total number of frames played since
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * playback start.
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Parameters:
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * position:  New playback head position within AudioTrack buffer.
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returned status (from utils/Errors.h) can be:
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  - NO_ERROR: successful operation
336a9602db3d5a6c9bc5a7a31b4fe3cc141235ad332Brian Carlstrom     *  - INVALID_OPERATION: the AudioTrack is not stopped.
337a9602db3d5a6c9bc5a7a31b4fe3cc141235ad332Brian Carlstrom     *  - BAD_VALUE: The specified position is beyond the number of frames present in AudioTrack buffer
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
339626db9101e8b4b22faac389763bd2653586a281bJoe Onorato            status_t    setPosition(uint32_t position);
340626db9101e8b4b22faac389763bd2653586a281bJoe Onorato            status_t    getPosition(uint32_t *position);
341626db9101e8b4b22faac389763bd2653586a281bJoe Onorato
342626db9101e8b4b22faac389763bd2653586a281bJoe Onorato    /* Forces AudioTrack buffer full condition. When playing a static buffer, this method avoids
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * rewriting the buffer before restarting playback after a stop.
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method must be called with the AudioTrack in paused or stopped state.
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returned status (from utils/Errors.h) can be:
34780a60ba85b5c2ed40e8685a16ce6d3ed31ef0929Joe Onorato     *  - NO_ERROR: successful operation
34880a60ba85b5c2ed40e8685a16ce6d3ed31ef0929Joe Onorato     *  - INVALID_OPERATION: the AudioTrack is not stopped.
34980a60ba85b5c2ed40e8685a16ce6d3ed31ef0929Joe Onorato     */
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    reload();
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
352570bb5618a015c105e44eb1447dae5e0a34f3849Brian Carlstrom    /* Returns a handle on the audio output used by this AudioTrack.
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Parameters:
3556f95f461098d5b9e93212cf9cc7c7a6498eecf3aYing Wang     *  none.
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returned value:
3583fec2bf9bfcc6a43c6284f5ab1127f10f3d0a173Joe Onorato     *  handle on audio hardware output
3596dceb76b3e02cd2e0f08105f54d942e6ad8c4456Scott Main     */
3606dceb76b3e02cd2e0f08105f54d942e6ad8c4456Scott Main            audio_io_handle_t    getOutput();
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
362d20e5d0a2938872c1e47b430017c9337cda5abf2Joe Onorato    /* Returns the unique session ID associated with this track.
3636dceb76b3e02cd2e0f08105f54d942e6ad8c4456Scott Main     *
3646dceb76b3e02cd2e0f08105f54d942e6ad8c4456Scott Main     * Parameters:
3656dceb76b3e02cd2e0f08105f54d942e6ad8c4456Scott Main     *  none.
366b385508d89747e4c383979f1cc6fa2814b1cedbdScott Main     *
367ee58d1bf9c54eaed623c4419e1d9db269a9c4137Dirk Dougherty     * Returned value:
368bca9f1bbb31cf05ba17af049a5ea37f57981f00eDirk Dougherty     *  AudioTrack session ID.
369f0cdfa9955725c99cd4df6b933e4cb732847ebd1Scott Main     */
370c4c696ab5b97c0a33983a28ae6e5bd211c88e72cScott Main            int    getSessionId();
371e9ac4e256d7efe2f719500f23fe0e0f89331be27Scott Main
372ba3dd32357b47ab0b55a1976bbafc225df78a59dScott Main    /* Attach track auxiliary output to specified effect. Use effectId = 0
37362e9701099062093af01d7b5d9bdf7f1fe683a31Scott Main     * to detach track from effect.
374d3b62c961b90f45b801121ab11b0af9625c91707Scott Main     *
3750ba4ac747c9e14bdbd9ffb417ac125eb2790a87fJoe Onorato     * Parameters:
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * effectId:  effectId obtained from AudioEffect::id().
378d20e5d0a2938872c1e47b430017c9337cda5abf2Joe Onorato     *
379d20e5d0a2938872c1e47b430017c9337cda5abf2Joe Onorato     * Returned status (from utils/Errors.h) can be:
380d20e5d0a2938872c1e47b430017c9337cda5abf2Joe Onorato     *  - NO_ERROR: successful operation
381d20e5d0a2938872c1e47b430017c9337cda5abf2Joe Onorato     *  - INVALID_OPERATION: the effect is not an auxiliary effect.
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  - BAD_VALUE: The specified effect ID is invalid
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    attachAuxEffect(int effectId);
385d323b4c338106ccedf6dd974e201947eeb2b2d73Dirk Dougherty
386d323b4c338106ccedf6dd974e201947eeb2b2d73Dirk Dougherty    /* Obtains a buffer of "frameCount" frames. The buffer must be
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * filled entirely. If the track is stopped, obtainBuffer() returns
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * STOPPED instead of NO_ERROR as long as there are buffers available,
389e66593b47c5cc083b629130bf9a4a41545e8850bTrevor Johns     * at which point NO_MORE_BUFFERS is returned.
390e66593b47c5cc083b629130bf9a4a41545e8850bTrevor Johns     * Buffers will be returned until the pool (buffercount())
39147ccfcb015c06f12eb91ccbb1113c15a368960d8Dirk Dougherty     * is exhausted, at which point obtainBuffer() will either block
39247ccfcb015c06f12eb91ccbb1113c15a368960d8Dirk Dougherty     * or return WOULD_BLOCK depending on the value of the "blocking"
3933f9b6445cb9c384a428364a1cca85ca3c172fbe6Robert Ly     * parameter.
3943f9b6445cb9c384a428364a1cca85ca3c172fbe6Robert Ly     */
395e779bdc9b4366a9293b87424b42cff45d46336a6Christopher Tate
396e779bdc9b4366a9293b87424b42cff45d46336a6Christopher Tate        enum {
39722558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty            NO_MORE_BUFFERS = 0x80000001,
39822558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty            STOPPED = 1
3992187e240c0875c724de30407dfa1e32abd2c6bb1Trevor Johns        };
4002187e240c0875c724de30407dfa1e32abd2c6bb1Trevor Johns
40122558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty            status_t    obtainBuffer(Buffer* audioBuffer, int32_t waitCount);
40222558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty            void        releaseBuffer(Buffer* audioBuffer);
4033f9b6445cb9c384a428364a1cca85ca3c172fbe6Robert Ly
4043f9b6445cb9c384a428364a1cca85ca3c172fbe6Robert Ly    /* As a convenience we provide a write() interface to the audio buffer.
405b385508d89747e4c383979f1cc6fa2814b1cedbdScott Main     * This is implemented on top of lockBuffer/unlockBuffer. For best
40622558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty     * performance use callbacks. Return actual number of bytes written.
407a35f65692d9f97264dc939d5749db86845141810Roman Nurik     *
408a35f65692d9f97264dc939d5749db86845141810Roman Nurik     */
409b385508d89747e4c383979f1cc6fa2814b1cedbdScott Main            ssize_t     write(const void* buffer, size_t size);
41022558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
41222558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty     * Dumps the state of an audio track.
41322558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty     */
41422558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty            status_t dump(int fd, const Vector<String16>& args) const;
4153f9b6445cb9c384a428364a1cca85ca3c172fbe6Robert Ly
4163f9b6445cb9c384a428364a1cca85ca3c172fbe6Robert Lyprivate:
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* copying audio tracks is not allowed */
41822558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty                        AudioTrack(const AudioTrack& other);
419fef42db92568918161a2a9d69411290adfa1720fDianne Hackborn            AudioTrack& operator = (const AudioTrack& other);
420fef42db92568918161a2a9d69411290adfa1720fDianne Hackborn
42144b362c34066764b6711ce04923ce71b5d011283Robert Ly    /* a small internal class to handle the callback */
42244b362c34066764b6711ce04923ce71b5d011283Robert Ly    class AudioTrackThread : public Thread
423689d16be5e091545371ef5f5ff4ed25649520bc3Scott Main    {
424bf1d0b900e7540c55fb3b88e70aa16e2c59ad218Scott Main    public:
425a11c9e15064872ad7f56571148a5c61281bfa018Alexander Lucas        AudioTrackThread(AudioTrack& receiver, bool bCanCallJava = false);
426a11c9e15064872ad7f56571148a5c61281bfa018Alexander Lucas    private:
427b385508d89747e4c383979f1cc6fa2814b1cedbdScott Main        friend class AudioTrack;
42822558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty        virtual bool        threadLoop();
429b385508d89747e4c383979f1cc6fa2814b1cedbdScott Main        virtual status_t    readyToRun();
43022558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty        virtual void        onFirstRef();
431e52c4a782364fb93e952964bde1953828f31d8b2Joe Malin        AudioTrack& mReceiver;
432e52c4a782364fb93e952964bde1953828f31d8b2Joe Malin        Mutex       mLock;
433e52c4a782364fb93e952964bde1953828f31d8b2Joe Malin    };
434e52c4a782364fb93e952964bde1953828f31d8b2Joe Malin
435fca67c5525bf26ac9eadb03476fb846c167387f4Adam Cohen            bool processAudioBuffer(const sp<AudioTrackThread>& thread);
436d873e660c57eabb15a95acf71398c38929504284Scott Main            status_t createTrack_l(audio_stream_type_t streamType,
437b32c2402c2b9d58b4f74be62dac6ce2781caec05Dirk Dougherty                                 uint32_t sampleRate,
438b32c2402c2b9d58b4f74be62dac6ce2781caec05Dirk Dougherty                                 audio_format_t format,
439b32c2402c2b9d58b4f74be62dac6ce2781caec05Dirk Dougherty                                 uint32_t channelMask,
440b32c2402c2b9d58b4f74be62dac6ce2781caec05Dirk Dougherty                                 int frameCount,
44106d2fa705ba5a11f712187229238b0d41b446a52Winson Chung                                 uint32_t flags,
442d873e660c57eabb15a95acf71398c38929504284Scott Main                                 const sp<IMemory>& sharedBuffer,
44322558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty                                 audio_io_handle_t output,
44422558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty                                 bool enforceFrameCount);
44522558d0be8210aee1a2ab64b374bb357d4123acdDirk Dougherty            void flush_l();
4469c57aca188665916cc1dafbbe23dbe8cfd98883dMike LeBeau            status_t setLoop_l(uint32_t loopStart, uint32_t loopEnd, int loopCount);
4479c57aca188665916cc1dafbbe23dbe8cfd98883dMike LeBeau            audio_io_handle_t getOutput_l();
4483eb9b66deb18888d7f52ed901abf342506aa3db7Gilles Debunne            status_t restoreTrack_l(audio_track_cblk_t*& cblk, bool fromStart);
4493eb9b66deb18888d7f52ed901abf342506aa3db7Gilles Debunne            bool stopped_l() const { return !mActive; }
4503eb9b66deb18888d7f52ed901abf342506aa3db7Gilles Debunne
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<IAudioTrack>         mAudioTrack;
452f11d7d559a6cd866bbffaead39da9f6a84919eccDirk Dougherty    sp<IMemory>             mCblkMemory;
453f11d7d559a6cd866bbffaead39da9f6a84919eccDirk Dougherty    sp<AudioTrackThread>    mAudioTrackThread;
45407226c29f36dddb1fec36e58b45f1e09a69361feScott Main
455f11d7d559a6cd866bbffaead39da9f6a84919eccDirk Dougherty    float                   mVolume[2];
45662e9701099062093af01d7b5d9bdf7f1fe683a31Scott Main    float                   mSendLevel;
4572e2c9104b78c4e817db992cb121742ae2e52ba26Dirk Dougherty    uint32_t                mFrameCount;
4582e2c9104b78c4e817db992cb121742ae2e52ba26Dirk Dougherty
4592e2c9104b78c4e817db992cb121742ae2e52ba26Dirk Dougherty    audio_track_cblk_t*     mCblk;
460b402f11a6dfb78a4666dc173cdad10ad578f71c9Scott Main    audio_format_t          mFormat;
46162e9701099062093af01d7b5d9bdf7f1fe683a31Scott Main    audio_stream_type_t     mStreamType;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t                 mChannelCount;
463ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    uint8_t                 mMuted;
464ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    uint8_t                 mReserved;
465ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    uint32_t                mChannelMask;
466ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    status_t                mStatus;
467ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    uint32_t                mLatency;
468ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato
469ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    bool                    mActive;                // protected by mLock
470ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato
471ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    callback_t              mCbf;
472ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    void*                   mUserData;
473d20e5d0a2938872c1e47b430017c9337cda5abf2Joe Onorato    uint32_t                mNotificationFramesReq; // requested number of frames between each notification callback
474ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    uint32_t                mNotificationFramesAct; // actual number of frames between each notification callback
475ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    sp<IMemory>             mSharedBuffer;
476ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    int                     mLoopCount;
477ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    uint32_t                mRemainingFrames;
478ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    uint32_t                mMarkerPosition;
479ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    bool                    mMarkerReached;
480ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    uint32_t                mNewPosition;
481ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    uint32_t                mUpdatePeriod;
482ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    bool                    mFlushed; // FIXME will be made obsolete by making flush() synchronous
483ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    uint32_t                mFlags;
484ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    int                     mSessionId;
4857e3cf12e75cdbfd6299d5fe7cc87daaae40606e1Joe Onorato    int                     mAuxEffectId;
4867e3cf12e75cdbfd6299d5fe7cc87daaae40606e1Joe Onorato    mutable Mutex           mLock;
487ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    status_t                mRestoreStatus;
488ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato    int                     mPreviousPriority;          // before start()
4896806457f95214039fd1e2a3f6f00b628f7336fe3Ying Wang    int                     mPreviousSchedulingGroup;
4906806457f95214039fd1e2a3f6f00b628f7336fe3Ying Wang};
491ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato
492ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato
493ccfca2ee9ebe6d3de861f6f001bd4810c863cab1Joe Onorato}; // namespace android
4944314e2e674d0273d308e909261540793b9109ac9Joe Onorato
4954314e2e674d0273d308e909261540793b9109ac9Joe Onorato#endif // ANDROID_AUDIOTRACK_H
4964314e2e674d0273d308e909261540793b9109ac9Joe Onorato