AudioFlinger.h revision 8fce46a2b3e93879ae372cf07232451736c5ea7e
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> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioFlinger.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioFlingerClient.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioTrack.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioRecord.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/AudioTrack.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Atomic.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 330795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/MemoryDealer.h> 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/SortedVector.h> 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Vector.h> 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <hardware_legacy/AudioHardwareInterface.h> 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AudioBufferProvider.h" 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass audio_track_cblk_t; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioMixer; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioBuffer; 46a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentclass AudioResampler; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const nsecs_t kStandbyTimeInNsecs = seconds(3); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 59a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentclass AudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void instantiate(); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t dump(int fd, const Vector<String16>& args); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IAudioFlinger interface 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IAudioTrack> createTrack( 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid, 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int streamType, 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags, 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer, 76ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int output, 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 79ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual uint32_t sampleRate(int output) const; 80ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int channelCount(int output) const; 81ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int format(int output) const; 82ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual size_t frameCount(int output) const; 83ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual uint32_t latency(int output) const; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterVolume(float value); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterMute(bool muted); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float masterVolume() const; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool masterMute() const; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 91ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t setStreamVolume(int stream, float value, int output); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamMute(int stream, bool muted); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 94ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual float streamVolume(int stream, int output) const; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool streamMute(int stream) const; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMode(int mode); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMicMute(bool state); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool getMicMute() const; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool isMusicActive() const; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 104ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t setParameters(int ioHandle, const String8& keyValuePairs); 105ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual String8 getParameters(int ioHandle, const String8& keys); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void registerClient(const sp<IAudioFlingerClient>& client); 108a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount); 110a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 111ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int openOutput(uint32_t *pDevices, 112a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pSamplingRate, 113a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pFormat, 114a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pChannels, 115a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pLatencyMs, 116a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t flags); 117a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 118ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int openDuplicateOutput(int output1, int output2); 119a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 120ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t closeOutput(int output); 121a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 122ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t suspendOutput(int output); 123a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 124ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t restoreOutput(int output); 125a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 126ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int openInput(uint32_t *pDevices, 127a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pSamplingRate, 128a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pFormat, 129a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pChannels, 130a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t acoustics); 131a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 132ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t closeInput(int input); 133a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 134ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t setStreamOutput(uint32_t stream, int output); 135a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IBinder::DeathRecipient 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void binderDied(const wp<IBinder>& who); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum hardware_call_state { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_IDLE = 0, 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_INIT, 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_OUTPUT_OPEN, 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_OUTPUT_CLOSE, 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_INPUT_OPEN, 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_INPUT_CLOSE, 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_STANDBY, 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_MASTER_VOLUME, 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_GET_ROUTING, 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_ROUTING, 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_GET_MODE, 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_MODE, 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_GET_MIC_MUTE, 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_MIC_MUTE, 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_SET_VOICE_VOLUME, 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_SET_PARAMETER, 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // record interface 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IAudioRecord> openRecord( 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid, 161ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int input, 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags, 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Parcel& data, 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* reply, 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioFlinger(); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~AudioFlinger(); 178a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Internal dump utilites. 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpPermissionDenial(int fd, const Vector<String16>& args); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpClients(int fd, const Vector<String16>& args); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpInternals(int fd, const Vector<String16>& args); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // --- Client --- 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Client : public RefBase { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Client(const sp<AudioFlinger>& audioFlinger, pid_t pid); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~Client(); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<MemoryDealer>& heap() const; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid() const { return mPid; } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Client(const Client&); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Client& operator = (const Client&); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AudioFlinger> mAudioFlinger; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MemoryDealer> mMemoryDealer; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t mPid; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class TrackHandle; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class RecordHandle; 203a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordThread; 204a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class PlaybackThread; 205a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class MixerThread; 206a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class DirectOutputThread; 207a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class Track; 208a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordTrack; 209a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 210a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class ThreadBase : public Thread { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 212a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ThreadBase (const sp<AudioFlinger>& audioFlinger); 213a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual ~ThreadBase(); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // base for record and playback 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class TrackBase : public AudioBufferProvider, public RefBase { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum track_state { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IDLE, 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TERMINATED, 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STOPPED, 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RESUMING, 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ACTIVE, 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PAUSING, 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PAUSED 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum track_flags { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STEPSERVER_FAILED = 0x01, // StepServer could not acquire cblk->lock mutex 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SYSTEM_FLAGS_MASK = 0x0000ffffUL, 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The upper 16 bits are used for track-specific flags. 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 235a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent TrackBase(const wp<ThreadBase>& thread, 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<Client>& client, 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags, 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~TrackBase(); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start() = 0; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop() = 0; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> getCblk() const; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected: 250a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class ThreadBase; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class RecordHandle; 2522c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class PlaybackThread; 2532c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class RecordThread; 2542c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class MixerThread; 2552c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class DirectOutputThread; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TrackBase(const TrackBase&); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TrackBase& operator = (const TrackBase&); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_track_cblk_t* cblk() const { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCblk; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format() const { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFormat; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount() const ; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sampleRate() const; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* getBuffer(uint32_t offset, uint32_t frames) const; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isStopped() const { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == STOPPED; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isTerminated() const { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == TERMINATED; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool step(); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void reset(); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 288a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent wp<ThreadBase> mThread; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Client> mClient; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> mCblkMemory; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_track_cblk_t* mCblk; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* mBuffer; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* mBufferEnd; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mFrameCount; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we don't really need a lock for these 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mState; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mClientTid; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t mFormat; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mFlags; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 302a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class ConfigEvent { 303a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 304a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ConfigEvent() : mEvent(0), mParam(0) {} 305a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 306a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mEvent; 307a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mParam; 308a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 309a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 310a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t sampleRate() const; 311a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int channelCount() const; 312a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int format() const; 313a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t frameCount() const; 314a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void wakeUp() { mWaitWorkCV.broadcast(); } 315a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void exit(); 316a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool checkForNewParameters_l() = 0; 317a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t setParameters(const String8& keyValuePairs); 318a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual String8 getParameters(const String8& keys) = 0; 319a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void audioConfigChanged(int event, int param = 0) = 0; 320a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void sendConfigEvent(int event, int param = 0); 3218fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent void sendConfigEvent_l(int event, int param = 0); 322a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void processConfigEvents(); 323a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 3242c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent mutable Mutex mLock; 3252c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent 326a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent protected: 327a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 328a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class Track; 329a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class TrackBase; 330a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class PlaybackThread; 331a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class MixerThread; 332a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DirectOutputThread; 333a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DuplicatingThread; 334a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class RecordThread; 335a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class RecordTrack; 336a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 337a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Condition mWaitWorkCV; 338a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<AudioFlinger> mAudioFlinger; 339a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t mSampleRate; 340a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t mFrameCount; 341a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mChannelCount; 342a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mFormat; 343a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t mFrameSize; 344a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Condition mParamCond; 3458fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent Vector<String8> mNewParameters; 346a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t mParamStatus; 347a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Vector<ConfigEvent *> mConfigEvents; 348a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mStandby; 349a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 350a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 351a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // --- PlaybackThread --- 352a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class PlaybackThread : public ThreadBase { 353a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 354a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 355a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent enum type { 356a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent MIXER, 357a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent DIRECT, 358a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent DUPLICATING 359a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 360a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // playback track 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Track : public TrackBase { 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 364a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Track( const wp<ThreadBase>& thread, 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<Client>& client, 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int streamType, 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~Track(); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dump(char* buffer, size_t size); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void pause(); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void flush(); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void destroy(); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void mute(bool); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setVolume(float left, float right); 383a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int name() const { 384a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return mName; 385a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3874bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent int type() const { 3884bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent return mStreamType; 3894bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent } 3904bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent 3914bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected: 393a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class ThreadBase; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioFlinger; 3952c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class TrackHandle; 3962c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class PlaybackThread; 3972c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class MixerThread; 3982c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class DirectOutputThread; 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Track(const Track&); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Track& operator = (const Track&); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 404a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool isMuted() { return mMute; } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isPausing() const { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == PAUSING; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isPaused() const { 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == PAUSED; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isReady() const; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setPaused() { mState = PAUSED; } 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void reset(); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we don't really need a lock for these 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mVolume[2]; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project volatile bool mMute; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FILLED state is used for suppressing volume ramp at begin of playing 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum {FS_FILLING, FS_FILLED, FS_ACTIVE}; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable uint8_t mFillingUpStatus; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int8_t mRetryCount; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> mSharedBuffer; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mResetDone; 4244bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent int mStreamType; 425a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mName; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; // end of Track 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // playback track 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class OutputTrack : public Track { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 432a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Buffer: public AudioBufferProvider::Buffer { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int16_t *mBuffer; 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 437a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 438a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputTrack( const wp<ThreadBase>& thread, 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~OutputTrack(); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 447a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool write(int16_t* data, uint32_t frames); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; } 449a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool isActive() { return mActive; } 450a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent wp<ThreadBase>& thread() { return mThread; } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 454a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearBufferQueue(); 456a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 457a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Maximum number of pending buffers allocated by OutputTrack::write() 458a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent static const uint8_t kMaxOverFlowBuffers = 3; 459a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector < Buffer* > mBufferQueue; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioBufferProvider::Buffer mOutBuffer; 462a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t mWaitTimeMs; 463a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mActive; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 465a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; // end of OutputTrack 466a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 467a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output); 468a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual ~PlaybackThread(); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t dump(int fd, const Vector<String16>& args); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Thread virtuals 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t readyToRun(); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void onFirstRef(); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual uint32_t latency() const; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterVolume(float value); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterMute(bool muted); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float masterVolume() const; 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool masterMute() const; 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamVolume(int stream, float value); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamMute(int stream, bool muted); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float streamVolume(int stream) const; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool streamMute(int stream) const; 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 490a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool isMusicActive() const; 491a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 492b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project sp<Track> createTrack_l( 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<AudioFlinger::Client>& client, 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int streamType, 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer, 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status); 501a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 502a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamOut* getOutput() { return mOutput; } 503a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 504a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual int type() const { return mType; } 505a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void suspend() { mSuspended = true; } 506a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void restore() { mSuspended = false; } 507a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual String8 getParameters(const String8& keys); 508a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void audioConfigChanged(int event, int param = 0); 509a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct stream_type_t { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream_type_t() 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : volume(1.0f), 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mute(false) 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float volume; 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mute; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5202c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent protected: 5212c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent int mType; 5222c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent int16_t* mMixBuffer; 5232c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent bool mSuspended; 5242c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent int mBytesWritten; 5252c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent bool mMasterMute; 5262c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent SortedVector< wp<Track> > mActiveTracks; 5272c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioFlinger; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class Track; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class TrackBase; 533a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class MixerThread; 534a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DirectOutputThread; 535a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DuplicatingThread; 536a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 537a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent PlaybackThread(const Client&); 538a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent PlaybackThread& operator = (const PlaybackThread&); 539a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 540b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project status_t addTrack_l(const sp<Track>& track); 541b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project void destroyTrack_l(const sp<Track>& track); 542a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual int getTrackName_l() = 0; 543a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void deleteTrackName_l(int name) = 0; 544a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void readOutputParameters(); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 546a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t dumpInternals(int fd, const Vector<String16>& args); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpTracks(int fd, const Vector<String16>& args); 548a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SortedVector< sp<Track> > mTracks; 550a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread 551a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1]; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioStreamOut* mOutput; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mMasterVolume; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nsecs_t mLastWriteTime; 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mNumWrites; 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mNumDelayedWrites; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mInWrite; 558a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mMinBytesToWrite; 559a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 560a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 561a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class MixerThread : public PlaybackThread { 562a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 563a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output); 564a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual ~MixerThread(); 565a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 566a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Thread virtuals 567a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 568a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 569a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void getTracks(SortedVector < sp<Track> >& tracks, 570a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SortedVector < wp<Track> >& activeTracks, 571a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int streamType); 572a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void putTracks(SortedVector < sp<Track> >& tracks, 573a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SortedVector < wp<Track> >& activeTracks); 574a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual int getTrackName_l(); 575a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void deleteTrackName_l(int name); 576a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool checkForNewParameters_l(); 577a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t dumpInternals(int fd, const Vector<String16>& args); 578a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 579a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent protected: 580a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove); 581a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 582a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioMixer* mAudioMixer; 583a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 584a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 585a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class DirectOutputThread : public PlaybackThread { 586a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 587a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 588a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output); 589a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~DirectOutputThread(); 590a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 591a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Thread virtuals 592a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 593a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 594a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual int getTrackName_l(); 595a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void deleteTrackName_l(int name); 596a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool checkForNewParameters_l(); 597a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 598a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 599a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float mLeftVolume; 600a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float mRightVolume; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 603a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class DuplicatingThread : public MixerThread { 604a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 605a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread); 606a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~DuplicatingThread(); 607a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 608a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Thread virtuals 609a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 610a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void addOutputTrack(MixerThread* thread); 611a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void removeOutputTrack(MixerThread* thread); 612a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 613a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 614a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SortedVector < sp<OutputTrack> > mOutputTracks; 615a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 616a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 617ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent PlaybackThread *checkPlaybackThread_l(int output) const; 618ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent MixerThread *checkMixerThread_l(int output) const; 619ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent RecordThread *checkRecordThread_l(int input) const; 620a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; } 621ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent void audioConfigChanged(int event, const sp<ThreadBase>& thread, void *param2); 622a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioBuffer; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class TrackHandle : public android::BnAudioTrack { 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 627a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent TrackHandle(const sp<PlaybackThread::Track>& track); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~TrackHandle(); 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void flush(); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void mute(bool); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void pause(); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void setVolume(float left, float right); 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IMemory> getCblk() const; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 639a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<PlaybackThread::Track> mTrack; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class Client; 643a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class PlaybackThread::Track; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void removeClient(pid_t pid); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // record thread 650a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordThread : public ThreadBase, public AudioBufferProvider 651a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent { 652a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 653a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 654a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // record track 655a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordTrack : public TrackBase { 656a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 657a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordTrack(const wp<ThreadBase>& thread, 658a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<Client>& client, 659a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t sampleRate, 660a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int format, 661a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int channelCount, 662a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int frameCount, 663a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t flags); 664a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~RecordTrack(); 665a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 666a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t start(); 667a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void stop(); 668a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 669a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; } 670a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; } 671a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 672a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 673a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class AudioFlinger; 6742c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class RecordThread; 675a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 676a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordTrack(const RecordTrack&); 677a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordTrack& operator = (const RecordTrack&); 678a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 679a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 680a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 681a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mOverflow; 682a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 683a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 684a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 685a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordThread(const sp<AudioFlinger>& audioFlinger, 686a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamIn *input, 687a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t sampleRate, 688a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels); 689a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~RecordThread(); 690a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 691a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 692a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t readyToRun() { return NO_ERROR; } 693a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void onFirstRef(); 694a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 695a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t start(RecordTrack* recordTrack); 696a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void stop(RecordTrack* recordTrack); 697a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t dump(int fd, const Vector<String16>& args); 698a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamIn* getInput() { return mInput; } 699a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 700a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 701a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); 702a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool checkForNewParameters_l(); 703a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual String8 getParameters(const String8& keys); 704a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void audioConfigChanged(int event, int param = 0); 705a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void readInputParameters(); 706a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 707a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 708a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordThread(); 709a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamIn *mInput; 710a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<RecordTrack> mActiveTrack; 711a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Condition mStartStopCond; 712a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioResampler *mResampler; 713a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int32_t *mRsmpOutBuffer; 714a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int16_t *mRsmpInBuffer; 715a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t mRsmpInIndex; 716a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t mInputBytes; 717a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mReqChannelCount; 718a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t mReqSampleRate; 719a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class RecordHandle : public android::BnAudioRecord { 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 723a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack); 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~RecordHandle(); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IMemory> getCblk() const; 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 731a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<RecordThread::RecordTrack> mRecordTrack; 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 734a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class RecordThread; 735a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class PlaybackThread; 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 738b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project mutable Mutex mLock; 739b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DefaultKeyedVector< pid_t, wp<Client> > mClients; 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 742a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mutable Mutex mHardwareLock; 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioHardwareInterface* mAudioHardware; 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable int mHardwareStatus; 745a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 746a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 747ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent DefaultKeyedVector< int, sp<PlaybackThread> > mPlaybackThreads; 748a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent PlaybackThread::stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES]; 749a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float mMasterVolume; 750a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mMasterMute; 751a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 752ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent DefaultKeyedVector< int, sp<RecordThread> > mRecordThreads; 753a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 754a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SortedVector< sp<IBinder> > mNotificationClients; 755ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int mNextThreadId; 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_AUDIO_FLINGER_H 763