blob: 7d7874979f4a61b4ee885d8471a874f9f0768d4d [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>
23
24#include <media/IAudioFlinger.h>
25#include <media/IAudioFlingerClient.h>
26#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>
Mathias Agopian07952722009-05-19 19:08:10 -070033#include <binder/MemoryDealer.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080034#include <utils/SortedVector.h>
35#include <utils/Vector.h>
36
37#include <hardware_legacy/AudioHardwareInterface.h>
38
39#include "AudioBufferProvider.h"
40
41namespace android {
42
43class audio_track_cblk_t;
44class AudioMixer;
45class AudioBuffer;
Eric Laurenta553c252009-07-17 12:17:14 -070046class AudioResampler;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080047
48
49// ----------------------------------------------------------------------------
50
51#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true ))
52#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false ))
53
54
55// ----------------------------------------------------------------------------
56
57static const nsecs_t kStandbyTimeInNsecs = seconds(3);
58
Eric Laurenta553c252009-07-17 12:17:14 -070059class AudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080060{
61public:
62 static void instantiate();
63
64 virtual status_t dump(int fd, const Vector<String16>& args);
65
66 // IAudioFlinger interface
67 virtual sp<IAudioTrack> createTrack(
68 pid_t pid,
69 int streamType,
70 uint32_t sampleRate,
71 int format,
72 int channelCount,
73 int frameCount,
74 uint32_t flags,
75 const sp<IMemory>& sharedBuffer,
Eric Laurenta553c252009-07-17 12:17:14 -070076 void *output,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080077 status_t *status);
78
Eric Laurenta553c252009-07-17 12:17:14 -070079 virtual uint32_t sampleRate(void *output) const;
80 virtual int channelCount(void *output) const;
81 virtual int format(void *output) const;
82 virtual size_t frameCount(void *output) const;
83 virtual uint32_t latency(void *output) const;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080084
85 virtual status_t setMasterVolume(float value);
86 virtual status_t setMasterMute(bool muted);
87
88 virtual float masterVolume() const;
89 virtual bool masterMute() const;
90
Eric Laurenta553c252009-07-17 12:17:14 -070091 virtual status_t setStreamVolume(int stream, float value, void *output);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080092 virtual status_t setStreamMute(int stream, bool muted);
93
Eric Laurenta553c252009-07-17 12:17:14 -070094 virtual float streamVolume(int stream, void *output) const;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080095 virtual bool streamMute(int stream) const;
96
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080097 virtual status_t setMode(int mode);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080098
99 virtual status_t setMicMute(bool state);
100 virtual bool getMicMute() const;
101
102 virtual bool isMusicActive() const;
103
Eric Laurenta553c252009-07-17 12:17:14 -0700104 virtual status_t setParameters(void *ioHandle, const String8& keyValuePairs);
105 virtual String8 getParameters(void *ioHandle, const String8& keys);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800106
107 virtual void registerClient(const sp<IAudioFlingerClient>& client);
Eric Laurenta553c252009-07-17 12:17:14 -0700108
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800109 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount);
Eric Laurenta553c252009-07-17 12:17:14 -0700110
111 virtual void *openOutput(uint32_t *pDevices,
112 uint32_t *pSamplingRate,
113 uint32_t *pFormat,
114 uint32_t *pChannels,
115 uint32_t *pLatencyMs,
116 uint32_t flags);
117
118 virtual void *openDuplicateOutput(void *output1, void *output2);
119
120 virtual status_t closeOutput(void *output);
121
122 virtual status_t suspendOutput(void *output);
123
124 virtual status_t restoreOutput(void *output);
125
126 virtual void *openInput(uint32_t *pDevices,
127 uint32_t *pSamplingRate,
128 uint32_t *pFormat,
129 uint32_t *pChannels,
130 uint32_t acoustics);
131
132 virtual status_t closeInput(void *input);
133
134 virtual status_t setStreamOutput(uint32_t stream, void *output);
135
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800136 // IBinder::DeathRecipient
137 virtual void binderDied(const wp<IBinder>& who);
138
139 enum hardware_call_state {
140 AUDIO_HW_IDLE = 0,
141 AUDIO_HW_INIT,
142 AUDIO_HW_OUTPUT_OPEN,
143 AUDIO_HW_OUTPUT_CLOSE,
144 AUDIO_HW_INPUT_OPEN,
145 AUDIO_HW_INPUT_CLOSE,
146 AUDIO_HW_STANDBY,
147 AUDIO_HW_SET_MASTER_VOLUME,
148 AUDIO_HW_GET_ROUTING,
149 AUDIO_HW_SET_ROUTING,
150 AUDIO_HW_GET_MODE,
151 AUDIO_HW_SET_MODE,
152 AUDIO_HW_GET_MIC_MUTE,
153 AUDIO_HW_SET_MIC_MUTE,
154 AUDIO_SET_VOICE_VOLUME,
155 AUDIO_SET_PARAMETER,
156 };
157
158 // record interface
159 virtual sp<IAudioRecord> openRecord(
160 pid_t pid,
Eric Laurenta553c252009-07-17 12:17:14 -0700161 void *input,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800162 uint32_t sampleRate,
163 int format,
164 int channelCount,
165 int frameCount,
166 uint32_t flags,
167 status_t *status);
168
169 virtual status_t onTransact(
170 uint32_t code,
171 const Parcel& data,
172 Parcel* reply,
173 uint32_t flags);
174
Eric Laurenta553c252009-07-17 12:17:14 -0700175 void audioConfigChanged(int event, void *param1, void *param2);
176
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800177private:
178 AudioFlinger();
179 virtual ~AudioFlinger();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800180
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800181
182 // Internal dump utilites.
183 status_t dumpPermissionDenial(int fd, const Vector<String16>& args);
184 status_t dumpClients(int fd, const Vector<String16>& args);
185 status_t dumpInternals(int fd, const Vector<String16>& args);
186
187 // --- Client ---
188 class Client : public RefBase {
189 public:
190 Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
191 virtual ~Client();
192 const sp<MemoryDealer>& heap() const;
193 pid_t pid() const { return mPid; }
194 private:
195 Client(const Client&);
196 Client& operator = (const Client&);
197 sp<AudioFlinger> mAudioFlinger;
198 sp<MemoryDealer> mMemoryDealer;
199 pid_t mPid;
200 };
201
202
203 class TrackHandle;
204 class RecordHandle;
Eric Laurenta553c252009-07-17 12:17:14 -0700205 class RecordThread;
206 class PlaybackThread;
207 class MixerThread;
208 class DirectOutputThread;
209 class Track;
210 class RecordTrack;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800211
Eric Laurenta553c252009-07-17 12:17:14 -0700212 class ThreadBase : public Thread {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800213 public:
Eric Laurenta553c252009-07-17 12:17:14 -0700214 ThreadBase (const sp<AudioFlinger>& audioFlinger);
215 virtual ~ThreadBase();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800216
217 // base for record and playback
218 class TrackBase : public AudioBufferProvider, public RefBase {
219
220 public:
221 enum track_state {
222 IDLE,
223 TERMINATED,
224 STOPPED,
225 RESUMING,
226 ACTIVE,
227 PAUSING,
228 PAUSED
229 };
230
231 enum track_flags {
232 STEPSERVER_FAILED = 0x01, // StepServer could not acquire cblk->lock mutex
233 SYSTEM_FLAGS_MASK = 0x0000ffffUL,
234 // The upper 16 bits are used for track-specific flags.
235 };
236
Eric Laurenta553c252009-07-17 12:17:14 -0700237 TrackBase(const wp<ThreadBase>& thread,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800238 const sp<Client>& client,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800239 uint32_t sampleRate,
240 int format,
241 int channelCount,
242 int frameCount,
243 uint32_t flags,
244 const sp<IMemory>& sharedBuffer);
245 ~TrackBase();
246
247 virtual status_t start() = 0;
248 virtual void stop() = 0;
249 sp<IMemory> getCblk() const;
250
251 protected:
Eric Laurenta553c252009-07-17 12:17:14 -0700252 friend class ThreadBase;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800253 friend class RecordHandle;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800254
255 TrackBase(const TrackBase&);
256 TrackBase& operator = (const TrackBase&);
257
258 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
259 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
260
261 audio_track_cblk_t* cblk() const {
262 return mCblk;
263 }
264
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800265 int format() const {
266 return mFormat;
267 }
268
269 int channelCount() const ;
270
271 int sampleRate() const;
272
273 void* getBuffer(uint32_t offset, uint32_t frames) const;
274
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800275 bool isStopped() const {
276 return mState == STOPPED;
277 }
278
279 bool isTerminated() const {
280 return mState == TERMINATED;
281 }
282
283 bool step();
284 void reset();
285
Eric Laurenta553c252009-07-17 12:17:14 -0700286 wp<ThreadBase> mThread;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800287 sp<Client> mClient;
288 sp<IMemory> mCblkMemory;
289 audio_track_cblk_t* mCblk;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800290 void* mBuffer;
291 void* mBufferEnd;
292 uint32_t mFrameCount;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800293 // we don't really need a lock for these
294 int mState;
295 int mClientTid;
296 uint8_t mFormat;
297 uint32_t mFlags;
298 };
299
Eric Laurenta553c252009-07-17 12:17:14 -0700300 class ConfigEvent {
301 public:
302 ConfigEvent() : mEvent(0), mParam(0) {}
303
304 int mEvent;
305 int mParam;
306 };
307
308 uint32_t sampleRate() const;
309 int channelCount() const;
310 int format() const;
311 size_t frameCount() const;
312 void wakeUp() { mWaitWorkCV.broadcast(); }
313 void exit();
314 virtual bool checkForNewParameters_l() = 0;
315 virtual status_t setParameters(const String8& keyValuePairs);
316 virtual String8 getParameters(const String8& keys) = 0;
317 virtual void audioConfigChanged(int event, int param = 0) = 0;
318 void sendConfigEvent(int event, int param = 0);
319 void processConfigEvents();
320
321 protected:
322
323 friend class Track;
324 friend class TrackBase;
325 friend class PlaybackThread;
326 friend class MixerThread;
327 friend class DirectOutputThread;
328 friend class DuplicatingThread;
329 friend class RecordThread;
330 friend class RecordTrack;
331
332 mutable Mutex mLock;
333 Condition mWaitWorkCV;
334 sp<AudioFlinger> mAudioFlinger;
335 uint32_t mSampleRate;
336 size_t mFrameCount;
337 int mChannelCount;
338 int mFormat;
339 uint32_t mFrameSize;
340 Condition mParamCond;
341 String8 mNewParameters;
342 status_t mParamStatus;
343 Vector<ConfigEvent *> mConfigEvents;
344 bool mStandby;
345 };
346
347 // --- PlaybackThread ---
348 class PlaybackThread : public ThreadBase {
349 public:
350
351 enum type {
352 MIXER,
353 DIRECT,
354 DUPLICATING
355 };
356
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800357 // playback track
358 class Track : public TrackBase {
359 public:
Eric Laurenta553c252009-07-17 12:17:14 -0700360 Track( const wp<ThreadBase>& thread,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800361 const sp<Client>& client,
362 int streamType,
363 uint32_t sampleRate,
364 int format,
365 int channelCount,
366 int frameCount,
367 const sp<IMemory>& sharedBuffer);
368 ~Track();
369
370 void dump(char* buffer, size_t size);
371 virtual status_t start();
372 virtual void stop();
373 void pause();
374
375 void flush();
376 void destroy();
377 void mute(bool);
378 void setVolume(float left, float right);
Eric Laurenta553c252009-07-17 12:17:14 -0700379 int name() const {
380 return mName;
381 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800382
Eric Laurent4bc035a2009-05-22 09:18:15 -0700383 int type() const {
384 return mStreamType;
385 }
386
387
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800388 protected:
Eric Laurenta553c252009-07-17 12:17:14 -0700389 friend class ThreadBase;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800390 friend class AudioFlinger;
391 friend class AudioFlinger::TrackHandle;
392
393 Track(const Track&);
394 Track& operator = (const Track&);
395
396 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
Eric Laurenta553c252009-07-17 12:17:14 -0700397 bool isMuted() { return mMute; }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800398 bool isPausing() const {
399 return mState == PAUSING;
400 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800401 bool isPaused() const {
402 return mState == PAUSED;
403 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800404 bool isReady() const;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800405 void setPaused() { mState = PAUSED; }
406 void reset();
407
408 // we don't really need a lock for these
409 float mVolume[2];
410 volatile bool mMute;
411 // FILLED state is used for suppressing volume ramp at begin of playing
412 enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
413 mutable uint8_t mFillingUpStatus;
414 int8_t mRetryCount;
415 sp<IMemory> mSharedBuffer;
416 bool mResetDone;
Eric Laurent4bc035a2009-05-22 09:18:15 -0700417 int mStreamType;
Eric Laurenta553c252009-07-17 12:17:14 -0700418 int mName;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800419 }; // end of Track
420
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800421
422 // playback track
423 class OutputTrack : public Track {
424 public:
Eric Laurenta553c252009-07-17 12:17:14 -0700425
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800426 class Buffer: public AudioBufferProvider::Buffer {
427 public:
428 int16_t *mBuffer;
429 };
Eric Laurenta553c252009-07-17 12:17:14 -0700430
431 OutputTrack( const wp<ThreadBase>& thread,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800432 uint32_t sampleRate,
433 int format,
434 int channelCount,
435 int frameCount);
436 ~OutputTrack();
437
438 virtual status_t start();
439 virtual void stop();
Eric Laurenta553c252009-07-17 12:17:14 -0700440 bool write(int16_t* data, uint32_t frames);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800441 bool bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
Eric Laurenta553c252009-07-17 12:17:14 -0700442 bool isActive() { return mActive; }
443 wp<ThreadBase>& thread() { return mThread; }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800444
445 private:
446
Eric Laurenta553c252009-07-17 12:17:14 -0700447 status_t obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800448 void clearBufferQueue();
Eric Laurenta553c252009-07-17 12:17:14 -0700449
450 // Maximum number of pending buffers allocated by OutputTrack::write()
451 static const uint8_t kMaxOverFlowBuffers = 3;
452
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800453 Vector < Buffer* > mBufferQueue;
454 AudioBufferProvider::Buffer mOutBuffer;
Eric Laurenta553c252009-07-17 12:17:14 -0700455 uint32_t mWaitTimeMs;
456 bool mActive;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800457
Eric Laurenta553c252009-07-17 12:17:14 -0700458 }; // end of OutputTrack
459
460 PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
461 virtual ~PlaybackThread();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800462
463 virtual status_t dump(int fd, const Vector<String16>& args);
464
465 // Thread virtuals
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800466 virtual status_t readyToRun();
467 virtual void onFirstRef();
468
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800469 virtual uint32_t latency() const;
470
471 virtual status_t setMasterVolume(float value);
472 virtual status_t setMasterMute(bool muted);
473
474 virtual float masterVolume() const;
475 virtual bool masterMute() const;
476
477 virtual status_t setStreamVolume(int stream, float value);
478 virtual status_t setStreamMute(int stream, bool muted);
479
480 virtual float streamVolume(int stream) const;
481 virtual bool streamMute(int stream) const;
482
Eric Laurenta553c252009-07-17 12:17:14 -0700483 bool isMusicActive() const;
484
The Android Open Source Projectb2a3dd82009-03-09 11:52:12 -0700485 sp<Track> createTrack_l(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800486 const sp<AudioFlinger::Client>& client,
487 int streamType,
488 uint32_t sampleRate,
489 int format,
490 int channelCount,
491 int frameCount,
492 const sp<IMemory>& sharedBuffer,
493 status_t *status);
Eric Laurenta553c252009-07-17 12:17:14 -0700494
495 AudioStreamOut* getOutput() { return mOutput; }
496
497 virtual int type() const { return mType; }
498 void suspend() { mSuspended = true; }
499 void restore() { mSuspended = false; }
500 virtual String8 getParameters(const String8& keys);
501 virtual void audioConfigChanged(int event, int param = 0);
502
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800503 struct stream_type_t {
504 stream_type_t()
505 : volume(1.0f),
506 mute(false)
507 {
508 }
509 float volume;
510 bool mute;
511 };
512
513 private:
514
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800515 friend class AudioFlinger;
516 friend class Track;
517 friend class TrackBase;
Eric Laurenta553c252009-07-17 12:17:14 -0700518 friend class MixerThread;
519 friend class DirectOutputThread;
520 friend class DuplicatingThread;
521
522 PlaybackThread(const Client&);
523 PlaybackThread& operator = (const PlaybackThread&);
524
The Android Open Source Projectb2a3dd82009-03-09 11:52:12 -0700525 status_t addTrack_l(const sp<Track>& track);
The Android Open Source Projectb2a3dd82009-03-09 11:52:12 -0700526 void destroyTrack_l(const sp<Track>& track);
Eric Laurenta553c252009-07-17 12:17:14 -0700527 virtual int getTrackName_l() = 0;
528 virtual void deleteTrackName_l(int name) = 0;
529 void readOutputParameters();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800530
Eric Laurenta553c252009-07-17 12:17:14 -0700531 virtual status_t dumpInternals(int fd, const Vector<String16>& args);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800532 status_t dumpTracks(int fd, const Vector<String16>& args);
Eric Laurenta553c252009-07-17 12:17:14 -0700533
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800534 SortedVector< wp<Track> > mActiveTracks;
535 SortedVector< sp<Track> > mTracks;
Eric Laurenta553c252009-07-17 12:17:14 -0700536 // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread
537 stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800538 AudioStreamOut* mOutput;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800539 float mMasterVolume;
540 bool mMasterMute;
541 nsecs_t mLastWriteTime;
542 int mNumWrites;
543 int mNumDelayedWrites;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800544 bool mInWrite;
Eric Laurenta553c252009-07-17 12:17:14 -0700545 int16_t* mMixBuffer;
546 bool mSuspended;
547 int mType;
548 int mBytesWritten;
549 int mMinBytesToWrite;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800550 };
551
Eric Laurenta553c252009-07-17 12:17:14 -0700552 class MixerThread : public PlaybackThread {
553 public:
554 MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
555 virtual ~MixerThread();
556
557 // Thread virtuals
558 virtual bool threadLoop();
559
560 void getTracks(SortedVector < sp<Track> >& tracks,
561 SortedVector < wp<Track> >& activeTracks,
562 int streamType);
563 void putTracks(SortedVector < sp<Track> >& tracks,
564 SortedVector < wp<Track> >& activeTracks);
565 virtual int getTrackName_l();
566 virtual void deleteTrackName_l(int name);
567 virtual bool checkForNewParameters_l();
568 virtual status_t dumpInternals(int fd, const Vector<String16>& args);
569
570 protected:
571 size_t prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove);
572
573 AudioMixer* mAudioMixer;
574 };
575
576 class DirectOutputThread : public PlaybackThread {
577 public:
578
579 DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
580 ~DirectOutputThread();
581
582 // Thread virtuals
583 virtual bool threadLoop();
584
585 virtual int getTrackName_l();
586 virtual void deleteTrackName_l(int name);
587 virtual bool checkForNewParameters_l();
588
589 private:
590 float mLeftVolume;
591 float mRightVolume;
592 };
593
594 class DuplicatingThread : public MixerThread {
595 public:
596 DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread);
597 ~DuplicatingThread();
598
599 // Thread virtuals
600 virtual bool threadLoop();
601 void addOutputTrack(MixerThread* thread);
602 void removeOutputTrack(MixerThread* thread);
603
604 private:
605 SortedVector < sp<OutputTrack> > mOutputTracks;
606 };
607
608 PlaybackThread *checkPlaybackThread_l(void *output) const;
609 MixerThread *checkMixerThread_l(void *output) const;
610 RecordThread *checkRecordThread_l(void *input) const;
611 float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; }
612
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800613 friend class AudioBuffer;
614
615 class TrackHandle : public android::BnAudioTrack {
616 public:
Eric Laurenta553c252009-07-17 12:17:14 -0700617 TrackHandle(const sp<PlaybackThread::Track>& track);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800618 virtual ~TrackHandle();
619 virtual status_t start();
620 virtual void stop();
621 virtual void flush();
622 virtual void mute(bool);
623 virtual void pause();
624 virtual void setVolume(float left, float right);
625 virtual sp<IMemory> getCblk() const;
626 virtual status_t onTransact(
627 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
628 private:
Eric Laurenta553c252009-07-17 12:17:14 -0700629 sp<PlaybackThread::Track> mTrack;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800630 };
631
632 friend class Client;
Eric Laurenta553c252009-07-17 12:17:14 -0700633 friend class PlaybackThread::Track;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800634
635
636 void removeClient(pid_t pid);
637
638
Eric Laurenta553c252009-07-17 12:17:14 -0700639 // record thread
640 class RecordThread : public ThreadBase, public AudioBufferProvider
641 {
642 public:
643
644 // record track
645 class RecordTrack : public TrackBase {
646 public:
647 RecordTrack(const wp<ThreadBase>& thread,
648 const sp<Client>& client,
649 uint32_t sampleRate,
650 int format,
651 int channelCount,
652 int frameCount,
653 uint32_t flags);
654 ~RecordTrack();
655
656 virtual status_t start();
657 virtual void stop();
658
659 bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
660 bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
661
662 private:
663 friend class AudioFlinger;
664
665 RecordTrack(const RecordTrack&);
666 RecordTrack& operator = (const RecordTrack&);
667
668 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
669
670 bool mOverflow;
671 };
672
673
674 RecordThread(const sp<AudioFlinger>& audioFlinger,
675 AudioStreamIn *input,
676 uint32_t sampleRate,
677 uint32_t channels);
678 ~RecordThread();
679
680 virtual bool threadLoop();
681 virtual status_t readyToRun() { return NO_ERROR; }
682 virtual void onFirstRef();
683
684 status_t start(RecordTrack* recordTrack);
685 void stop(RecordTrack* recordTrack);
686 status_t dump(int fd, const Vector<String16>& args);
687 AudioStreamIn* getInput() { return mInput; }
688
689 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
690 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
691 virtual bool checkForNewParameters_l();
692 virtual String8 getParameters(const String8& keys);
693 virtual void audioConfigChanged(int event, int param = 0);
694 void readInputParameters();
695
696 private:
697 RecordThread();
698 AudioStreamIn *mInput;
699 sp<RecordTrack> mActiveTrack;
700 Condition mStartStopCond;
701 AudioResampler *mResampler;
702 int32_t *mRsmpOutBuffer;
703 int16_t *mRsmpInBuffer;
704 size_t mRsmpInIndex;
705 size_t mInputBytes;
706 int mReqChannelCount;
707 uint32_t mReqSampleRate;
708 };
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800709
710 class RecordHandle : public android::BnAudioRecord {
711 public:
Eric Laurenta553c252009-07-17 12:17:14 -0700712 RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800713 virtual ~RecordHandle();
714 virtual status_t start();
715 virtual void stop();
716 virtual sp<IMemory> getCblk() const;
717 virtual status_t onTransact(
718 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
719 private:
Eric Laurenta553c252009-07-17 12:17:14 -0700720 sp<RecordThread::RecordTrack> mRecordTrack;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800721 };
722
Eric Laurenta553c252009-07-17 12:17:14 -0700723 friend class RecordThread;
724 friend class PlaybackThread;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800725
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800726
The Android Open Source Projectb2a3dd82009-03-09 11:52:12 -0700727 mutable Mutex mLock;
The Android Open Source Projectb2a3dd82009-03-09 11:52:12 -0700728
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800729 DefaultKeyedVector< pid_t, wp<Client> > mClients;
730
Eric Laurenta553c252009-07-17 12:17:14 -0700731 mutable Mutex mHardwareLock;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800732 AudioHardwareInterface* mAudioHardware;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800733 mutable int mHardwareStatus;
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700734
Eric Laurenta553c252009-07-17 12:17:14 -0700735
736 SortedVector< sp<PlaybackThread> > mPlaybackThreads;
737 PlaybackThread::stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
738 float mMasterVolume;
739 bool mMasterMute;
740
741 SortedVector< sp<RecordThread> > mRecordThreads;
742
743 SortedVector< sp<IBinder> > mNotificationClients;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800744};
745
746// ----------------------------------------------------------------------------
747
748}; // namespace android
749
750#endif // ANDROID_AUDIO_FLINGER_H