blob: 77f064b23741641f193027713c06b98edb5db2a9 [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 Project0bb03402009-03-02 22:54:33 -0800226 // The upper 16 bits are used for track-specific flags.
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800227 };
228
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800229 TrackBase(const sp<MixerThread>& mixerThread,
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800230 const sp<Client>& client,
231 int streamType,
232 uint32_t sampleRate,
233 int format,
234 int channelCount,
235 int frameCount,
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800236 uint32_t flags,
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800237 const sp<IMemory>& sharedBuffer);
238 ~TrackBase();
239
240 virtual status_t start() = 0;
241 virtual void stop() = 0;
242 sp<IMemory> getCblk() const;
243
244 protected:
245 friend class MixerThread;
246 friend class RecordHandle;
247 friend class AudioRecordThread;
248
249 TrackBase(const TrackBase&);
250 TrackBase& operator = (const TrackBase&);
251
252 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
253 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
254
255 audio_track_cblk_t* cblk() const {
256 return mCblk;
257 }
258
259 int type() const {
260 return mStreamType;
261 }
262
263 int format() const {
264 return mFormat;
265 }
266
267 int channelCount() const ;
268
269 int sampleRate() const;
270
271 void* getBuffer(uint32_t offset, uint32_t frames) const;
272
273 int name() const {
274 return mName;
275 }
276
277 bool isStopped() const {
278 return mState == STOPPED;
279 }
280
281 bool isTerminated() const {
282 return mState == TERMINATED;
283 }
284
285 bool step();
286 void reset();
287
288 sp<MixerThread> mMixerThread;
289 sp<Client> mClient;
290 sp<IMemory> mCblkMemory;
291 audio_track_cblk_t* mCblk;
292 int mStreamType;
293 void* mBuffer;
294 void* mBufferEnd;
295 uint32_t mFrameCount;
296 int mName;
297 // we don't really need a lock for these
298 int mState;
299 int mClientTid;
300 uint8_t mFormat;
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800301 uint32_t mFlags;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700302 };
303
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800304 // playback track
305 class Track : public TrackBase {
306 public:
307 Track( const sp<MixerThread>& mixerThread,
308 const sp<Client>& client,
309 int streamType,
310 uint32_t sampleRate,
311 int format,
312 int channelCount,
313 int frameCount,
314 const sp<IMemory>& sharedBuffer);
315 ~Track();
316
317 void dump(char* buffer, size_t size);
318 virtual status_t start();
319 virtual void stop();
320 void pause();
321
322 void flush();
323 void destroy();
324 void mute(bool);
325 void setVolume(float left, float right);
326
327 protected:
328 friend class MixerThread;
329 friend class AudioFlinger;
330 friend class AudioFlinger::TrackHandle;
331
332 Track(const Track&);
333 Track& operator = (const Track&);
334
335 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
336
337 bool isMuted() const {
338 return (mMute || mMixerThread->mStreamTypes[mStreamType].mute);
339 }
340
341 bool isPausing() const {
342 return mState == PAUSING;
343 }
344
345 bool isPaused() const {
346 return mState == PAUSED;
347 }
348
349 bool isReady() const;
350
351 void setPaused() { mState = PAUSED; }
352 void reset();
353
354 // we don't really need a lock for these
355 float mVolume[2];
356 volatile bool mMute;
357 // FILLED state is used for suppressing volume ramp at begin of playing
358 enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
359 mutable uint8_t mFillingUpStatus;
360 int8_t mRetryCount;
361 sp<IMemory> mSharedBuffer;
362 bool mResetDone;
363 }; // end of Track
364
365 // record track
366 class RecordTrack : public TrackBase {
367 public:
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800368 RecordTrack(const sp<MixerThread>& mixerThread,
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800369 const sp<Client>& client,
370 int streamType,
371 uint32_t sampleRate,
372 int format,
373 int channelCount,
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800374 int frameCount,
375 uint32_t flags);
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800376 ~RecordTrack();
377
378 virtual status_t start();
379 virtual void stop();
380
381 bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
382 bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
383
384 private:
385 friend class AudioFlinger;
386 friend class AudioFlinger::RecordHandle;
387 friend class AudioFlinger::AudioRecordThread;
388 friend class MixerThread;
389
390 RecordTrack(const Track&);
391 RecordTrack& operator = (const Track&);
392
393 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
394
395 bool mOverflow;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700396 };
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800397
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800398 // playback track
399 class OutputTrack : public Track {
400 public:
401
402 class Buffer: public AudioBufferProvider::Buffer {
403 public:
404 int16_t *mBuffer;
405 };
406
407 OutputTrack( const sp<MixerThread>& mixerThread,
408 uint32_t sampleRate,
409 int format,
410 int channelCount,
411 int frameCount);
412 ~OutputTrack();
413
414 virtual status_t start();
415 virtual void stop();
416 void write(int16_t* data, uint32_t frames);
417 bool bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
418
419 private:
420
421 status_t obtainBuffer(AudioBufferProvider::Buffer* buffer);
422 void clearBufferQueue();
423
424 sp<MixerThread> mOutputMixerThread;
425 Vector < Buffer* > mBufferQueue;
426 AudioBufferProvider::Buffer mOutBuffer;
427 uint32_t mFramesWritten;
428
429 }; // end of OutputTrack
430
431 MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int outputType);
432 virtual ~MixerThread();
433
434 virtual status_t dump(int fd, const Vector<String16>& args);
435
436 // Thread virtuals
437 virtual bool threadLoop();
438 virtual status_t readyToRun();
439 virtual void onFirstRef();
440
441 virtual uint32_t sampleRate() const;
442 virtual int channelCount() const;
443 virtual int format() const;
444 virtual size_t frameCount() const;
445 virtual uint32_t latency() const;
446
447 virtual status_t setMasterVolume(float value);
448 virtual status_t setMasterMute(bool muted);
449
450 virtual float masterVolume() const;
451 virtual bool masterMute() const;
452
453 virtual status_t setStreamVolume(int stream, float value);
454 virtual status_t setStreamMute(int stream, bool muted);
455
456 virtual float streamVolume(int stream) const;
457 virtual bool streamMute(int stream) const;
458
459 bool isMusicActive() const;
460
461
462 sp<Track> createTrack(
463 const sp<AudioFlinger::Client>& client,
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700464 int streamType,
465 uint32_t sampleRate,
466 int format,
467 int channelCount,
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800468 int frameCount,
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800469 const sp<IMemory>& sharedBuffer,
470 status_t *status);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700471
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800472 void wakeUp() { mWaitWorkCV.broadcast(); }
473
474 void getTracks(SortedVector < sp<Track> >& tracks,
475 SortedVector < wp<Track> >& activeTracks);
476 void putTracks(SortedVector < sp<Track> >& tracks,
477 SortedVector < wp<Track> >& activeTracks);
478 void setOuputTrack(OutputTrack *track) { mOutputTrack = track; }
479
480 struct stream_type_t {
481 stream_type_t()
482 : volume(1.0f),
483 mute(false)
484 {
485 }
486 float volume;
487 bool mute;
488 };
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700489
490 private:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800491
492
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700493 friend class AudioFlinger;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800494 friend class Track;
495 friend class TrackBase;
496 friend class RecordTrack;
497
498 MixerThread(const Client&);
499 MixerThread& operator = (const MixerThread&);
500
501 status_t addTrack(const sp<Track>& track);
502 void removeTrack(wp<Track> track, int name);
503 void remove_track_l(wp<Track> track, int name);
504 void destroyTrack(const sp<Track>& track);
505 int getTrackName();
506 void deleteTrackName(int name);
507 void addActiveTrack(const wp<Track>& t);
508 void removeActiveTrack(const wp<Track>& t);
509 size_t getOutputFrameCount();
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700510
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800511 status_t dumpInternals(int fd, const Vector<String16>& args);
512 status_t dumpTracks(int fd, const Vector<String16>& args);
513
514 sp<AudioFlinger> mAudioFlinger;
515 mutable Mutex mLock;
516 mutable Condition mWaitWorkCV;
517 SortedVector< wp<Track> > mActiveTracks;
518 SortedVector< sp<Track> > mTracks;
519 stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
520 AudioMixer* mAudioMixer;
521 AudioStreamOut* mOutput;
522 int mOutputType;
523 uint32_t mSampleRate;
524 size_t mFrameCount;
525 int mChannelCount;
526 int mFormat;
527 int16_t* mMixBuffer;
528 float mMasterVolume;
529 bool mMasterMute;
530 nsecs_t mLastWriteTime;
531 int mNumWrites;
532 int mNumDelayedWrites;
533 bool mStandby;
534 bool mInWrite;
535 sp <OutputTrack> mOutputTrack;
536 };
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700537
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800538
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700539 friend class AudioBuffer;
540
541 class TrackHandle : public android::BnAudioTrack {
542 public:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800543 TrackHandle(const sp<MixerThread::Track>& track);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700544 virtual ~TrackHandle();
545 virtual status_t start();
546 virtual void stop();
547 virtual void flush();
548 virtual void mute(bool);
549 virtual void pause();
550 virtual void setVolume(float left, float right);
551 virtual sp<IMemory> getCblk() const;
552 virtual status_t onTransact(
553 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
554 private:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800555 sp<MixerThread::Track> mTrack;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700556 };
557
558 friend class Client;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800559 friend class MixerThread::Track;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700560
561
562 void removeClient(pid_t pid);
563
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700564
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700565
566 class RecordHandle : public android::BnAudioRecord {
567 public:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800568 RecordHandle(const sp<MixerThread::RecordTrack>& recordTrack);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700569 virtual ~RecordHandle();
570 virtual status_t start();
571 virtual void stop();
572 virtual sp<IMemory> getCblk() const;
573 virtual status_t onTransact(
574 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
575 private:
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800576 sp<MixerThread::RecordTrack> mRecordTrack;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700577 };
578
579 // record thread
580 class AudioRecordThread : public Thread
581 {
582 public:
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800583 AudioRecordThread(AudioHardwareInterface* audioHardware);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700584 virtual ~AudioRecordThread();
585 virtual bool threadLoop();
586 virtual status_t readyToRun() { return NO_ERROR; }
587 virtual void onFirstRef() {}
588
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800589 status_t start(MixerThread::RecordTrack* recordTrack);
590 void stop(MixerThread::RecordTrack* recordTrack);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700591 void exit();
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800592 status_t dump(int fd, const Vector<String16>& args);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700593
594 private:
595 AudioRecordThread();
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800596 AudioHardwareInterface *mAudioHardware;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800597 sp<MixerThread::RecordTrack> mRecordTrack;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700598 Mutex mLock;
599 Condition mWaitWorkCV;
The Android Open Source Projectd2bd26d2009-02-19 10:57:31 -0800600 Condition mStopped;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700601 volatile bool mActive;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800602 status_t mStartStatus;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700603 };
604
605 friend class AudioRecordThread;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800606 friend class MixerThread;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700607
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800608 status_t startRecord(MixerThread::RecordTrack* recordTrack);
609 void stopRecord(MixerThread::RecordTrack* recordTrack);
610
611 void handleOutputSwitch();
The Android Open Source Projecta6938ba2009-02-10 15:44:00 -0800612
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700613 mutable Mutex mHardwareLock;
614 mutable Mutex mLock;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700615 DefaultKeyedVector< pid_t, wp<Client> > mClients;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700616
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800617 sp<MixerThread> mA2dpMixerThread;
618 sp<MixerThread> mHardwareMixerThread;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700619 AudioHardwareInterface* mAudioHardware;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800620 AudioHardwareInterface* mA2dpAudioInterface;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700621 sp<AudioRecordThread> mAudioRecordThread;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800622 bool mA2dpEnabled;
623 bool mA2dpEnabledReq;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700624 mutable int mHardwareStatus;
The Android Open Source Projecta6938ba2009-02-10 15:44:00 -0800625 SortedVector< wp<IBinder> > mNotificationClients;
The Android Open Source Projectac65e0b2009-02-13 12:57:50 -0800626 int mForcedSpeakerCount;
627 uint32_t mSavedRoute;
628 uint32_t mForcedRoute;
629 nsecs_t mRouteRestoreTime;
630 bool mMusicMuteSaved;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700631};
632
633// ----------------------------------------------------------------------------
634
635}; // namespace android
636
637#endif // ANDROID_AUDIO_FLINGER_H