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