AudioFlinger.h revision 0986e7907ffc8387b04fb201e285784bcd11b9b7
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* //device/include/server/AudioFlinger/AudioFlinger.h 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_AUDIO_FLINGER_H 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_AUDIO_FLINGER_H 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 238ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent#include <limits.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioFlinger.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioFlingerClient.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioTrack.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioRecord.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/AudioTrack.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Atomic.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h> 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 340795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/MemoryDealer.h> 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/SortedVector.h> 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Vector.h> 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <hardware_legacy/AudioHardwareInterface.h> 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AudioBufferProvider.h" 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass audio_track_cblk_t; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioMixer; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioBuffer; 47a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentclass AudioResampler; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const nsecs_t kStandbyTimeInNsecs = seconds(3); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 60a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentclass AudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void instantiate(); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t dump(int fd, const Vector<String16>& args); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IAudioFlinger interface 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IAudioTrack> createTrack( 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid, 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int streamType, 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags, 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer, 77ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int output, 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 80ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual uint32_t sampleRate(int output) const; 81ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int channelCount(int output) const; 82ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int format(int output) const; 83ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual size_t frameCount(int output) const; 84ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual uint32_t latency(int output) const; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterVolume(float value); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterMute(bool muted); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float masterVolume() const; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool masterMute() const; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 92ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t setStreamVolume(int stream, float value, int output); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamMute(int stream, bool muted); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 95ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual float streamVolume(int stream, int output) const; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool streamMute(int stream) const; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMode(int mode); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMicMute(bool state); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool getMicMute() const; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10323f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent virtual bool isStreamActive(int stream) const; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 105ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t setParameters(int ioHandle, const String8& keyValuePairs); 106ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual String8 getParameters(int ioHandle, const String8& keys); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void registerClient(const sp<IAudioFlingerClient>& client); 109a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount); 111a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 112ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int openOutput(uint32_t *pDevices, 113a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pSamplingRate, 114a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pFormat, 115a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pChannels, 116a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pLatencyMs, 117a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t flags); 118a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 119ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int openDuplicateOutput(int output1, int output2); 120a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 121ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t closeOutput(int output); 122a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 123ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t suspendOutput(int output); 124a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 125ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t restoreOutput(int output); 126a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 127ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int openInput(uint32_t *pDevices, 128a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pSamplingRate, 129a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pFormat, 130a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pChannels, 131a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t acoustics); 132a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 133ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t closeInput(int input); 134a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 135ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t setStreamOutput(uint32_t stream, int output); 136a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 137415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent virtual status_t setVoiceVolume(float volume); 138415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent 1390986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output); 1400986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IBinder::DeathRecipient 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void binderDied(const wp<IBinder>& who); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum hardware_call_state { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_IDLE = 0, 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_INIT, 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_OUTPUT_OPEN, 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_OUTPUT_CLOSE, 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_INPUT_OPEN, 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_INPUT_CLOSE, 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_STANDBY, 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_MASTER_VOLUME, 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_GET_ROUTING, 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_ROUTING, 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_GET_MODE, 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_MODE, 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_GET_MIC_MUTE, 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_MIC_MUTE, 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_SET_VOICE_VOLUME, 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_SET_PARAMETER, 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // record interface 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IAudioRecord> openRecord( 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid, 166ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int input, 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags, 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Parcel& data, 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* reply, 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioFlinger(); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~AudioFlinger(); 183a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Internal dump utilites. 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpPermissionDenial(int fd, const Vector<String16>& args); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpClients(int fd, const Vector<String16>& args); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpInternals(int fd, const Vector<String16>& args); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // --- Client --- 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Client : public RefBase { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Client(const sp<AudioFlinger>& audioFlinger, pid_t pid); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~Client(); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<MemoryDealer>& heap() const; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid() const { return mPid; } 197b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent sp<AudioFlinger> audioFlinger() { return mAudioFlinger; } 198b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Client(const Client&); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Client& operator = (const Client&); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AudioFlinger> mAudioFlinger; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MemoryDealer> mMemoryDealer; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t mPid; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class TrackHandle; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class RecordHandle; 210a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordThread; 211a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class PlaybackThread; 212a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class MixerThread; 213a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class DirectOutputThread; 2148ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent class DuplicatingThread; 215a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class Track; 216a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordTrack; 217a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 218a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class ThreadBase : public Thread { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 22049f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent ThreadBase (const sp<AudioFlinger>& audioFlinger, int id); 221a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual ~ThreadBase(); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2233fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent status_t dumpBase(int fd, const Vector<String16>& args); 2243fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // base for record and playback 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class TrackBase : public AudioBufferProvider, public RefBase { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum track_state { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IDLE, 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TERMINATED, 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STOPPED, 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RESUMING, 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ACTIVE, 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PAUSING, 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PAUSED 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum track_flags { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STEPSERVER_FAILED = 0x01, // StepServer could not acquire cblk->lock mutex 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SYSTEM_FLAGS_MASK = 0x0000ffffUL, 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The upper 16 bits are used for track-specific flags. 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 245a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent TrackBase(const wp<ThreadBase>& thread, 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<Client>& client, 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags, 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~TrackBase(); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start() = 0; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop() = 0; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> getCblk() const; 2586c30a71122a6ef2189304c136f13a87727804b0aEric Laurent audio_track_cblk_t* cblk() const { return mCblk; } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected: 261a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class ThreadBase; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class RecordHandle; 2632c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class PlaybackThread; 2642c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class RecordThread; 2652c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class MixerThread; 2662c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class DirectOutputThread; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TrackBase(const TrackBase&); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TrackBase& operator = (const TrackBase&); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format() const { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFormat; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount() const ; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sampleRate() const; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* getBuffer(uint32_t offset, uint32_t frames) const; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isStopped() const { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == STOPPED; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isTerminated() const { 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == TERMINATED; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool step(); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void reset(); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 295a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent wp<ThreadBase> mThread; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Client> mClient; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> mCblkMemory; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_track_cblk_t* mCblk; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* mBuffer; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* mBufferEnd; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mFrameCount; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we don't really need a lock for these 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mState; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mClientTid; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t mFormat; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mFlags; 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class ConfigEvent { 310a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 311a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ConfigEvent() : mEvent(0), mParam(0) {} 312a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 313a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mEvent; 314a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mParam; 315a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 316a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 317a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t sampleRate() const; 318a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int channelCount() const; 319a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int format() const; 320a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t frameCount() const; 321a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void wakeUp() { mWaitWorkCV.broadcast(); } 322a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void exit(); 323a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool checkForNewParameters_l() = 0; 324a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t setParameters(const String8& keyValuePairs); 325a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual String8 getParameters(const String8& keys) = 0; 326a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void audioConfigChanged(int event, int param = 0) = 0; 327a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void sendConfigEvent(int event, int param = 0); 3288fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent void sendConfigEvent_l(int event, int param = 0); 329a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void processConfigEvents(); 33049f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent int id() const { return mId;} 3318ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent bool standby() { return mStandby; } 332a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 3332c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent mutable Mutex mLock; 3342c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent 335a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent protected: 336a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 337a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class Track; 338a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class TrackBase; 339a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class PlaybackThread; 340a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class MixerThread; 341a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DirectOutputThread; 342a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DuplicatingThread; 343a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class RecordThread; 344a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class RecordTrack; 345a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 346a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Condition mWaitWorkCV; 347a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<AudioFlinger> mAudioFlinger; 348a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t mSampleRate; 349a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t mFrameCount; 350a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mChannelCount; 351a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mFormat; 352a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t mFrameSize; 353a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Condition mParamCond; 3548fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent Vector<String8> mNewParameters; 355a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t mParamStatus; 356a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Vector<ConfigEvent *> mConfigEvents; 357a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mStandby; 35849f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent int mId; 35949f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent bool mExiting; 360a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 361a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 362a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // --- PlaybackThread --- 363a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class PlaybackThread : public ThreadBase { 364a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 365a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 366a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent enum type { 367a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent MIXER, 368a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent DIRECT, 369a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent DUPLICATING 370a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 371a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 372059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent enum mixer_state { 373059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent MIXER_IDLE, 374059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent MIXER_TRACKS_ENABLED, 375059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent MIXER_TRACKS_READY 376059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent }; 377059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // playback track 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Track : public TrackBase { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 381a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Track( const wp<ThreadBase>& thread, 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<Client>& client, 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int streamType, 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~Track(); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dump(char* buffer, size_t size); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void pause(); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void flush(); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void destroy(); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void mute(bool); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setVolume(float left, float right); 400a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int name() const { 401a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return mName; 402a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4044bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent int type() const { 4054bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent return mStreamType; 4064bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent } 4074bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent 4084bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected: 410a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class ThreadBase; 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioFlinger; 4122c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class TrackHandle; 4132c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class PlaybackThread; 4142c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class MixerThread; 4152c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class DirectOutputThread; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Track(const Track&); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Track& operator = (const Track&); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 421a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool isMuted() { return mMute; } 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isPausing() const { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == PAUSING; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isPaused() const { 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == PAUSED; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isReady() const; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setPaused() { mState = PAUSED; } 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void reset(); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43249f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent bool isOutputTrack() const { 43349f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent return (mStreamType == AudioSystem::NUM_STREAM_TYPES); 43449f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent } 43549f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we don't really need a lock for these 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mVolume[2]; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project volatile bool mMute; 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FILLED state is used for suppressing volume ramp at begin of playing 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum {FS_FILLING, FS_FILLED, FS_ACTIVE}; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable uint8_t mFillingUpStatus; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int8_t mRetryCount; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> mSharedBuffer; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mResetDone; 4454bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent int mStreamType; 446a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mName; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; // end of Track 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // playback track 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class OutputTrack : public Track { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 453a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Buffer: public AudioBufferProvider::Buffer { 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int16_t *mBuffer; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 458a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 459a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputTrack( const wp<ThreadBase>& thread, 4608ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent DuplicatingThread *sourceThread, 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~OutputTrack(); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 469a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool write(int16_t* data, uint32_t frames); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; } 471a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool isActive() { return mActive; } 472a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent wp<ThreadBase>& thread() { return mThread; } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 476a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearBufferQueue(); 478a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 479a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Maximum number of pending buffers allocated by OutputTrack::write() 4808ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent static const uint8_t kMaxOverFlowBuffers = 10; 481a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector < Buffer* > mBufferQueue; 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioBufferProvider::Buffer mOutBuffer; 484a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mActive; 4858ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent DuplicatingThread* mSourceThread; 486a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; // end of OutputTrack 487a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 48849f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id); 489a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual ~PlaybackThread(); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t dump(int fd, const Vector<String16>& args); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Thread virtuals 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t readyToRun(); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void onFirstRef(); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual uint32_t latency() const; 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterVolume(float value); 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterMute(bool muted); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float masterVolume() const; 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool masterMute() const; 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamVolume(int stream, float value); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamMute(int stream, bool muted); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float streamVolume(int stream) const; 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool streamMute(int stream) const; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51123f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent bool isStreamActive(int stream) const; 512a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 513b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project sp<Track> createTrack_l( 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<AudioFlinger::Client>& client, 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int streamType, 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer, 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status); 522a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 523a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamOut* getOutput() { return mOutput; } 524a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 525a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual int type() const { return mType; } 526d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent void suspend() { mSuspended++; } 527d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent void restore() { if (mSuspended) mSuspended--; } 5288ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent bool isSuspended() { return (mSuspended != 0); } 529a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual String8 getParameters(const String8& keys); 530a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void audioConfigChanged(int event, int param = 0); 5310986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames); 532a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct stream_type_t { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream_type_t() 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : volume(1.0f), 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mute(false) 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float volume; 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mute; 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5432c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent protected: 5442c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent int mType; 5452c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent int16_t* mMixBuffer; 546d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent int mSuspended; 5472c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent int mBytesWritten; 5482c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent bool mMasterMute; 5492c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent SortedVector< wp<Track> > mActiveTracks; 5502c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent 55162443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual int getTrackName_l() = 0; 55262443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual void deleteTrackName_l(int name) = 0; 553059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t activeSleepTimeUs() = 0; 554059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t idleSleepTimeUs() = 0; 55562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioFlinger; 5596c30a71122a6ef2189304c136f13a87727804b0aEric Laurent friend class OutputTrack; 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class Track; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class TrackBase; 562a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class MixerThread; 563a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DirectOutputThread; 564a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DuplicatingThread; 565a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 566a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent PlaybackThread(const Client&); 567a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent PlaybackThread& operator = (const PlaybackThread&); 568a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 569b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project status_t addTrack_l(const sp<Track>& track); 570b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project void destroyTrack_l(const sp<Track>& track); 57162443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent 572a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void readOutputParameters(); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 574a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t dumpInternals(int fd, const Vector<String16>& args); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpTracks(int fd, const Vector<String16>& args); 576a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SortedVector< sp<Track> > mTracks; 578a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread 579a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1]; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioStreamOut* mOutput; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mMasterVolume; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nsecs_t mLastWriteTime; 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mNumWrites; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mNumDelayedWrites; 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mInWrite; 586a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 587a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 588a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class MixerThread : public PlaybackThread { 589a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 59049f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id); 591a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual ~MixerThread(); 592a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 593a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Thread virtuals 594a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 595a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 596a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void getTracks(SortedVector < sp<Track> >& tracks, 597a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SortedVector < wp<Track> >& activeTracks, 598a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int streamType); 599a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void putTracks(SortedVector < sp<Track> >& tracks, 600a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SortedVector < wp<Track> >& activeTracks); 601a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool checkForNewParameters_l(); 602a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t dumpInternals(int fd, const Vector<String16>& args); 603a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 604a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent protected: 605059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent uint32_t prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove); 60662443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual int getTrackName_l(); 60762443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual void deleteTrackName_l(int name); 608059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t activeSleepTimeUs(); 609059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t idleSleepTimeUs(); 610a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 611a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioMixer* mAudioMixer; 612a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 613a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 614a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class DirectOutputThread : public PlaybackThread { 615a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 616a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 61749f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id); 618a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~DirectOutputThread(); 619a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 620a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Thread virtuals 621a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 622a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 62362443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual bool checkForNewParameters_l(); 62462443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent 62562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent protected: 626a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual int getTrackName_l(); 627a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void deleteTrackName_l(int name); 628059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t activeSleepTimeUs(); 629059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t idleSleepTimeUs(); 630a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 631a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 632a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float mLeftVolume; 633a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float mRightVolume; 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 636a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class DuplicatingThread : public MixerThread { 637a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 63849f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread, int id); 639a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~DuplicatingThread(); 640a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 641a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Thread virtuals 642a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 643a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void addOutputTrack(MixerThread* thread); 644a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void removeOutputTrack(MixerThread* thread); 6458ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent uint32_t waitTimeMs() { return mWaitTimeMs; } 6468ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent protected: 6478ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent virtual uint32_t activeSleepTimeUs(); 648a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 649a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 6508ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent bool outputsReady(SortedVector< sp<OutputTrack> > &outputTracks); 6518ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent void updateWaitTime(); 6528ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent 653a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SortedVector < sp<OutputTrack> > mOutputTracks; 6548ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent uint32_t mWaitTimeMs; 655a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 656a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 657ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent PlaybackThread *checkPlaybackThread_l(int output) const; 658ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent MixerThread *checkMixerThread_l(int output) const; 659ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent RecordThread *checkRecordThread_l(int input) const; 660a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; } 66149f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent void audioConfigChanged_l(int event, int ioHandle, void *param2); 662a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioBuffer; 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class TrackHandle : public android::BnAudioTrack { 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 667a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent TrackHandle(const sp<PlaybackThread::Track>& track); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~TrackHandle(); 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void flush(); 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void mute(bool); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void pause(); 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void setVolume(float left, float right); 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IMemory> getCblk() const; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 679a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<PlaybackThread::Track> mTrack; 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class Client; 683a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class PlaybackThread::Track; 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 686b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent void removeClient_l(pid_t pid); 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // record thread 690a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordThread : public ThreadBase, public AudioBufferProvider 691a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent { 692a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 693a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 694a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // record track 695a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordTrack : public TrackBase { 696a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 697a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordTrack(const wp<ThreadBase>& thread, 698a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<Client>& client, 699a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t sampleRate, 700a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int format, 701a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int channelCount, 702a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int frameCount, 703a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t flags); 704a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~RecordTrack(); 705a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 706a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t start(); 707a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void stop(); 708a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 709a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; } 710a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; } 711a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 7123fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent void dump(char* buffer, size_t size); 713a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 714a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class AudioFlinger; 7152c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class RecordThread; 716a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 717a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordTrack(const RecordTrack&); 718a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordTrack& operator = (const RecordTrack&); 719a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 720a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 721a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 722a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mOverflow; 723a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 724a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 725a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 726a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordThread(const sp<AudioFlinger>& audioFlinger, 727a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamIn *input, 728a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t sampleRate, 72949f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent uint32_t channels, 73049f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent int id); 731a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~RecordThread(); 732a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 733a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 734a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t readyToRun() { return NO_ERROR; } 735a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void onFirstRef(); 736a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 737a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t start(RecordTrack* recordTrack); 738a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void stop(RecordTrack* recordTrack); 739a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t dump(int fd, const Vector<String16>& args); 740a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamIn* getInput() { return mInput; } 741a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 742a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 743a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); 744a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool checkForNewParameters_l(); 745a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual String8 getParameters(const String8& keys); 746a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void audioConfigChanged(int event, int param = 0); 747a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void readInputParameters(); 748a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 749a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 750a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordThread(); 751a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamIn *mInput; 752a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<RecordTrack> mActiveTrack; 753a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Condition mStartStopCond; 754a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioResampler *mResampler; 755a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int32_t *mRsmpOutBuffer; 756a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int16_t *mRsmpInBuffer; 757a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t mRsmpInIndex; 758a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t mInputBytes; 759a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mReqChannelCount; 760a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t mReqSampleRate; 7619cc489a2196e449dbe090ad9bdbc5cedd0b8334fEric Laurent ssize_t mBytesRead; 762a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class RecordHandle : public android::BnAudioRecord { 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 766a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack); 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~RecordHandle(); 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IMemory> getCblk() const; 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 774a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<RecordThread::RecordTrack> mRecordTrack; 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 777a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class RecordThread; 778a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class PlaybackThread; 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 781b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project mutable Mutex mLock; 782b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DefaultKeyedVector< pid_t, wp<Client> > mClients; 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 785a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mutable Mutex mHardwareLock; 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioHardwareInterface* mAudioHardware; 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable int mHardwareStatus; 788a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 789a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 790ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent DefaultKeyedVector< int, sp<PlaybackThread> > mPlaybackThreads; 791a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent PlaybackThread::stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES]; 792a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float mMasterVolume; 793a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mMasterMute; 794a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 795ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent DefaultKeyedVector< int, sp<RecordThread> > mRecordThreads; 796a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 797a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SortedVector< sp<IBinder> > mNotificationClients; 798ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int mNextThreadId; 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_AUDIO_FLINGER_H 806