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