blob: dfbb1e94f022407b376394b49bc0519fd0145977 [file] [log] [blame]
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -07001/* //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>
23
24#include <media/IAudioFlinger.h>
The Android Open Source Projecta6938ba2009-02-10 15:44:00 -080025#include <media/IAudioFlingerClient.h>
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070026#include <media/IAudioTrack.h>
27#include <media/IAudioRecord.h>
28#include <media/AudioTrack.h>
29
30#include <utils/Atomic.h>
31#include <utils/Errors.h>
32#include <utils/threads.h>
33#include <utils/MemoryDealer.h>
34#include <utils/KeyedVector.h>
35#include <utils/SortedVector.h>
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -080036#include <utils/Vector.h>
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070037
The Android Open Source Project8a7a6752009-01-15 16:12:10 -080038#include <hardware_legacy/AudioHardwareInterface.h>
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070039
40#include "AudioBufferProvider.h"
41
42namespace android {
43
44class audio_track_cblk_t;
45class AudioMixer;
46class AudioBuffer;
47
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080048
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070049// ----------------------------------------------------------------------------
50
51#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true ))
52#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false ))
53
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080054
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070055// ----------------------------------------------------------------------------
56
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080057static const nsecs_t kStandbyTimeInNsecs = seconds(3);
58
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -080059class AudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070060{
61public:
62 static void instantiate();
63
64 virtual status_t dump(int fd, const Vector<String16>& args);
65
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070066 // IAudioFlinger interface
67 virtual sp<IAudioTrack> createTrack(
68 pid_t pid,
69 int streamType,
70 uint32_t sampleRate,
71 int format,
72 int channelCount,
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080073 int frameCount,
74 uint32_t flags,
75 const sp<IMemory>& sharedBuffer,
76 status_t *status);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070077
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -080078 virtual uint32_t sampleRate(int output) const;
79 virtual int channelCount(int output) const;
80 virtual int format(int output) const;
81 virtual size_t frameCount(int output) const;
82 virtual uint32_t latency(int output) const;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070083
84 virtual status_t setMasterVolume(float value);
85 virtual status_t setMasterMute(bool muted);
86
87 virtual float masterVolume() const;
88 virtual bool masterMute() const;
89
90 virtual status_t setStreamVolume(int stream, float value);
91 virtual status_t setStreamMute(int stream, bool muted);
92
93 virtual float streamVolume(int stream) const;
94 virtual bool streamMute(int stream) const;
95
96 virtual status_t setRouting(int mode, uint32_t routes, uint32_t mask);
97 virtual uint32_t getRouting(int mode) const;
98
99 virtual status_t setMode(int mode);
100 virtual int getMode() const;
101
102 virtual status_t setMicMute(bool state);
103 virtual bool getMicMute() const;
104
105 virtual bool isMusicActive() const;
106
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800107 virtual bool isA2dpEnabled() const;
108
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700109 virtual status_t setParameter(const char* key, const char* value);
110
The Android Open Source Projecta6938ba2009-02-10 15:44:00 -0800111 virtual void registerClient(const sp<IAudioFlingerClient>& client);
112
113 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount);
114
115 virtual void wakeUp();
116
117 // IBinder::DeathRecipient
118 virtual void binderDied(const wp<IBinder>& who);
119
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700120 enum hardware_call_state {
121 AUDIO_HW_IDLE = 0,
122 AUDIO_HW_INIT,
123 AUDIO_HW_OUTPUT_OPEN,
124 AUDIO_HW_OUTPUT_CLOSE,
125 AUDIO_HW_INPUT_OPEN,
126 AUDIO_HW_INPUT_CLOSE,
127 AUDIO_HW_STANDBY,
128 AUDIO_HW_SET_MASTER_VOLUME,
129 AUDIO_HW_GET_ROUTING,
130 AUDIO_HW_SET_ROUTING,
131 AUDIO_HW_GET_MODE,
132 AUDIO_HW_SET_MODE,
133 AUDIO_HW_GET_MIC_MUTE,
134 AUDIO_HW_SET_MIC_MUTE,
135 AUDIO_SET_VOICE_VOLUME,
136 AUDIO_SET_PARAMETER,
137 };
138
139 // record interface
140 virtual sp<IAudioRecord> openRecord(
141 pid_t pid,
142 int streamType,
143 uint32_t sampleRate,
144 int format,
145 int channelCount,
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800146 int frameCount,
147 uint32_t flags,
148 status_t *status);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700149
150 virtual status_t onTransact(
151 uint32_t code,
152 const Parcel& data,
153 Parcel* reply,
154 uint32_t flags);
155
156private:
157 AudioFlinger();
158 virtual ~AudioFlinger();
159
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800160 void setOutput(int outputType);
161 void doSetOutput(int outputType);
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800162
The Android Open Source Projecte41dd752009-01-22 00:13:42 -0800163#ifdef WITH_A2DP
The Android Open Source Projecte41dd752009-01-22 00:13:42 -0800164 void setA2dpEnabled(bool enable);
165#endif
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800166 static bool streamForcedToSpeaker(int streamType);
167
168 // Management of forced route to speaker for certain track types.
169 enum force_speaker_command {
170 ACTIVE_TRACK_ADDED = 0,
171 ACTIVE_TRACK_REMOVED,
172 CHECK_ROUTE_RESTORE_TIME,
173 FORCE_ROUTE_RESTORE
174 };
175 void handleForcedSpeakerRoute(int command);
The Android Open Source Projecte41dd752009-01-22 00:13:42 -0800176
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700177 // Internal dump utilites.
178 status_t dumpPermissionDenial(int fd, const Vector<String16>& args);
179 status_t dumpClients(int fd, const Vector<String16>& args);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700180 status_t dumpInternals(int fd, const Vector<String16>& args);
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800181
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700182 // --- Client ---
183 class Client : public RefBase {
184 public:
185 Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
186 virtual ~Client();
187 const sp<MemoryDealer>& heap() const;
188 pid_t pid() const { return mPid; }
189 private:
190 Client(const Client&);
191 Client& operator = (const Client&);
192 sp<AudioFlinger> mAudioFlinger;
193 sp<MemoryDealer> mMemoryDealer;
194 pid_t mPid;
195 };
196
197
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700198 class TrackHandle;
199 class RecordHandle;
200 class AudioRecordThread;
201
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800202
203 // --- MixerThread ---
204 class MixerThread : public Thread {
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700205 public:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800206
207 // --- Track ---
208
209 // base for record and playback
210 class TrackBase : public AudioBufferProvider, public RefBase {
211
212 public:
213 enum track_state {
214 IDLE,
215 TERMINATED,
216 STOPPED,
217 RESUMING,
218 ACTIVE,
219 PAUSING,
220 PAUSED
221 };
222
223 enum track_flags {
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800224 STEPSERVER_FAILED = 0x01, // StepServer could not acquire cblk->lock mutex
225 SYSTEM_FLAGS_MASK = 0x0000ffffUL,
The Android Open Source Project43aa2b12009-03-03 14:04:24 -0800226
227 AUDIO_IN_AGC_ENABLE = AudioSystem::AGC_ENABLE << 16,
228 AUDIO_IN_NS_ENABLE = AudioSystem::NS_ENABLE << 16,
229 AUDIO_IN_IIR_ENABLE = AudioSystem::TX_IIR_ENABLE << 16
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800230 };
231
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800232 TrackBase(const sp<MixerThread>& mixerThread,
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800233 const sp<Client>& client,
234 int streamType,
235 uint32_t sampleRate,
236 int format,
237 int channelCount,
238 int frameCount,
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800239 uint32_t flags,
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800240 const sp<IMemory>& sharedBuffer);
241 ~TrackBase();
242
243 virtual status_t start() = 0;
244 virtual void stop() = 0;
245 sp<IMemory> getCblk() const;
246
247 protected:
248 friend class MixerThread;
249 friend class RecordHandle;
250 friend class AudioRecordThread;
251
252 TrackBase(const TrackBase&);
253 TrackBase& operator = (const TrackBase&);
254
255 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
256 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
257
258 audio_track_cblk_t* cblk() const {
259 return mCblk;
260 }
261
262 int type() const {
263 return mStreamType;
264 }
265
266 int format() const {
267 return mFormat;
268 }
269
270 int channelCount() const ;
271
272 int sampleRate() const;
273
274 void* getBuffer(uint32_t offset, uint32_t frames) const;
275
276 int name() const {
277 return mName;
278 }
279
280 bool isStopped() const {
281 return mState == STOPPED;
282 }
283
284 bool isTerminated() const {
285 return mState == TERMINATED;
286 }
287
288 bool step();
289 void reset();
290
291 sp<MixerThread> mMixerThread;
292 sp<Client> mClient;
293 sp<IMemory> mCblkMemory;
294 audio_track_cblk_t* mCblk;
295 int mStreamType;
296 void* mBuffer;
297 void* mBufferEnd;
298 uint32_t mFrameCount;
299 int mName;
300 // we don't really need a lock for these
301 int mState;
302 int mClientTid;
303 uint8_t mFormat;
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800304 uint32_t mFlags;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700305 };
306
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800307 // playback track
308 class Track : public TrackBase {
309 public:
310 Track( const sp<MixerThread>& mixerThread,
311 const sp<Client>& client,
312 int streamType,
313 uint32_t sampleRate,
314 int format,
315 int channelCount,
316 int frameCount,
317 const sp<IMemory>& sharedBuffer);
318 ~Track();
319
320 void dump(char* buffer, size_t size);
321 virtual status_t start();
322 virtual void stop();
323 void pause();
324
325 void flush();
326 void destroy();
327 void mute(bool);
328 void setVolume(float left, float right);
329
330 protected:
331 friend class MixerThread;
332 friend class AudioFlinger;
333 friend class AudioFlinger::TrackHandle;
334
335 Track(const Track&);
336 Track& operator = (const Track&);
337
338 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
339
340 bool isMuted() const {
341 return (mMute || mMixerThread->mStreamTypes[mStreamType].mute);
342 }
343
344 bool isPausing() const {
345 return mState == PAUSING;
346 }
347
348 bool isPaused() const {
349 return mState == PAUSED;
350 }
351
352 bool isReady() const;
353
354 void setPaused() { mState = PAUSED; }
355 void reset();
356
357 // we don't really need a lock for these
358 float mVolume[2];
359 volatile bool mMute;
360 // FILLED state is used for suppressing volume ramp at begin of playing
361 enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
362 mutable uint8_t mFillingUpStatus;
363 int8_t mRetryCount;
364 sp<IMemory> mSharedBuffer;
365 bool mResetDone;
366 }; // end of Track
367
368 // record track
369 class RecordTrack : public TrackBase {
370 public:
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800371 RecordTrack(const sp<MixerThread>& mixerThread,
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800372 const sp<Client>& client,
373 int streamType,
374 uint32_t sampleRate,
375 int format,
376 int channelCount,
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800377 int frameCount,
378 uint32_t flags);
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800379 ~RecordTrack();
380
381 virtual status_t start();
382 virtual void stop();
383
384 bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
385 bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
386
387 private:
388 friend class AudioFlinger;
389 friend class AudioFlinger::RecordHandle;
390 friend class AudioFlinger::AudioRecordThread;
391 friend class MixerThread;
392
393 RecordTrack(const Track&);
394 RecordTrack& operator = (const Track&);
395
396 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
397
398 bool mOverflow;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700399 };
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800400
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800401 // playback track
402 class OutputTrack : public Track {
403 public:
404
405 class Buffer: public AudioBufferProvider::Buffer {
406 public:
407 int16_t *mBuffer;
408 };
409
410 OutputTrack( const sp<MixerThread>& mixerThread,
411 uint32_t sampleRate,
412 int format,
413 int channelCount,
414 int frameCount);
415 ~OutputTrack();
416
417 virtual status_t start();
418 virtual void stop();
419 void write(int16_t* data, uint32_t frames);
420 bool bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
421
422 private:
423
424 status_t obtainBuffer(AudioBufferProvider::Buffer* buffer);
425 void clearBufferQueue();
426
427 sp<MixerThread> mOutputMixerThread;
428 Vector < Buffer* > mBufferQueue;
429 AudioBufferProvider::Buffer mOutBuffer;
430 uint32_t mFramesWritten;
431
432 }; // end of OutputTrack
433
434 MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int outputType);
435 virtual ~MixerThread();
436
437 virtual status_t dump(int fd, const Vector<String16>& args);
438
439 // Thread virtuals
440 virtual bool threadLoop();
441 virtual status_t readyToRun();
442 virtual void onFirstRef();
443
444 virtual uint32_t sampleRate() const;
445 virtual int channelCount() const;
446 virtual int format() const;
447 virtual size_t frameCount() const;
448 virtual uint32_t latency() const;
449
450 virtual status_t setMasterVolume(float value);
451 virtual status_t setMasterMute(bool muted);
452
453 virtual float masterVolume() const;
454 virtual bool masterMute() const;
455
456 virtual status_t setStreamVolume(int stream, float value);
457 virtual status_t setStreamMute(int stream, bool muted);
458
459 virtual float streamVolume(int stream) const;
460 virtual bool streamMute(int stream) const;
461
462 bool isMusicActive() const;
463
464
465 sp<Track> createTrack(
466 const sp<AudioFlinger::Client>& client,
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700467 int streamType,
468 uint32_t sampleRate,
469 int format,
470 int channelCount,
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800471 int frameCount,
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800472 const sp<IMemory>& sharedBuffer,
473 status_t *status);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700474
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800475 void wakeUp() { mWaitWorkCV.broadcast(); }
476
477 void getTracks(SortedVector < sp<Track> >& tracks,
478 SortedVector < wp<Track> >& activeTracks);
479 void putTracks(SortedVector < sp<Track> >& tracks,
480 SortedVector < wp<Track> >& activeTracks);
481 void setOuputTrack(OutputTrack *track) { mOutputTrack = track; }
482
483 struct stream_type_t {
484 stream_type_t()
485 : volume(1.0f),
486 mute(false)
487 {
488 }
489 float volume;
490 bool mute;
491 };
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700492
493 private:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800494
495
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700496 friend class AudioFlinger;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800497 friend class Track;
498 friend class TrackBase;
499 friend class RecordTrack;
500
501 MixerThread(const Client&);
502 MixerThread& operator = (const MixerThread&);
503
504 status_t addTrack(const sp<Track>& track);
505 void removeTrack(wp<Track> track, int name);
506 void remove_track_l(wp<Track> track, int name);
507 void destroyTrack(const sp<Track>& track);
508 int getTrackName();
509 void deleteTrackName(int name);
510 void addActiveTrack(const wp<Track>& t);
511 void removeActiveTrack(const wp<Track>& t);
512 size_t getOutputFrameCount();
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700513
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800514 status_t dumpInternals(int fd, const Vector<String16>& args);
515 status_t dumpTracks(int fd, const Vector<String16>& args);
516
517 sp<AudioFlinger> mAudioFlinger;
518 mutable Mutex mLock;
519 mutable Condition mWaitWorkCV;
520 SortedVector< wp<Track> > mActiveTracks;
521 SortedVector< sp<Track> > mTracks;
522 stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
523 AudioMixer* mAudioMixer;
524 AudioStreamOut* mOutput;
525 int mOutputType;
526 uint32_t mSampleRate;
527 size_t mFrameCount;
528 int mChannelCount;
529 int mFormat;
530 int16_t* mMixBuffer;
531 float mMasterVolume;
532 bool mMasterMute;
533 nsecs_t mLastWriteTime;
534 int mNumWrites;
535 int mNumDelayedWrites;
536 bool mStandby;
537 bool mInWrite;
538 sp <OutputTrack> mOutputTrack;
539 };
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700540
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800541
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700542 friend class AudioBuffer;
543
544 class TrackHandle : public android::BnAudioTrack {
545 public:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800546 TrackHandle(const sp<MixerThread::Track>& track);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700547 virtual ~TrackHandle();
548 virtual status_t start();
549 virtual void stop();
550 virtual void flush();
551 virtual void mute(bool);
552 virtual void pause();
553 virtual void setVolume(float left, float right);
554 virtual sp<IMemory> getCblk() const;
555 virtual status_t onTransact(
556 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
557 private:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800558 sp<MixerThread::Track> mTrack;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700559 };
560
561 friend class Client;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800562 friend class MixerThread::Track;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700563
564
565 void removeClient(pid_t pid);
566
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700567
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700568
569 class RecordHandle : public android::BnAudioRecord {
570 public:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800571 RecordHandle(const sp<MixerThread::RecordTrack>& recordTrack);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700572 virtual ~RecordHandle();
573 virtual status_t start();
574 virtual void stop();
575 virtual sp<IMemory> getCblk() const;
576 virtual status_t onTransact(
577 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
578 private:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800579 sp<MixerThread::RecordTrack> mRecordTrack;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700580 };
581
582 // record thread
583 class AudioRecordThread : public Thread
584 {
585 public:
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800586 AudioRecordThread(AudioHardwareInterface* audioHardware);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700587 virtual ~AudioRecordThread();
588 virtual bool threadLoop();
589 virtual status_t readyToRun() { return NO_ERROR; }
590 virtual void onFirstRef() {}
591
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800592 status_t start(MixerThread::RecordTrack* recordTrack);
593 void stop(MixerThread::RecordTrack* recordTrack);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700594 void exit();
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800595 status_t dump(int fd, const Vector<String16>& args);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700596
597 private:
598 AudioRecordThread();
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800599 AudioHardwareInterface *mAudioHardware;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800600 sp<MixerThread::RecordTrack> mRecordTrack;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700601 Mutex mLock;
602 Condition mWaitWorkCV;
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800603 Condition mStopped;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700604 volatile bool mActive;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800605 status_t mStartStatus;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700606 };
607
608 friend class AudioRecordThread;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800609 friend class MixerThread;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700610
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800611 status_t startRecord(MixerThread::RecordTrack* recordTrack);
612 void stopRecord(MixerThread::RecordTrack* recordTrack);
613
614 void handleOutputSwitch();
The Android Open Source Projecta6938ba2009-02-10 15:44:00 -0800615
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700616 mutable Mutex mHardwareLock;
617 mutable Mutex mLock;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700618 DefaultKeyedVector< pid_t, wp<Client> > mClients;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700619
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800620 sp<MixerThread> mA2dpMixerThread;
621 sp<MixerThread> mHardwareMixerThread;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700622 AudioHardwareInterface* mAudioHardware;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800623 AudioHardwareInterface* mA2dpAudioInterface;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700624 sp<AudioRecordThread> mAudioRecordThread;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800625 bool mA2dpEnabled;
626 bool mA2dpEnabledReq;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700627 mutable int mHardwareStatus;
The Android Open Source Projecta6938ba2009-02-10 15:44:00 -0800628 SortedVector< wp<IBinder> > mNotificationClients;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800629 int mForcedSpeakerCount;
630 uint32_t mSavedRoute;
631 uint32_t mForcedRoute;
632 nsecs_t mRouteRestoreTime;
633 bool mMusicMuteSaved;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700634};
635
636// ----------------------------------------------------------------------------
637
638}; // namespace android
639
640#endif // ANDROID_AUDIO_FLINGER_H