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