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