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