AudioFlinger.h revision 8ac9f8d1c708dc8bb853f7697f10051031eb73c5
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 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool isMusicActive() 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 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IBinder::DeathRecipient 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void binderDied(const wp<IBinder>& who); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum hardware_call_state { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_IDLE = 0, 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_INIT, 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_OUTPUT_OPEN, 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_OUTPUT_CLOSE, 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_INPUT_OPEN, 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_INPUT_CLOSE, 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_STANDBY, 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_MASTER_VOLUME, 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_GET_ROUTING, 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_ROUTING, 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_GET_MODE, 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_MODE, 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_GET_MIC_MUTE, 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_MIC_MUTE, 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_SET_VOICE_VOLUME, 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_SET_PARAMETER, 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // record interface 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IAudioRecord> openRecord( 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid, 164ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int input, 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags, 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Parcel& data, 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* reply, 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioFlinger(); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~AudioFlinger(); 181a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Internal dump utilites. 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpPermissionDenial(int fd, const Vector<String16>& args); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpClients(int fd, const Vector<String16>& args); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpInternals(int fd, const Vector<String16>& args); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // --- Client --- 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Client : public RefBase { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Client(const sp<AudioFlinger>& audioFlinger, pid_t pid); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~Client(); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<MemoryDealer>& heap() const; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid() const { return mPid; } 195b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent sp<AudioFlinger> audioFlinger() { return mAudioFlinger; } 196b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Client(const Client&); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Client& operator = (const Client&); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AudioFlinger> mAudioFlinger; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MemoryDealer> mMemoryDealer; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t mPid; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class TrackHandle; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class RecordHandle; 208a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordThread; 209a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class PlaybackThread; 210a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class MixerThread; 211a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class DirectOutputThread; 2128ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent class DuplicatingThread; 213a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class Track; 214a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordTrack; 215a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 216a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class ThreadBase : public Thread { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 21849f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent ThreadBase (const sp<AudioFlinger>& audioFlinger, int id); 219a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual ~ThreadBase(); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2213fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent status_t dumpBase(int fd, const Vector<String16>& args); 2223fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // base for record and playback 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class TrackBase : public AudioBufferProvider, public RefBase { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum track_state { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IDLE, 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TERMINATED, 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STOPPED, 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RESUMING, 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ACTIVE, 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PAUSING, 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PAUSED 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum track_flags { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STEPSERVER_FAILED = 0x01, // StepServer could not acquire cblk->lock mutex 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SYSTEM_FLAGS_MASK = 0x0000ffffUL, 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The upper 16 bits are used for track-specific flags. 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 243a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent TrackBase(const wp<ThreadBase>& thread, 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<Client>& client, 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags, 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~TrackBase(); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start() = 0; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop() = 0; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> getCblk() const; 2566c30a71122a6ef2189304c136f13a87727804b0aEric Laurent audio_track_cblk_t* cblk() const { return mCblk; } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected: 259a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class ThreadBase; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class RecordHandle; 2612c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class PlaybackThread; 2622c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class RecordThread; 2632c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class MixerThread; 2642c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class DirectOutputThread; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TrackBase(const TrackBase&); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TrackBase& operator = (const TrackBase&); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format() const { 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFormat; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount() const ; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sampleRate() const; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* getBuffer(uint32_t offset, uint32_t frames) const; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isStopped() const { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == STOPPED; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isTerminated() const { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == TERMINATED; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool step(); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void reset(); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 293a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent wp<ThreadBase> mThread; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Client> mClient; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> mCblkMemory; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_track_cblk_t* mCblk; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* mBuffer; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* mBufferEnd; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mFrameCount; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we don't really need a lock for these 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mState; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mClientTid; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t mFormat; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mFlags; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 307a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class ConfigEvent { 308a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 309a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ConfigEvent() : mEvent(0), mParam(0) {} 310a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 311a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mEvent; 312a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mParam; 313a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 314a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 315a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t sampleRate() const; 316a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int channelCount() const; 317a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int format() const; 318a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t frameCount() const; 319a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void wakeUp() { mWaitWorkCV.broadcast(); } 320a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void exit(); 321a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool checkForNewParameters_l() = 0; 322a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t setParameters(const String8& keyValuePairs); 323a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual String8 getParameters(const String8& keys) = 0; 324a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void audioConfigChanged(int event, int param = 0) = 0; 325a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void sendConfigEvent(int event, int param = 0); 3268fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent void sendConfigEvent_l(int event, int param = 0); 327a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void processConfigEvents(); 32849f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent int id() const { return mId;} 3298ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent bool standby() { return mStandby; } 330a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 3312c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent mutable Mutex mLock; 3322c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent 333a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent protected: 334a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 335a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class Track; 336a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class TrackBase; 337a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class PlaybackThread; 338a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class MixerThread; 339a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DirectOutputThread; 340a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DuplicatingThread; 341a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class RecordThread; 342a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class RecordTrack; 343a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 344a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Condition mWaitWorkCV; 345a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<AudioFlinger> mAudioFlinger; 346a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t mSampleRate; 347a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t mFrameCount; 348a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mChannelCount; 349a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mFormat; 350a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t mFrameSize; 351a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Condition mParamCond; 3528fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent Vector<String8> mNewParameters; 353a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t mParamStatus; 354a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Vector<ConfigEvent *> mConfigEvents; 355a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mStandby; 35649f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent int mId; 35749f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent bool mExiting; 358a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 359a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 360a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // --- PlaybackThread --- 361a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class PlaybackThread : public ThreadBase { 362a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 363a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 364a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent enum type { 365a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent MIXER, 366a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent DIRECT, 367a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent DUPLICATING 368a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 369a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 370059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent enum mixer_state { 371059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent MIXER_IDLE, 372059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent MIXER_TRACKS_ENABLED, 373059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent MIXER_TRACKS_READY 374059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent }; 375059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // playback track 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Track : public TrackBase { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 379a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Track( const wp<ThreadBase>& thread, 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<Client>& client, 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int streamType, 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~Track(); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dump(char* buffer, size_t size); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void pause(); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void flush(); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void destroy(); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void mute(bool); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setVolume(float left, float right); 398a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int name() const { 399a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return mName; 400a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4024bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent int type() const { 4034bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent return mStreamType; 4044bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent } 4054bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent 4064bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected: 408a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class ThreadBase; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioFlinger; 4102c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class TrackHandle; 4112c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class PlaybackThread; 4122c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class MixerThread; 4132c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class DirectOutputThread; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Track(const Track&); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Track& operator = (const Track&); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 419a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool isMuted() { return mMute; } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isPausing() const { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == PAUSING; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isPaused() const { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == PAUSED; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isReady() const; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setPaused() { mState = PAUSED; } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void reset(); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43049f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent bool isOutputTrack() const { 43149f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent return (mStreamType == AudioSystem::NUM_STREAM_TYPES); 43249f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent } 43349f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we don't really need a lock for these 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mVolume[2]; 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project volatile bool mMute; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FILLED state is used for suppressing volume ramp at begin of playing 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum {FS_FILLING, FS_FILLED, FS_ACTIVE}; 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable uint8_t mFillingUpStatus; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int8_t mRetryCount; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> mSharedBuffer; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mResetDone; 4434bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent int mStreamType; 444a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mName; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; // end of Track 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // playback track 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class OutputTrack : public Track { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 451a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Buffer: public AudioBufferProvider::Buffer { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int16_t *mBuffer; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 456a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 457a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputTrack( const wp<ThreadBase>& thread, 4588ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent DuplicatingThread *sourceThread, 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount); 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~OutputTrack(); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 467a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool write(int16_t* data, uint32_t frames); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; } 469a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool isActive() { return mActive; } 470a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent wp<ThreadBase>& thread() { return mThread; } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 474a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearBufferQueue(); 476a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 477a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Maximum number of pending buffers allocated by OutputTrack::write() 4788ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent static const uint8_t kMaxOverFlowBuffers = 10; 479a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector < Buffer* > mBufferQueue; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioBufferProvider::Buffer mOutBuffer; 482a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mActive; 4838ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent DuplicatingThread* mSourceThread; 484a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; // end of OutputTrack 485a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 48649f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id); 487a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual ~PlaybackThread(); 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t dump(int fd, const Vector<String16>& args); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Thread virtuals 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t readyToRun(); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void onFirstRef(); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual uint32_t latency() const; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterVolume(float value); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterMute(bool muted); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float masterVolume() const; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool masterMute() const; 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamVolume(int stream, float value); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamMute(int stream, bool muted); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float streamVolume(int stream) const; 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool streamMute(int stream) const; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool isMusicActive() const; 510a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 511b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project sp<Track> createTrack_l( 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<AudioFlinger::Client>& client, 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int streamType, 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer, 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status); 520a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 521a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamOut* getOutput() { return mOutput; } 522a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 523a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual int type() const { return mType; } 524d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent void suspend() { mSuspended++; } 525d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent void restore() { if (mSuspended) mSuspended--; } 5268ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent bool isSuspended() { return (mSuspended != 0); } 527a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual String8 getParameters(const String8& keys); 528a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void audioConfigChanged(int event, int param = 0); 529a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct stream_type_t { 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream_type_t() 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : volume(1.0f), 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mute(false) 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float volume; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mute; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5402c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent protected: 5412c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent int mType; 5422c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent int16_t* mMixBuffer; 543d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent int mSuspended; 5442c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent int mBytesWritten; 5452c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent bool mMasterMute; 5462c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent SortedVector< wp<Track> > mActiveTracks; 5472c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent 54862443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual int getTrackName_l() = 0; 54962443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual void deleteTrackName_l(int name) = 0; 550059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t activeSleepTimeUs() = 0; 551059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t idleSleepTimeUs() = 0; 55262443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioFlinger; 5566c30a71122a6ef2189304c136f13a87727804b0aEric Laurent friend class OutputTrack; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class Track; 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class TrackBase; 559a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class MixerThread; 560a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DirectOutputThread; 561a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DuplicatingThread; 562a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 563a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent PlaybackThread(const Client&); 564a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent PlaybackThread& operator = (const PlaybackThread&); 565a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 566b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project status_t addTrack_l(const sp<Track>& track); 567b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project void destroyTrack_l(const sp<Track>& track); 56862443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent 569a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void readOutputParameters(); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 571a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t dumpInternals(int fd, const Vector<String16>& args); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpTracks(int fd, const Vector<String16>& args); 573a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SortedVector< sp<Track> > mTracks; 575a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread 576a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1]; 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioStreamOut* mOutput; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mMasterVolume; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nsecs_t mLastWriteTime; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mNumWrites; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mNumDelayedWrites; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mInWrite; 583a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 584a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 585a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class MixerThread : public PlaybackThread { 586a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 58749f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id); 588a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual ~MixerThread(); 589a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 590a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Thread virtuals 591a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 592a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 593a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void getTracks(SortedVector < sp<Track> >& tracks, 594a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SortedVector < wp<Track> >& activeTracks, 595a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int streamType); 596a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void putTracks(SortedVector < sp<Track> >& tracks, 597a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SortedVector < wp<Track> >& activeTracks); 598a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool checkForNewParameters_l(); 599a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t dumpInternals(int fd, const Vector<String16>& args); 600a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 601a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent protected: 602059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent uint32_t prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove); 60362443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual int getTrackName_l(); 60462443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual void deleteTrackName_l(int name); 605059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t activeSleepTimeUs(); 606059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t idleSleepTimeUs(); 607a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 608a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioMixer* mAudioMixer; 609a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 610a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 611a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class DirectOutputThread : public PlaybackThread { 612a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 613a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 61449f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id); 615a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~DirectOutputThread(); 616a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 617a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Thread virtuals 618a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 619a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 62062443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual bool checkForNewParameters_l(); 62162443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent 62262443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent protected: 623a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual int getTrackName_l(); 624a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void deleteTrackName_l(int name); 625059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t activeSleepTimeUs(); 626059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t idleSleepTimeUs(); 627a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 628a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 629a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float mLeftVolume; 630a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float mRightVolume; 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 633a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class DuplicatingThread : public MixerThread { 634a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 63549f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread, int id); 636a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~DuplicatingThread(); 637a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 638a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Thread virtuals 639a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 640a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void addOutputTrack(MixerThread* thread); 641a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void removeOutputTrack(MixerThread* thread); 6428ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent uint32_t waitTimeMs() { return mWaitTimeMs; } 6438ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent protected: 6448ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent virtual uint32_t activeSleepTimeUs(); 645a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 646a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 6478ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent bool outputsReady(SortedVector< sp<OutputTrack> > &outputTracks); 6488ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent void updateWaitTime(); 6498ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent 650a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SortedVector < sp<OutputTrack> > mOutputTracks; 6518ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent uint32_t mWaitTimeMs; 652a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 653a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 654ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent PlaybackThread *checkPlaybackThread_l(int output) const; 655ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent MixerThread *checkMixerThread_l(int output) const; 656ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent RecordThread *checkRecordThread_l(int input) const; 657a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; } 65849f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent void audioConfigChanged_l(int event, int ioHandle, void *param2); 659a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioBuffer; 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class TrackHandle : public android::BnAudioTrack { 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 664a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent TrackHandle(const sp<PlaybackThread::Track>& track); 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~TrackHandle(); 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void flush(); 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void mute(bool); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void pause(); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void setVolume(float left, float right); 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IMemory> getCblk() const; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 676a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<PlaybackThread::Track> mTrack; 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class Client; 680a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class PlaybackThread::Track; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 683b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent void removeClient_l(pid_t pid); 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 686a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // record thread 687a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordThread : public ThreadBase, public AudioBufferProvider 688a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent { 689a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 690a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 691a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // record track 692a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordTrack : public TrackBase { 693a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 694a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordTrack(const wp<ThreadBase>& thread, 695a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<Client>& client, 696a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t sampleRate, 697a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int format, 698a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int channelCount, 699a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int frameCount, 700a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t flags); 701a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~RecordTrack(); 702a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 703a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t start(); 704a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void stop(); 705a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 706a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; } 707a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; } 708a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 7093fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent void dump(char* buffer, size_t size); 710a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 711a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class AudioFlinger; 7122c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class RecordThread; 713a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 714a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordTrack(const RecordTrack&); 715a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordTrack& operator = (const RecordTrack&); 716a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 717a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 718a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 719a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mOverflow; 720a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 721a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 722a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 723a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordThread(const sp<AudioFlinger>& audioFlinger, 724a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamIn *input, 725a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t sampleRate, 72649f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent uint32_t channels, 72749f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent int id); 728a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~RecordThread(); 729a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 730a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 731a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t readyToRun() { return NO_ERROR; } 732a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void onFirstRef(); 733a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 734a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t start(RecordTrack* recordTrack); 735a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void stop(RecordTrack* recordTrack); 736a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t dump(int fd, const Vector<String16>& args); 737a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamIn* getInput() { return mInput; } 738a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 739a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 740a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); 741a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool checkForNewParameters_l(); 742a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual String8 getParameters(const String8& keys); 743a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void audioConfigChanged(int event, int param = 0); 744a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void readInputParameters(); 745a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 746a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 747a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordThread(); 748a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamIn *mInput; 749a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<RecordTrack> mActiveTrack; 750a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Condition mStartStopCond; 751a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioResampler *mResampler; 752a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int32_t *mRsmpOutBuffer; 753a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int16_t *mRsmpInBuffer; 754a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t mRsmpInIndex; 755a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t mInputBytes; 756a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mReqChannelCount; 757a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t mReqSampleRate; 7589cc489a2196e449dbe090ad9bdbc5cedd0b8334fEric Laurent ssize_t mBytesRead; 759a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class RecordHandle : public android::BnAudioRecord { 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 763a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack); 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~RecordHandle(); 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IMemory> getCblk() const; 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 771a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<RecordThread::RecordTrack> mRecordTrack; 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 774a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class RecordThread; 775a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class PlaybackThread; 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 778b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project mutable Mutex mLock; 779b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DefaultKeyedVector< pid_t, wp<Client> > mClients; 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 782a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mutable Mutex mHardwareLock; 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioHardwareInterface* mAudioHardware; 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable int mHardwareStatus; 785a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 786a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 787ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent DefaultKeyedVector< int, sp<PlaybackThread> > mPlaybackThreads; 788a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent PlaybackThread::stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES]; 789a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float mMasterVolume; 790a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mMasterMute; 791a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 792ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent DefaultKeyedVector< int, sp<RecordThread> > mRecordThreads; 793a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 794a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SortedVector< sp<IBinder> > mNotificationClients; 795ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int mNextThreadId; 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_AUDIO_FLINGER_H 803