blob: 3b5932deea5a54794665b8bc2f8e0eaf7b49a5ab [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 {
224 STEPSERVER_FAILED = 0x01 // StepServer could not acquire cblk->lock mutex
225 };
226
227 TrackBase( const sp<MixerThread>& mixerThread,
228 const sp<Client>& client,
229 int streamType,
230 uint32_t sampleRate,
231 int format,
232 int channelCount,
233 int frameCount,
234 const sp<IMemory>& sharedBuffer);
235 ~TrackBase();
236
237 virtual status_t start() = 0;
238 virtual void stop() = 0;
239 sp<IMemory> getCblk() const;
240
241 protected:
242 friend class MixerThread;
243 friend class RecordHandle;
244 friend class AudioRecordThread;
245
246 TrackBase(const TrackBase&);
247 TrackBase& operator = (const TrackBase&);
248
249 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
250 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
251
252 audio_track_cblk_t* cblk() const {
253 return mCblk;
254 }
255
256 int type() const {
257 return mStreamType;
258 }
259
260 int format() const {
261 return mFormat;
262 }
263
264 int channelCount() const ;
265
266 int sampleRate() const;
267
268 void* getBuffer(uint32_t offset, uint32_t frames) const;
269
270 int name() const {
271 return mName;
272 }
273
274 bool isStopped() const {
275 return mState == STOPPED;
276 }
277
278 bool isTerminated() const {
279 return mState == TERMINATED;
280 }
281
282 bool step();
283 void reset();
284
285 sp<MixerThread> mMixerThread;
286 sp<Client> mClient;
287 sp<IMemory> mCblkMemory;
288 audio_track_cblk_t* mCblk;
289 int mStreamType;
290 void* mBuffer;
291 void* mBufferEnd;
292 uint32_t mFrameCount;
293 int mName;
294 // we don't really need a lock for these
295 int mState;
296 int mClientTid;
297 uint8_t mFormat;
298 uint8_t mFlags;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700299 };
300
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800301 // playback track
302 class Track : public TrackBase {
303 public:
304 Track( const sp<MixerThread>& mixerThread,
305 const sp<Client>& client,
306 int streamType,
307 uint32_t sampleRate,
308 int format,
309 int channelCount,
310 int frameCount,
311 const sp<IMemory>& sharedBuffer);
312 ~Track();
313
314 void dump(char* buffer, size_t size);
315 virtual status_t start();
316 virtual void stop();
317 void pause();
318
319 void flush();
320 void destroy();
321 void mute(bool);
322 void setVolume(float left, float right);
323
324 protected:
325 friend class MixerThread;
326 friend class AudioFlinger;
327 friend class AudioFlinger::TrackHandle;
328
329 Track(const Track&);
330 Track& operator = (const Track&);
331
332 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
333
334 bool isMuted() const {
335 return (mMute || mMixerThread->mStreamTypes[mStreamType].mute);
336 }
337
338 bool isPausing() const {
339 return mState == PAUSING;
340 }
341
342 bool isPaused() const {
343 return mState == PAUSED;
344 }
345
346 bool isReady() const;
347
348 void setPaused() { mState = PAUSED; }
349 void reset();
350
351 // we don't really need a lock for these
352 float mVolume[2];
353 volatile bool mMute;
354 // FILLED state is used for suppressing volume ramp at begin of playing
355 enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
356 mutable uint8_t mFillingUpStatus;
357 int8_t mRetryCount;
358 sp<IMemory> mSharedBuffer;
359 bool mResetDone;
360 }; // end of Track
361
362 // record track
363 class RecordTrack : public TrackBase {
364 public:
365 RecordTrack( const sp<MixerThread>& mixerThread,
366 const sp<Client>& client,
367 int streamType,
368 uint32_t sampleRate,
369 int format,
370 int channelCount,
371 int frameCount);
372 ~RecordTrack();
373
374 virtual status_t start();
375 virtual void stop();
376
377 bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
378 bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
379
380 private:
381 friend class AudioFlinger;
382 friend class AudioFlinger::RecordHandle;
383 friend class AudioFlinger::AudioRecordThread;
384 friend class MixerThread;
385
386 RecordTrack(const Track&);
387 RecordTrack& operator = (const Track&);
388
389 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
390
391 bool mOverflow;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700392 };
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800393
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800394 // playback track
395 class OutputTrack : public Track {
396 public:
397
398 class Buffer: public AudioBufferProvider::Buffer {
399 public:
400 int16_t *mBuffer;
401 };
402
403 OutputTrack( const sp<MixerThread>& mixerThread,
404 uint32_t sampleRate,
405 int format,
406 int channelCount,
407 int frameCount);
408 ~OutputTrack();
409
410 virtual status_t start();
411 virtual void stop();
412 void write(int16_t* data, uint32_t frames);
413 bool bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
414
415 private:
416
417 status_t obtainBuffer(AudioBufferProvider::Buffer* buffer);
418 void clearBufferQueue();
419
420 sp<MixerThread> mOutputMixerThread;
421 Vector < Buffer* > mBufferQueue;
422 AudioBufferProvider::Buffer mOutBuffer;
423 uint32_t mFramesWritten;
424
425 }; // end of OutputTrack
426
427 MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int outputType);
428 virtual ~MixerThread();
429
430 virtual status_t dump(int fd, const Vector<String16>& args);
431
432 // Thread virtuals
433 virtual bool threadLoop();
434 virtual status_t readyToRun();
435 virtual void onFirstRef();
436
437 virtual uint32_t sampleRate() const;
438 virtual int channelCount() const;
439 virtual int format() const;
440 virtual size_t frameCount() const;
441 virtual uint32_t latency() const;
442
443 virtual status_t setMasterVolume(float value);
444 virtual status_t setMasterMute(bool muted);
445
446 virtual float masterVolume() const;
447 virtual bool masterMute() const;
448
449 virtual status_t setStreamVolume(int stream, float value);
450 virtual status_t setStreamMute(int stream, bool muted);
451
452 virtual float streamVolume(int stream) const;
453 virtual bool streamMute(int stream) const;
454
455 bool isMusicActive() const;
456
457
458 sp<Track> createTrack(
459 const sp<AudioFlinger::Client>& client,
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700460 int streamType,
461 uint32_t sampleRate,
462 int format,
463 int channelCount,
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800464 int frameCount,
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800465 const sp<IMemory>& sharedBuffer,
466 status_t *status);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700467
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800468 void wakeUp() { mWaitWorkCV.broadcast(); }
469
470 void getTracks(SortedVector < sp<Track> >& tracks,
471 SortedVector < wp<Track> >& activeTracks);
472 void putTracks(SortedVector < sp<Track> >& tracks,
473 SortedVector < wp<Track> >& activeTracks);
474 void setOuputTrack(OutputTrack *track) { mOutputTrack = track; }
475
476 struct stream_type_t {
477 stream_type_t()
478 : volume(1.0f),
479 mute(false)
480 {
481 }
482 float volume;
483 bool mute;
484 };
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700485
486 private:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800487
488
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700489 friend class AudioFlinger;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800490 friend class Track;
491 friend class TrackBase;
492 friend class RecordTrack;
493
494 MixerThread(const Client&);
495 MixerThread& operator = (const MixerThread&);
496
497 status_t addTrack(const sp<Track>& track);
498 void removeTrack(wp<Track> track, int name);
499 void remove_track_l(wp<Track> track, int name);
500 void destroyTrack(const sp<Track>& track);
501 int getTrackName();
502 void deleteTrackName(int name);
503 void addActiveTrack(const wp<Track>& t);
504 void removeActiveTrack(const wp<Track>& t);
505 size_t getOutputFrameCount();
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700506
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800507 status_t dumpInternals(int fd, const Vector<String16>& args);
508 status_t dumpTracks(int fd, const Vector<String16>& args);
509
510 sp<AudioFlinger> mAudioFlinger;
511 mutable Mutex mLock;
512 mutable Condition mWaitWorkCV;
513 SortedVector< wp<Track> > mActiveTracks;
514 SortedVector< sp<Track> > mTracks;
515 stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
516 AudioMixer* mAudioMixer;
517 AudioStreamOut* mOutput;
518 int mOutputType;
519 uint32_t mSampleRate;
520 size_t mFrameCount;
521 int mChannelCount;
522 int mFormat;
523 int16_t* mMixBuffer;
524 float mMasterVolume;
525 bool mMasterMute;
526 nsecs_t mLastWriteTime;
527 int mNumWrites;
528 int mNumDelayedWrites;
529 bool mStandby;
530 bool mInWrite;
531 sp <OutputTrack> mOutputTrack;
532 };
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700533
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800534
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700535 friend class AudioBuffer;
536
537 class TrackHandle : public android::BnAudioTrack {
538 public:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800539 TrackHandle(const sp<MixerThread::Track>& track);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700540 virtual ~TrackHandle();
541 virtual status_t start();
542 virtual void stop();
543 virtual void flush();
544 virtual void mute(bool);
545 virtual void pause();
546 virtual void setVolume(float left, float right);
547 virtual sp<IMemory> getCblk() const;
548 virtual status_t onTransact(
549 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
550 private:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800551 sp<MixerThread::Track> mTrack;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700552 };
553
554 friend class Client;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800555 friend class MixerThread::Track;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700556
557
558 void removeClient(pid_t pid);
559
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700560
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700561
562 class RecordHandle : public android::BnAudioRecord {
563 public:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800564 RecordHandle(const sp<MixerThread::RecordTrack>& recordTrack);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700565 virtual ~RecordHandle();
566 virtual status_t start();
567 virtual void stop();
568 virtual sp<IMemory> getCblk() const;
569 virtual status_t onTransact(
570 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
571 private:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800572 sp<MixerThread::RecordTrack> mRecordTrack;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700573 };
574
575 // record thread
576 class AudioRecordThread : public Thread
577 {
578 public:
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800579 AudioRecordThread(AudioHardwareInterface* audioHardware);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700580 virtual ~AudioRecordThread();
581 virtual bool threadLoop();
582 virtual status_t readyToRun() { return NO_ERROR; }
583 virtual void onFirstRef() {}
584
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800585 status_t start(MixerThread::RecordTrack* recordTrack);
586 void stop(MixerThread::RecordTrack* recordTrack);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700587 void exit();
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700588
589 private:
590 AudioRecordThread();
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800591 AudioHardwareInterface *mAudioHardware;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800592 sp<MixerThread::RecordTrack> mRecordTrack;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700593 Mutex mLock;
594 Condition mWaitWorkCV;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700595 volatile bool mActive;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800596 status_t mStartStatus;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700597 };
598
599 friend class AudioRecordThread;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800600 friend class MixerThread;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700601
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800602 status_t startRecord(MixerThread::RecordTrack* recordTrack);
603 void stopRecord(MixerThread::RecordTrack* recordTrack);
604
605 void handleOutputSwitch();
The Android Open Source Projecta6938ba2009-02-10 15:44:00 -0800606
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700607 mutable Mutex mHardwareLock;
608 mutable Mutex mLock;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700609 DefaultKeyedVector< pid_t, wp<Client> > mClients;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700610
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800611 sp<MixerThread> mA2dpMixerThread;
612 sp<MixerThread> mHardwareMixerThread;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700613 AudioHardwareInterface* mAudioHardware;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800614 AudioHardwareInterface* mA2dpAudioInterface;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700615 sp<AudioRecordThread> mAudioRecordThread;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800616 bool mA2dpEnabled;
617 bool mA2dpEnabledReq;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700618 mutable int mHardwareStatus;
The Android Open Source Projecta6938ba2009-02-10 15:44:00 -0800619 SortedVector< wp<IBinder> > mNotificationClients;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800620 int mForcedSpeakerCount;
621 uint32_t mSavedRoute;
622 uint32_t mForcedRoute;
623 nsecs_t mRouteRestoreTime;
624 bool mMusicMuteSaved;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700625};
626
627// ----------------------------------------------------------------------------
628
629}; // namespace android
630
631#endif // ANDROID_AUDIO_FLINGER_H