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_AUDIO_TRACK_SHARED_H 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_AUDIO_TRACK_SHARED_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 <utils/threads.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define THREAD_PRIORITY_AUDIO_CLIENT (ANDROID_PRIORITY_AUDIO) 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Maximum cumulated timeout milliseconds before restarting audioflinger thread 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define MAX_STARTUP_TIMEOUT_MS 3000 // Longer timeout period at startup to cope with A2DP init time 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define MAX_RUN_TIMEOUT_MS 1000 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define WAIT_PERIOD_MS 10 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent#define CBLK_UNDERRUN_MSK 0x0001 36eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent#define CBLK_UNDERRUN_ON 0x0001 // underrun (out) or overrrun (in) indication 37eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent#define CBLK_UNDERRUN_OFF 0x0000 // no underrun 38eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent#define CBLK_DIRECTION_MSK 0x0002 39eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent#define CBLK_DIRECTION_OUT 0x0002 // this cblk is for an AudioTrack 40eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent#define CBLK_DIRECTION_IN 0x0000 // this cblk is for an AudioRecord 41eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent#define CBLK_FORCEREADY_MSK 0x0004 42eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent#define CBLK_FORCEREADY_ON 0x0004 // track is considered ready immediately by AudioFlinger 43eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent#define CBLK_FORCEREADY_OFF 0x0000 // track is ready when buffer full 44eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent#define CBLK_INVALID_MSK 0x0008 454712baab81d0b683bc22668d2278c9daff92797eEric Laurent#define CBLK_INVALID_ON 0x0008 // track buffer is invalidated by AudioFlinger: 464712baab81d0b683bc22668d2278c9daff92797eEric Laurent#define CBLK_INVALID_OFF 0x0000 // must be re-created 474712baab81d0b683bc22668d2278c9daff92797eEric Laurent#define CBLK_DISABLED_MSK 0x0010 484712baab81d0b683bc22668d2278c9daff92797eEric Laurent#define CBLK_DISABLED_ON 0x0010 // track disabled by AudioFlinger due to underrun: 494712baab81d0b683bc22668d2278c9daff92797eEric Laurent#define CBLK_DISABLED_OFF 0x0000 // must be re-started 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct audio_track_cblk_t 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The data members are grouped so that members accessed frequently and in the same context 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // are in the same line of data cache. 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex lock; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Condition cv; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project volatile uint32_t user; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project volatile uint32_t server; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t userBase; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t serverBase; 62eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent void* buffers; 63eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent uint32_t frameCount; 64eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent // Cache line boundary 65eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent uint32_t loopStart; 66eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent uint32_t loopEnd; 67eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent int loopCount; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project volatile union { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t volume[2]; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t volumeLR; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 7288e209dcf8c2ebddda5c272f46d1bd5478bc639cEric Laurent uint32_t sampleRate; 73a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // NOTE: audio_track_cblk_t::frameSize is not equal to AudioTrack::frameSize() for 74a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // 8 bit PCM data: in this case, mCblk->frameSize is based on a sample size of 75a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // 16 bit because data is converted to 16 bit before being stored in buffer 76eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent 77eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent uint8_t frameSize; 78b0a0147f344a2d26d86be2b1bdf5bfde50ef86c2Eric Laurent uint8_t channelCount; 79eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent uint16_t flags; 80eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t bufferTimeoutMs; // Maximum cumulated timeout before restarting audioflinger 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t waitTimeMs; // Cumulated wait time 83a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 8465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent uint16_t sendLevel; 8565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent uint16_t reserved; 86eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent // Cache line boundary (32 bytes) 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_track_cblk_t(); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t stepUser(uint32_t frameCount); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool stepServer(uint32_t frameCount); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* buffer(uint32_t offset) const; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t framesAvailable(); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t framesAvailable_l(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t framesReady(); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_AUDIO_TRACK_SHARED_H 102