blob: 12c90ebd16464f280bc8f59f56a9ca273ec44960 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/* //device/include/server/AudioFlinger/AudioFlinger.h
2**
3** Copyright 2007, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18#ifndef ANDROID_AUDIO_FLINGER_H
19#define ANDROID_AUDIO_FLINGER_H
20
21#include <stdint.h>
22#include <sys/types.h>
Eric Laurent8ac9f8d2009-12-18 05:47:48 -080023#include <limits.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080024
25#include <media/IAudioFlinger.h>
26#include <media/IAudioFlingerClient.h>
27#include <media/IAudioTrack.h>
28#include <media/IAudioRecord.h>
29#include <media/AudioTrack.h>
30
31#include <utils/Atomic.h>
32#include <utils/Errors.h>
33#include <utils/threads.h>
Mathias Agopian07952722009-05-19 19:08:10 -070034#include <binder/MemoryDealer.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080035#include <utils/SortedVector.h>
36#include <utils/Vector.h>
37
38#include <hardware_legacy/AudioHardwareInterface.h>
39
40#include "AudioBufferProvider.h"
41
42namespace android {
43
44class audio_track_cblk_t;
45class AudioMixer;
46class AudioBuffer;
Eric Laurenta553c252009-07-17 12:17:14 -070047class AudioResampler;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080048
49
50// ----------------------------------------------------------------------------
51
52#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true ))
53#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false ))
54
55
56// ----------------------------------------------------------------------------
57
58static const nsecs_t kStandbyTimeInNsecs = seconds(3);
59
Eric Laurenta553c252009-07-17 12:17:14 -070060class AudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080061{
62public:
63 static void instantiate();
64
65 virtual status_t dump(int fd, const Vector<String16>& args);
66
67 // IAudioFlinger interface
68 virtual sp<IAudioTrack> createTrack(
69 pid_t pid,
70 int streamType,
71 uint32_t sampleRate,
72 int format,
73 int channelCount,
74 int frameCount,
75 uint32_t flags,
76 const sp<IMemory>& sharedBuffer,
Eric Laurentddb78e72009-07-28 08:44:33 -070077 int output,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080078 status_t *status);
79
Eric Laurentddb78e72009-07-28 08:44:33 -070080 virtual uint32_t sampleRate(int output) const;
81 virtual int channelCount(int output) const;
82 virtual int format(int output) const;
83 virtual size_t frameCount(int output) const;
84 virtual uint32_t latency(int output) const;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080085
86 virtual status_t setMasterVolume(float value);
87 virtual status_t setMasterMute(bool muted);
88
89 virtual float masterVolume() const;
90 virtual bool masterMute() const;
91
Eric Laurentddb78e72009-07-28 08:44:33 -070092 virtual status_t setStreamVolume(int stream, float value, int output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080093 virtual status_t setStreamMute(int stream, bool muted);
94
Eric Laurentddb78e72009-07-28 08:44:33 -070095 virtual float streamVolume(int stream, int output) const;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080096 virtual bool streamMute(int stream) const;
97
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080098 virtual status_t setMode(int mode);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080099
100 virtual status_t setMicMute(bool state);
101 virtual bool getMicMute() const;
102
103 virtual bool isMusicActive() const;
104
Eric Laurentddb78e72009-07-28 08:44:33 -0700105 virtual status_t setParameters(int ioHandle, const String8& keyValuePairs);
106 virtual String8 getParameters(int ioHandle, const String8& keys);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800107
108 virtual void registerClient(const sp<IAudioFlingerClient>& client);
Eric Laurenta553c252009-07-17 12:17:14 -0700109
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800110 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount);
Eric Laurenta553c252009-07-17 12:17:14 -0700111
Eric Laurentddb78e72009-07-28 08:44:33 -0700112 virtual int openOutput(uint32_t *pDevices,
Eric Laurenta553c252009-07-17 12:17:14 -0700113 uint32_t *pSamplingRate,
114 uint32_t *pFormat,
115 uint32_t *pChannels,
116 uint32_t *pLatencyMs,
117 uint32_t flags);
118
Eric Laurentddb78e72009-07-28 08:44:33 -0700119 virtual int openDuplicateOutput(int output1, int output2);
Eric Laurenta553c252009-07-17 12:17:14 -0700120
Eric Laurentddb78e72009-07-28 08:44:33 -0700121 virtual status_t closeOutput(int output);
Eric Laurenta553c252009-07-17 12:17:14 -0700122
Eric Laurentddb78e72009-07-28 08:44:33 -0700123 virtual status_t suspendOutput(int output);
Eric Laurenta553c252009-07-17 12:17:14 -0700124
Eric Laurentddb78e72009-07-28 08:44:33 -0700125 virtual status_t restoreOutput(int output);
Eric Laurenta553c252009-07-17 12:17:14 -0700126
Eric Laurentddb78e72009-07-28 08:44:33 -0700127 virtual int openInput(uint32_t *pDevices,
Eric Laurenta553c252009-07-17 12:17:14 -0700128 uint32_t *pSamplingRate,
129 uint32_t *pFormat,
130 uint32_t *pChannels,
131 uint32_t acoustics);
132
Eric Laurentddb78e72009-07-28 08:44:33 -0700133 virtual status_t closeInput(int input);
Eric Laurenta553c252009-07-17 12:17:14 -0700134
Eric Laurentddb78e72009-07-28 08:44:33 -0700135 virtual status_t setStreamOutput(uint32_t stream, int output);
Eric Laurenta553c252009-07-17 12:17:14 -0700136
Eric Laurent415f3e22009-10-21 08:14:22 -0700137 virtual status_t setVoiceVolume(float volume);
138
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800139 // IBinder::DeathRecipient
140 virtual void binderDied(const wp<IBinder>& who);
141
142 enum hardware_call_state {
143 AUDIO_HW_IDLE = 0,
144 AUDIO_HW_INIT,
145 AUDIO_HW_OUTPUT_OPEN,
146 AUDIO_HW_OUTPUT_CLOSE,
147 AUDIO_HW_INPUT_OPEN,
148 AUDIO_HW_INPUT_CLOSE,
149 AUDIO_HW_STANDBY,
150 AUDIO_HW_SET_MASTER_VOLUME,
151 AUDIO_HW_GET_ROUTING,
152 AUDIO_HW_SET_ROUTING,
153 AUDIO_HW_GET_MODE,
154 AUDIO_HW_SET_MODE,
155 AUDIO_HW_GET_MIC_MUTE,
156 AUDIO_HW_SET_MIC_MUTE,
157 AUDIO_SET_VOICE_VOLUME,
158 AUDIO_SET_PARAMETER,
159 };
160
161 // record interface
162 virtual sp<IAudioRecord> openRecord(
163 pid_t pid,
Eric Laurentddb78e72009-07-28 08:44:33 -0700164 int input,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800165 uint32_t sampleRate,
166 int format,
167 int channelCount,
168 int frameCount,
169 uint32_t flags,
170 status_t *status);
171
172 virtual status_t onTransact(
173 uint32_t code,
174 const Parcel& data,
175 Parcel* reply,
176 uint32_t flags);
177
178private:
179 AudioFlinger();
180 virtual ~AudioFlinger();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800181
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800182
183 // Internal dump utilites.
184 status_t dumpPermissionDenial(int fd, const Vector<String16>& args);
185 status_t dumpClients(int fd, const Vector<String16>& args);
186 status_t dumpInternals(int fd, const Vector<String16>& args);
187
188 // --- Client ---
189 class Client : public RefBase {
190 public:
191 Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
192 virtual ~Client();
193 const sp<MemoryDealer>& heap() const;
194 pid_t pid() const { return mPid; }
Eric Laurentb9481d82009-09-17 05:12:56 -0700195 sp<AudioFlinger> audioFlinger() { return mAudioFlinger; }
196
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800197 private:
198 Client(const Client&);
199 Client& operator = (const Client&);
200 sp<AudioFlinger> mAudioFlinger;
201 sp<MemoryDealer> mMemoryDealer;
202 pid_t mPid;
203 };
204
205
206 class TrackHandle;
207 class RecordHandle;
Eric Laurenta553c252009-07-17 12:17:14 -0700208 class RecordThread;
209 class PlaybackThread;
210 class MixerThread;
211 class DirectOutputThread;
Eric Laurent8ac9f8d2009-12-18 05:47:48 -0800212 class DuplicatingThread;
Eric Laurenta553c252009-07-17 12:17:14 -0700213 class Track;
214 class RecordTrack;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800215
Eric Laurenta553c252009-07-17 12:17:14 -0700216 class ThreadBase : public Thread {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800217 public:
Eric Laurent49f02be2009-11-19 09:00:56 -0800218 ThreadBase (const sp<AudioFlinger>& audioFlinger, int id);
Eric Laurenta553c252009-07-17 12:17:14 -0700219 virtual ~ThreadBase();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800220
Eric Laurent3fdb1262009-11-07 00:01:32 -0800221 status_t dumpBase(int fd, const Vector<String16>& args);
222
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800223 // base for record and playback
224 class TrackBase : public AudioBufferProvider, public RefBase {
225
226 public:
227 enum track_state {
228 IDLE,
229 TERMINATED,
230 STOPPED,
231 RESUMING,
232 ACTIVE,
233 PAUSING,
234 PAUSED
235 };
236
237 enum track_flags {
238 STEPSERVER_FAILED = 0x01, // StepServer could not acquire cblk->lock mutex
239 SYSTEM_FLAGS_MASK = 0x0000ffffUL,
240 // The upper 16 bits are used for track-specific flags.
241 };
242
Eric Laurenta553c252009-07-17 12:17:14 -0700243 TrackBase(const wp<ThreadBase>& thread,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800244 const sp<Client>& client,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800245 uint32_t sampleRate,
246 int format,
247 int channelCount,
248 int frameCount,
249 uint32_t flags,
250 const sp<IMemory>& sharedBuffer);
251 ~TrackBase();
252
253 virtual status_t start() = 0;
254 virtual void stop() = 0;
255 sp<IMemory> getCblk() const;
Eric Laurent6c30a712009-08-10 23:22:32 -0700256 audio_track_cblk_t* cblk() const { return mCblk; }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800257
258 protected:
Eric Laurenta553c252009-07-17 12:17:14 -0700259 friend class ThreadBase;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800260 friend class RecordHandle;
Eric Laurent2c817f52009-07-23 13:17:39 -0700261 friend class PlaybackThread;
262 friend class RecordThread;
263 friend class MixerThread;
264 friend class DirectOutputThread;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800265
266 TrackBase(const TrackBase&);
267 TrackBase& operator = (const TrackBase&);
268
269 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
270 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
271
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800272 int format() const {
273 return mFormat;
274 }
275
276 int channelCount() const ;
277
278 int sampleRate() const;
279
280 void* getBuffer(uint32_t offset, uint32_t frames) const;
281
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800282 bool isStopped() const {
283 return mState == STOPPED;
284 }
285
286 bool isTerminated() const {
287 return mState == TERMINATED;
288 }
289
290 bool step();
291 void reset();
292
Eric Laurenta553c252009-07-17 12:17:14 -0700293 wp<ThreadBase> mThread;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800294 sp<Client> mClient;
295 sp<IMemory> mCblkMemory;
296 audio_track_cblk_t* mCblk;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800297 void* mBuffer;
298 void* mBufferEnd;
299 uint32_t mFrameCount;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800300 // we don't really need a lock for these
301 int mState;
302 int mClientTid;
303 uint8_t mFormat;
304 uint32_t mFlags;
305 };
306
Eric Laurenta553c252009-07-17 12:17:14 -0700307 class ConfigEvent {
308 public:
309 ConfigEvent() : mEvent(0), mParam(0) {}
310
311 int mEvent;
312 int mParam;
313 };
314
315 uint32_t sampleRate() const;
316 int channelCount() const;
317 int format() const;
318 size_t frameCount() const;
319 void wakeUp() { mWaitWorkCV.broadcast(); }
320 void exit();
321 virtual bool checkForNewParameters_l() = 0;
322 virtual status_t setParameters(const String8& keyValuePairs);
323 virtual String8 getParameters(const String8& keys) = 0;
324 virtual void audioConfigChanged(int event, int param = 0) = 0;
325 void sendConfigEvent(int event, int param = 0);
Eric Laurent8fce46a2009-08-04 09:45:33 -0700326 void sendConfigEvent_l(int event, int param = 0);
Eric Laurenta553c252009-07-17 12:17:14 -0700327 void processConfigEvents();
Eric Laurent49f02be2009-11-19 09:00:56 -0800328 int id() const { return mId;}
Eric Laurent8ac9f8d2009-12-18 05:47:48 -0800329 bool standby() { return mStandby; }
Eric Laurenta553c252009-07-17 12:17:14 -0700330
Eric Laurent2c817f52009-07-23 13:17:39 -0700331 mutable Mutex mLock;
332
Eric Laurenta553c252009-07-17 12:17:14 -0700333 protected:
334
335 friend class Track;
336 friend class TrackBase;
337 friend class PlaybackThread;
338 friend class MixerThread;
339 friend class DirectOutputThread;
340 friend class DuplicatingThread;
341 friend class RecordThread;
342 friend class RecordTrack;
343
Eric Laurenta553c252009-07-17 12:17:14 -0700344 Condition mWaitWorkCV;
345 sp<AudioFlinger> mAudioFlinger;
346 uint32_t mSampleRate;
347 size_t mFrameCount;
348 int mChannelCount;
349 int mFormat;
350 uint32_t mFrameSize;
351 Condition mParamCond;
Eric Laurent8fce46a2009-08-04 09:45:33 -0700352 Vector<String8> mNewParameters;
Eric Laurenta553c252009-07-17 12:17:14 -0700353 status_t mParamStatus;
354 Vector<ConfigEvent *> mConfigEvents;
355 bool mStandby;
Eric Laurent49f02be2009-11-19 09:00:56 -0800356 int mId;
357 bool mExiting;
Eric Laurenta553c252009-07-17 12:17:14 -0700358 };
359
360 // --- PlaybackThread ---
361 class PlaybackThread : public ThreadBase {
362 public:
363
364 enum type {
365 MIXER,
366 DIRECT,
367 DUPLICATING
368 };
369
Eric Laurent059b4be2009-11-09 23:32:22 -0800370 enum mixer_state {
371 MIXER_IDLE,
372 MIXER_TRACKS_ENABLED,
373 MIXER_TRACKS_READY
374 };
375
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800376 // playback track
377 class Track : public TrackBase {
378 public:
Eric Laurenta553c252009-07-17 12:17:14 -0700379 Track( const wp<ThreadBase>& thread,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800380 const sp<Client>& client,
381 int streamType,
382 uint32_t sampleRate,
383 int format,
384 int channelCount,
385 int frameCount,
386 const sp<IMemory>& sharedBuffer);
387 ~Track();
388
389 void dump(char* buffer, size_t size);
390 virtual status_t start();
391 virtual void stop();
392 void pause();
393
394 void flush();
395 void destroy();
396 void mute(bool);
397 void setVolume(float left, float right);
Eric Laurenta553c252009-07-17 12:17:14 -0700398 int name() const {
399 return mName;
400 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800401
Eric Laurent4bc035a2009-05-22 09:18:15 -0700402 int type() const {
403 return mStreamType;
404 }
405
406
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800407 protected:
Eric Laurenta553c252009-07-17 12:17:14 -0700408 friend class ThreadBase;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800409 friend class AudioFlinger;
Eric Laurent2c817f52009-07-23 13:17:39 -0700410 friend class TrackHandle;
411 friend class PlaybackThread;
412 friend class MixerThread;
413 friend class DirectOutputThread;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800414
415 Track(const Track&);
416 Track& operator = (const Track&);
417
418 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
Eric Laurenta553c252009-07-17 12:17:14 -0700419 bool isMuted() { return mMute; }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800420 bool isPausing() const {
421 return mState == PAUSING;
422 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800423 bool isPaused() const {
424 return mState == PAUSED;
425 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800426 bool isReady() const;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800427 void setPaused() { mState = PAUSED; }
428 void reset();
429
Eric Laurent49f02be2009-11-19 09:00:56 -0800430 bool isOutputTrack() const {
431 return (mStreamType == AudioSystem::NUM_STREAM_TYPES);
432 }
433
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800434 // we don't really need a lock for these
435 float mVolume[2];
436 volatile bool mMute;
437 // FILLED state is used for suppressing volume ramp at begin of playing
438 enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
439 mutable uint8_t mFillingUpStatus;
440 int8_t mRetryCount;
441 sp<IMemory> mSharedBuffer;
442 bool mResetDone;
Eric Laurent4bc035a2009-05-22 09:18:15 -0700443 int mStreamType;
Eric Laurenta553c252009-07-17 12:17:14 -0700444 int mName;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800445 }; // end of Track
446
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800447
448 // playback track
449 class OutputTrack : public Track {
450 public:
Eric Laurenta553c252009-07-17 12:17:14 -0700451
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800452 class Buffer: public AudioBufferProvider::Buffer {
453 public:
454 int16_t *mBuffer;
455 };
Eric Laurenta553c252009-07-17 12:17:14 -0700456
457 OutputTrack( const wp<ThreadBase>& thread,
Eric Laurent8ac9f8d2009-12-18 05:47:48 -0800458 DuplicatingThread *sourceThread,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800459 uint32_t sampleRate,
460 int format,
461 int channelCount,
462 int frameCount);
463 ~OutputTrack();
464
465 virtual status_t start();
466 virtual void stop();
Eric Laurenta553c252009-07-17 12:17:14 -0700467 bool write(int16_t* data, uint32_t frames);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800468 bool bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
Eric Laurenta553c252009-07-17 12:17:14 -0700469 bool isActive() { return mActive; }
470 wp<ThreadBase>& thread() { return mThread; }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800471
472 private:
473
Eric Laurenta553c252009-07-17 12:17:14 -0700474 status_t obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800475 void clearBufferQueue();
Eric Laurenta553c252009-07-17 12:17:14 -0700476
477 // Maximum number of pending buffers allocated by OutputTrack::write()
Eric Laurent8ac9f8d2009-12-18 05:47:48 -0800478 static const uint8_t kMaxOverFlowBuffers = 10;
Eric Laurenta553c252009-07-17 12:17:14 -0700479
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800480 Vector < Buffer* > mBufferQueue;
481 AudioBufferProvider::Buffer mOutBuffer;
Eric Laurenta553c252009-07-17 12:17:14 -0700482 bool mActive;
Eric Laurent8ac9f8d2009-12-18 05:47:48 -0800483 DuplicatingThread* mSourceThread;
Eric Laurenta553c252009-07-17 12:17:14 -0700484 }; // end of OutputTrack
485
Eric Laurent49f02be2009-11-19 09:00:56 -0800486 PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
Eric Laurenta553c252009-07-17 12:17:14 -0700487 virtual ~PlaybackThread();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800488
489 virtual status_t dump(int fd, const Vector<String16>& args);
490
491 // Thread virtuals
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800492 virtual status_t readyToRun();
493 virtual void onFirstRef();
494
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800495 virtual uint32_t latency() const;
496
497 virtual status_t setMasterVolume(float value);
498 virtual status_t setMasterMute(bool muted);
499
500 virtual float masterVolume() const;
501 virtual bool masterMute() const;
502
503 virtual status_t setStreamVolume(int stream, float value);
504 virtual status_t setStreamMute(int stream, bool muted);
505
506 virtual float streamVolume(int stream) const;
507 virtual bool streamMute(int stream) const;
508
Eric Laurenta553c252009-07-17 12:17:14 -0700509 bool isMusicActive() const;
510
The Android Open Source Projectb2a3dd82009-03-09 11:52:12 -0700511 sp<Track> createTrack_l(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800512 const sp<AudioFlinger::Client>& client,
513 int streamType,
514 uint32_t sampleRate,
515 int format,
516 int channelCount,
517 int frameCount,
518 const sp<IMemory>& sharedBuffer,
519 status_t *status);
Eric Laurenta553c252009-07-17 12:17:14 -0700520
521 AudioStreamOut* getOutput() { return mOutput; }
522
523 virtual int type() const { return mType; }
Eric Laurentd5603c12009-08-06 08:49:39 -0700524 void suspend() { mSuspended++; }
525 void restore() { if (mSuspended) mSuspended--; }
Eric Laurent8ac9f8d2009-12-18 05:47:48 -0800526 bool isSuspended() { return (mSuspended != 0); }
Eric Laurenta553c252009-07-17 12:17:14 -0700527 virtual String8 getParameters(const String8& keys);
528 virtual void audioConfigChanged(int event, int param = 0);
529
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800530 struct stream_type_t {
531 stream_type_t()
532 : volume(1.0f),
533 mute(false)
534 {
535 }
536 float volume;
537 bool mute;
538 };
539
Eric Laurent2c817f52009-07-23 13:17:39 -0700540 protected:
541 int mType;
542 int16_t* mMixBuffer;
Eric Laurentd5603c12009-08-06 08:49:39 -0700543 int mSuspended;
Eric Laurent2c817f52009-07-23 13:17:39 -0700544 int mBytesWritten;
545 bool mMasterMute;
546 SortedVector< wp<Track> > mActiveTracks;
547
Eric Laurent62443f52009-10-05 20:29:18 -0700548 virtual int getTrackName_l() = 0;
549 virtual void deleteTrackName_l(int name) = 0;
Eric Laurent059b4be2009-11-09 23:32:22 -0800550 virtual uint32_t activeSleepTimeUs() = 0;
551 virtual uint32_t idleSleepTimeUs() = 0;
Eric Laurent62443f52009-10-05 20:29:18 -0700552
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800553 private:
554
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800555 friend class AudioFlinger;
Eric Laurent6c30a712009-08-10 23:22:32 -0700556 friend class OutputTrack;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800557 friend class Track;
558 friend class TrackBase;
Eric Laurenta553c252009-07-17 12:17:14 -0700559 friend class MixerThread;
560 friend class DirectOutputThread;
561 friend class DuplicatingThread;
562
563 PlaybackThread(const Client&);
564 PlaybackThread& operator = (const PlaybackThread&);
565
The Android Open Source Projectb2a3dd82009-03-09 11:52:12 -0700566 status_t addTrack_l(const sp<Track>& track);
The Android Open Source Projectb2a3dd82009-03-09 11:52:12 -0700567 void destroyTrack_l(const sp<Track>& track);
Eric Laurent62443f52009-10-05 20:29:18 -0700568
Eric Laurenta553c252009-07-17 12:17:14 -0700569 void readOutputParameters();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800570
Eric Laurenta553c252009-07-17 12:17:14 -0700571 virtual status_t dumpInternals(int fd, const Vector<String16>& args);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800572 status_t dumpTracks(int fd, const Vector<String16>& args);
Eric Laurenta553c252009-07-17 12:17:14 -0700573
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800574 SortedVector< sp<Track> > mTracks;
Eric Laurenta553c252009-07-17 12:17:14 -0700575 // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread
576 stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800577 AudioStreamOut* mOutput;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800578 float mMasterVolume;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800579 nsecs_t mLastWriteTime;
580 int mNumWrites;
581 int mNumDelayedWrites;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800582 bool mInWrite;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800583 };
584
Eric Laurenta553c252009-07-17 12:17:14 -0700585 class MixerThread : public PlaybackThread {
586 public:
Eric Laurent49f02be2009-11-19 09:00:56 -0800587 MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
Eric Laurenta553c252009-07-17 12:17:14 -0700588 virtual ~MixerThread();
589
590 // Thread virtuals
591 virtual bool threadLoop();
592
593 void getTracks(SortedVector < sp<Track> >& tracks,
594 SortedVector < wp<Track> >& activeTracks,
595 int streamType);
596 void putTracks(SortedVector < sp<Track> >& tracks,
597 SortedVector < wp<Track> >& activeTracks);
Eric Laurenta553c252009-07-17 12:17:14 -0700598 virtual bool checkForNewParameters_l();
599 virtual status_t dumpInternals(int fd, const Vector<String16>& args);
600
601 protected:
Eric Laurent059b4be2009-11-09 23:32:22 -0800602 uint32_t prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove);
Eric Laurent62443f52009-10-05 20:29:18 -0700603 virtual int getTrackName_l();
604 virtual void deleteTrackName_l(int name);
Eric Laurent059b4be2009-11-09 23:32:22 -0800605 virtual uint32_t activeSleepTimeUs();
606 virtual uint32_t idleSleepTimeUs();
Eric Laurenta553c252009-07-17 12:17:14 -0700607
608 AudioMixer* mAudioMixer;
609 };
610
611 class DirectOutputThread : public PlaybackThread {
612 public:
613
Eric Laurent49f02be2009-11-19 09:00:56 -0800614 DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
Eric Laurenta553c252009-07-17 12:17:14 -0700615 ~DirectOutputThread();
616
617 // Thread virtuals
618 virtual bool threadLoop();
619
Eric Laurent62443f52009-10-05 20:29:18 -0700620 virtual bool checkForNewParameters_l();
621
622 protected:
Eric Laurenta553c252009-07-17 12:17:14 -0700623 virtual int getTrackName_l();
624 virtual void deleteTrackName_l(int name);
Eric Laurent059b4be2009-11-09 23:32:22 -0800625 virtual uint32_t activeSleepTimeUs();
626 virtual uint32_t idleSleepTimeUs();
Eric Laurenta553c252009-07-17 12:17:14 -0700627
628 private:
629 float mLeftVolume;
630 float mRightVolume;
631 };
632
633 class DuplicatingThread : public MixerThread {
634 public:
Eric Laurent49f02be2009-11-19 09:00:56 -0800635 DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread, int id);
Eric Laurenta553c252009-07-17 12:17:14 -0700636 ~DuplicatingThread();
637
638 // Thread virtuals
639 virtual bool threadLoop();
640 void addOutputTrack(MixerThread* thread);
641 void removeOutputTrack(MixerThread* thread);
Eric Laurent8ac9f8d2009-12-18 05:47:48 -0800642 uint32_t waitTimeMs() { return mWaitTimeMs; }
643 protected:
644 virtual uint32_t activeSleepTimeUs();
Eric Laurenta553c252009-07-17 12:17:14 -0700645
646 private:
Eric Laurent8ac9f8d2009-12-18 05:47:48 -0800647 bool outputsReady(SortedVector< sp<OutputTrack> > &outputTracks);
648 void updateWaitTime();
649
Eric Laurenta553c252009-07-17 12:17:14 -0700650 SortedVector < sp<OutputTrack> > mOutputTracks;
Eric Laurent8ac9f8d2009-12-18 05:47:48 -0800651 uint32_t mWaitTimeMs;
Eric Laurenta553c252009-07-17 12:17:14 -0700652 };
653
Eric Laurentddb78e72009-07-28 08:44:33 -0700654 PlaybackThread *checkPlaybackThread_l(int output) const;
655 MixerThread *checkMixerThread_l(int output) const;
656 RecordThread *checkRecordThread_l(int input) const;
Eric Laurenta553c252009-07-17 12:17:14 -0700657 float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; }
Eric Laurent49f02be2009-11-19 09:00:56 -0800658 void audioConfigChanged_l(int event, int ioHandle, void *param2);
Eric Laurenta553c252009-07-17 12:17:14 -0700659
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800660 friend class AudioBuffer;
661
662 class TrackHandle : public android::BnAudioTrack {
663 public:
Eric Laurenta553c252009-07-17 12:17:14 -0700664 TrackHandle(const sp<PlaybackThread::Track>& track);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800665 virtual ~TrackHandle();
666 virtual status_t start();
667 virtual void stop();
668 virtual void flush();
669 virtual void mute(bool);
670 virtual void pause();
671 virtual void setVolume(float left, float right);
672 virtual sp<IMemory> getCblk() const;
673 virtual status_t onTransact(
674 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
675 private:
Eric Laurenta553c252009-07-17 12:17:14 -0700676 sp<PlaybackThread::Track> mTrack;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800677 };
678
679 friend class Client;
Eric Laurenta553c252009-07-17 12:17:14 -0700680 friend class PlaybackThread::Track;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800681
682
Eric Laurentb9481d82009-09-17 05:12:56 -0700683 void removeClient_l(pid_t pid);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800684
685
Eric Laurenta553c252009-07-17 12:17:14 -0700686 // record thread
687 class RecordThread : public ThreadBase, public AudioBufferProvider
688 {
689 public:
690
691 // record track
692 class RecordTrack : public TrackBase {
693 public:
694 RecordTrack(const wp<ThreadBase>& thread,
695 const sp<Client>& client,
696 uint32_t sampleRate,
697 int format,
698 int channelCount,
699 int frameCount,
700 uint32_t flags);
701 ~RecordTrack();
702
703 virtual status_t start();
704 virtual void stop();
705
706 bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
707 bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
708
Eric Laurent3fdb1262009-11-07 00:01:32 -0800709 void dump(char* buffer, size_t size);
Eric Laurenta553c252009-07-17 12:17:14 -0700710 private:
711 friend class AudioFlinger;
Eric Laurent2c817f52009-07-23 13:17:39 -0700712 friend class RecordThread;
Eric Laurenta553c252009-07-17 12:17:14 -0700713
714 RecordTrack(const RecordTrack&);
715 RecordTrack& operator = (const RecordTrack&);
716
717 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
718
719 bool mOverflow;
720 };
721
722
723 RecordThread(const sp<AudioFlinger>& audioFlinger,
724 AudioStreamIn *input,
725 uint32_t sampleRate,
Eric Laurent49f02be2009-11-19 09:00:56 -0800726 uint32_t channels,
727 int id);
Eric Laurenta553c252009-07-17 12:17:14 -0700728 ~RecordThread();
729
730 virtual bool threadLoop();
731 virtual status_t readyToRun() { return NO_ERROR; }
732 virtual void onFirstRef();
733
734 status_t start(RecordTrack* recordTrack);
735 void stop(RecordTrack* recordTrack);
736 status_t dump(int fd, const Vector<String16>& args);
737 AudioStreamIn* getInput() { return mInput; }
738
739 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
740 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
741 virtual bool checkForNewParameters_l();
742 virtual String8 getParameters(const String8& keys);
743 virtual void audioConfigChanged(int event, int param = 0);
744 void readInputParameters();
745
746 private:
747 RecordThread();
748 AudioStreamIn *mInput;
749 sp<RecordTrack> mActiveTrack;
750 Condition mStartStopCond;
751 AudioResampler *mResampler;
752 int32_t *mRsmpOutBuffer;
753 int16_t *mRsmpInBuffer;
754 size_t mRsmpInIndex;
755 size_t mInputBytes;
756 int mReqChannelCount;
757 uint32_t mReqSampleRate;
Eric Laurent9cc489a22009-12-05 05:20:01 -0800758 ssize_t mBytesRead;
Eric Laurenta553c252009-07-17 12:17:14 -0700759 };
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800760
761 class RecordHandle : public android::BnAudioRecord {
762 public:
Eric Laurenta553c252009-07-17 12:17:14 -0700763 RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800764 virtual ~RecordHandle();
765 virtual status_t start();
766 virtual void stop();
767 virtual sp<IMemory> getCblk() const;
768 virtual status_t onTransact(
769 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
770 private:
Eric Laurenta553c252009-07-17 12:17:14 -0700771 sp<RecordThread::RecordTrack> mRecordTrack;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800772 };
773
Eric Laurenta553c252009-07-17 12:17:14 -0700774 friend class RecordThread;
775 friend class PlaybackThread;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800776
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800777
The Android Open Source Projectb2a3dd82009-03-09 11:52:12 -0700778 mutable Mutex mLock;
The Android Open Source Projectb2a3dd82009-03-09 11:52:12 -0700779
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800780 DefaultKeyedVector< pid_t, wp<Client> > mClients;
781
Eric Laurenta553c252009-07-17 12:17:14 -0700782 mutable Mutex mHardwareLock;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800783 AudioHardwareInterface* mAudioHardware;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800784 mutable int mHardwareStatus;
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700785
Eric Laurenta553c252009-07-17 12:17:14 -0700786
Eric Laurentddb78e72009-07-28 08:44:33 -0700787 DefaultKeyedVector< int, sp<PlaybackThread> > mPlaybackThreads;
Eric Laurenta553c252009-07-17 12:17:14 -0700788 PlaybackThread::stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
789 float mMasterVolume;
790 bool mMasterMute;
791
Eric Laurentddb78e72009-07-28 08:44:33 -0700792 DefaultKeyedVector< int, sp<RecordThread> > mRecordThreads;
Eric Laurenta553c252009-07-17 12:17:14 -0700793
794 SortedVector< sp<IBinder> > mNotificationClients;
Eric Laurentddb78e72009-07-28 08:44:33 -0700795 int mNextThreadId;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800796};
797
798// ----------------------------------------------------------------------------
799
800}; // namespace android
801
802#endif // ANDROID_AUDIO_FLINGER_H