blob: 7a6641f9f78df698974a9729929b2f351f10341e [file] [log] [blame]
The Android Open Source Projectedbf3b62009-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 Agopianc5b2c0b2009-05-19 19:08:10 -070033#include <binder/MemoryDealer.h>
The Android Open Source Projectedbf3b62009-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 Laurent9d91ad52009-07-17 12:17:14 -070046class AudioResampler;
The Android Open Source Projectedbf3b62009-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 Laurent9d91ad52009-07-17 12:17:14 -070059class AudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient
The Android Open Source Projectedbf3b62009-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 Laurente0e9ecc2009-07-28 08:44:33 -070076 int output,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080077 status_t *status);
78
Eric Laurente0e9ecc2009-07-28 08:44:33 -070079 virtual uint32_t sampleRate(int output) const;
80 virtual int channelCount(int output) const;
81 virtual int format(int output) const;
82 virtual size_t frameCount(int output) const;
83 virtual uint32_t latency(int output) const;
The Android Open Source Projectedbf3b62009-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 Laurente0e9ecc2009-07-28 08:44:33 -070091 virtual status_t setStreamVolume(int stream, float value, int output);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080092 virtual status_t setStreamMute(int stream, bool muted);
93
Eric Laurente0e9ecc2009-07-28 08:44:33 -070094 virtual float streamVolume(int stream, int output) const;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080095 virtual bool streamMute(int stream) const;
96
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080097 virtual status_t setMode(int mode);
The Android Open Source Projectedbf3b62009-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 Laurente0e9ecc2009-07-28 08:44:33 -0700104 virtual status_t setParameters(int ioHandle, const String8& keyValuePairs);
105 virtual String8 getParameters(int ioHandle, const String8& keys);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800106
107 virtual void registerClient(const sp<IAudioFlingerClient>& client);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700108
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800109 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700110
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700111 virtual int openOutput(uint32_t *pDevices,
Eric Laurent9d91ad52009-07-17 12:17:14 -0700112 uint32_t *pSamplingRate,
113 uint32_t *pFormat,
114 uint32_t *pChannels,
115 uint32_t *pLatencyMs,
116 uint32_t flags);
117
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700118 virtual int openDuplicateOutput(int output1, int output2);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700119
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700120 virtual status_t closeOutput(int output);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700121
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700122 virtual status_t suspendOutput(int output);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700123
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700124 virtual status_t restoreOutput(int output);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700125
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700126 virtual int openInput(uint32_t *pDevices,
Eric Laurent9d91ad52009-07-17 12:17:14 -0700127 uint32_t *pSamplingRate,
128 uint32_t *pFormat,
129 uint32_t *pChannels,
130 uint32_t acoustics);
131
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700132 virtual status_t closeInput(int input);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700133
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700134 virtual status_t setStreamOutput(uint32_t stream, int output);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700135
The Android Open Source Projectedbf3b62009-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 Laurente0e9ecc2009-07-28 08:44:33 -0700161 int input,
The Android Open Source Projectedbf3b62009-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
175private:
176 AudioFlinger();
177 virtual ~AudioFlinger();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800178
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800179
180 // Internal dump utilites.
181 status_t dumpPermissionDenial(int fd, const Vector<String16>& args);
182 status_t dumpClients(int fd, const Vector<String16>& args);
183 status_t dumpInternals(int fd, const Vector<String16>& args);
184
185 // --- Client ---
186 class Client : public RefBase {
187 public:
188 Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
189 virtual ~Client();
190 const sp<MemoryDealer>& heap() const;
191 pid_t pid() const { return mPid; }
192 private:
193 Client(const Client&);
194 Client& operator = (const Client&);
195 sp<AudioFlinger> mAudioFlinger;
196 sp<MemoryDealer> mMemoryDealer;
197 pid_t mPid;
198 };
199
200
201 class TrackHandle;
202 class RecordHandle;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700203 class RecordThread;
204 class PlaybackThread;
205 class MixerThread;
206 class DirectOutputThread;
207 class Track;
208 class RecordTrack;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800209
Eric Laurent9d91ad52009-07-17 12:17:14 -0700210 class ThreadBase : public Thread {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800211 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700212 ThreadBase (const sp<AudioFlinger>& audioFlinger);
213 virtual ~ThreadBase();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800214
215 // base for record and playback
216 class TrackBase : public AudioBufferProvider, public RefBase {
217
218 public:
219 enum track_state {
220 IDLE,
221 TERMINATED,
222 STOPPED,
223 RESUMING,
224 ACTIVE,
225 PAUSING,
226 PAUSED
227 };
228
229 enum track_flags {
230 STEPSERVER_FAILED = 0x01, // StepServer could not acquire cblk->lock mutex
231 SYSTEM_FLAGS_MASK = 0x0000ffffUL,
232 // The upper 16 bits are used for track-specific flags.
233 };
234
Eric Laurent9d91ad52009-07-17 12:17:14 -0700235 TrackBase(const wp<ThreadBase>& thread,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800236 const sp<Client>& client,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800237 uint32_t sampleRate,
238 int format,
239 int channelCount,
240 int frameCount,
241 uint32_t flags,
242 const sp<IMemory>& sharedBuffer);
243 ~TrackBase();
244
245 virtual status_t start() = 0;
246 virtual void stop() = 0;
247 sp<IMemory> getCblk() const;
Eric Laurentf5aba822009-08-10 23:22:32 -0700248 audio_track_cblk_t* cblk() const { return mCblk; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800249
250 protected:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700251 friend class ThreadBase;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800252 friend class RecordHandle;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700253 friend class PlaybackThread;
254 friend class RecordThread;
255 friend class MixerThread;
256 friend class DirectOutputThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800257
258 TrackBase(const TrackBase&);
259 TrackBase& operator = (const TrackBase&);
260
261 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
262 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
263
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800264 int format() const {
265 return mFormat;
266 }
267
268 int channelCount() const ;
269
270 int sampleRate() const;
271
272 void* getBuffer(uint32_t offset, uint32_t frames) const;
273
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800274 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
Eric Laurent9d91ad52009-07-17 12:17:14 -0700285 wp<ThreadBase> mThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800286 sp<Client> mClient;
287 sp<IMemory> mCblkMemory;
288 audio_track_cblk_t* mCblk;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800289 void* mBuffer;
290 void* mBufferEnd;
291 uint32_t mFrameCount;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800292 // we don't really need a lock for these
293 int mState;
294 int mClientTid;
295 uint8_t mFormat;
296 uint32_t mFlags;
297 };
298
Eric Laurent9d91ad52009-07-17 12:17:14 -0700299 class ConfigEvent {
300 public:
301 ConfigEvent() : mEvent(0), mParam(0) {}
302
303 int mEvent;
304 int mParam;
305 };
306
307 uint32_t sampleRate() const;
308 int channelCount() const;
309 int format() const;
310 size_t frameCount() const;
311 void wakeUp() { mWaitWorkCV.broadcast(); }
312 void exit();
313 virtual bool checkForNewParameters_l() = 0;
314 virtual status_t setParameters(const String8& keyValuePairs);
315 virtual String8 getParameters(const String8& keys) = 0;
316 virtual void audioConfigChanged(int event, int param = 0) = 0;
317 void sendConfigEvent(int event, int param = 0);
Eric Laurent3464c012009-08-04 09:45:33 -0700318 void sendConfigEvent_l(int event, int param = 0);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700319 void processConfigEvents();
320
Eric Laurent9395d9b2009-07-23 13:17:39 -0700321 mutable Mutex mLock;
322
Eric Laurent9d91ad52009-07-17 12:17:14 -0700323 protected:
324
325 friend class Track;
326 friend class TrackBase;
327 friend class PlaybackThread;
328 friend class MixerThread;
329 friend class DirectOutputThread;
330 friend class DuplicatingThread;
331 friend class RecordThread;
332 friend class RecordTrack;
333
Eric Laurent9d91ad52009-07-17 12:17:14 -0700334 Condition mWaitWorkCV;
335 sp<AudioFlinger> mAudioFlinger;
336 uint32_t mSampleRate;
337 size_t mFrameCount;
338 int mChannelCount;
339 int mFormat;
340 uint32_t mFrameSize;
341 Condition mParamCond;
Eric Laurent3464c012009-08-04 09:45:33 -0700342 Vector<String8> mNewParameters;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700343 status_t mParamStatus;
344 Vector<ConfigEvent *> mConfigEvents;
345 bool mStandby;
346 };
347
348 // --- PlaybackThread ---
349 class PlaybackThread : public ThreadBase {
350 public:
351
352 enum type {
353 MIXER,
354 DIRECT,
355 DUPLICATING
356 };
357
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800358 // playback track
359 class Track : public TrackBase {
360 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700361 Track( const wp<ThreadBase>& thread,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800362 const sp<Client>& client,
363 int streamType,
364 uint32_t sampleRate,
365 int format,
366 int channelCount,
367 int frameCount,
368 const sp<IMemory>& sharedBuffer);
369 ~Track();
370
371 void dump(char* buffer, size_t size);
372 virtual status_t start();
373 virtual void stop();
374 void pause();
375
376 void flush();
377 void destroy();
378 void mute(bool);
379 void setVolume(float left, float right);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700380 int name() const {
381 return mName;
382 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800383
Eric Laurent570dd0b2009-05-22 09:18:15 -0700384 int type() const {
385 return mStreamType;
386 }
387
388
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800389 protected:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700390 friend class ThreadBase;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800391 friend class AudioFlinger;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700392 friend class TrackHandle;
393 friend class PlaybackThread;
394 friend class MixerThread;
395 friend class DirectOutputThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800396
397 Track(const Track&);
398 Track& operator = (const Track&);
399
400 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700401 bool isMuted() { return mMute; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800402 bool isPausing() const {
403 return mState == PAUSING;
404 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800405 bool isPaused() const {
406 return mState == PAUSED;
407 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800408 bool isReady() const;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800409 void setPaused() { mState = PAUSED; }
410 void reset();
411
412 // we don't really need a lock for these
413 float mVolume[2];
414 volatile bool mMute;
415 // FILLED state is used for suppressing volume ramp at begin of playing
416 enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
417 mutable uint8_t mFillingUpStatus;
418 int8_t mRetryCount;
419 sp<IMemory> mSharedBuffer;
420 bool mResetDone;
Eric Laurent570dd0b2009-05-22 09:18:15 -0700421 int mStreamType;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700422 int mName;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800423 }; // end of Track
424
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800425
426 // playback track
427 class OutputTrack : public Track {
428 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700429
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800430 class Buffer: public AudioBufferProvider::Buffer {
431 public:
432 int16_t *mBuffer;
433 };
Eric Laurent9d91ad52009-07-17 12:17:14 -0700434
435 OutputTrack( const wp<ThreadBase>& thread,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800436 uint32_t sampleRate,
437 int format,
438 int channelCount,
439 int frameCount);
440 ~OutputTrack();
441
442 virtual status_t start();
443 virtual void stop();
Eric Laurent9d91ad52009-07-17 12:17:14 -0700444 bool write(int16_t* data, uint32_t frames);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800445 bool bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
Eric Laurent9d91ad52009-07-17 12:17:14 -0700446 bool isActive() { return mActive; }
447 wp<ThreadBase>& thread() { return mThread; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800448
449 private:
450
Eric Laurent9d91ad52009-07-17 12:17:14 -0700451 status_t obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800452 void clearBufferQueue();
Eric Laurent9d91ad52009-07-17 12:17:14 -0700453
454 // Maximum number of pending buffers allocated by OutputTrack::write()
455 static const uint8_t kMaxOverFlowBuffers = 3;
456
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800457 Vector < Buffer* > mBufferQueue;
458 AudioBufferProvider::Buffer mOutBuffer;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700459 uint32_t mWaitTimeMs;
460 bool mActive;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800461
Eric Laurent9d91ad52009-07-17 12:17:14 -0700462 }; // end of OutputTrack
463
464 PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
465 virtual ~PlaybackThread();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800466
467 virtual status_t dump(int fd, const Vector<String16>& args);
468
469 // Thread virtuals
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800470 virtual status_t readyToRun();
471 virtual void onFirstRef();
472
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800473 virtual uint32_t latency() const;
474
475 virtual status_t setMasterVolume(float value);
476 virtual status_t setMasterMute(bool muted);
477
478 virtual float masterVolume() const;
479 virtual bool masterMute() const;
480
481 virtual status_t setStreamVolume(int stream, float value);
482 virtual status_t setStreamMute(int stream, bool muted);
483
484 virtual float streamVolume(int stream) const;
485 virtual bool streamMute(int stream) const;
486
Eric Laurent9d91ad52009-07-17 12:17:14 -0700487 bool isMusicActive() const;
488
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700489 sp<Track> createTrack_l(
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800490 const sp<AudioFlinger::Client>& client,
491 int streamType,
492 uint32_t sampleRate,
493 int format,
494 int channelCount,
495 int frameCount,
496 const sp<IMemory>& sharedBuffer,
497 status_t *status);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700498
499 AudioStreamOut* getOutput() { return mOutput; }
500
501 virtual int type() const { return mType; }
Eric Laurentf9df2492009-08-06 08:49:39 -0700502 void suspend() { mSuspended++; }
503 void restore() { if (mSuspended) mSuspended--; }
Eric Laurent9d91ad52009-07-17 12:17:14 -0700504 virtual String8 getParameters(const String8& keys);
505 virtual void audioConfigChanged(int event, int param = 0);
506
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800507 struct stream_type_t {
508 stream_type_t()
509 : volume(1.0f),
510 mute(false)
511 {
512 }
513 float volume;
514 bool mute;
515 };
516
Eric Laurent9395d9b2009-07-23 13:17:39 -0700517 protected:
518 int mType;
519 int16_t* mMixBuffer;
Eric Laurentf9df2492009-08-06 08:49:39 -0700520 int mSuspended;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700521 int mBytesWritten;
522 bool mMasterMute;
523 SortedVector< wp<Track> > mActiveTracks;
524
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800525 private:
526
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800527 friend class AudioFlinger;
Eric Laurentf5aba822009-08-10 23:22:32 -0700528 friend class OutputTrack;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800529 friend class Track;
530 friend class TrackBase;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700531 friend class MixerThread;
532 friend class DirectOutputThread;
533 friend class DuplicatingThread;
534
535 PlaybackThread(const Client&);
536 PlaybackThread& operator = (const PlaybackThread&);
537
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700538 status_t addTrack_l(const sp<Track>& track);
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700539 void destroyTrack_l(const sp<Track>& track);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700540 virtual int getTrackName_l() = 0;
541 virtual void deleteTrackName_l(int name) = 0;
542 void readOutputParameters();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800543
Eric Laurent9d91ad52009-07-17 12:17:14 -0700544 virtual status_t dumpInternals(int fd, const Vector<String16>& args);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800545 status_t dumpTracks(int fd, const Vector<String16>& args);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700546
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800547 SortedVector< sp<Track> > mTracks;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700548 // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread
549 stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1];
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800550 AudioStreamOut* mOutput;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800551 float mMasterVolume;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800552 nsecs_t mLastWriteTime;
553 int mNumWrites;
554 int mNumDelayedWrites;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800555 bool mInWrite;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700556 int mMinBytesToWrite;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800557 };
558
Eric Laurent9d91ad52009-07-17 12:17:14 -0700559 class MixerThread : public PlaybackThread {
560 public:
561 MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
562 virtual ~MixerThread();
563
564 // Thread virtuals
565 virtual bool threadLoop();
566
567 void getTracks(SortedVector < sp<Track> >& tracks,
568 SortedVector < wp<Track> >& activeTracks,
569 int streamType);
570 void putTracks(SortedVector < sp<Track> >& tracks,
571 SortedVector < wp<Track> >& activeTracks);
572 virtual int getTrackName_l();
573 virtual void deleteTrackName_l(int name);
574 virtual bool checkForNewParameters_l();
575 virtual status_t dumpInternals(int fd, const Vector<String16>& args);
576
577 protected:
578 size_t prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove);
579
580 AudioMixer* mAudioMixer;
581 };
582
583 class DirectOutputThread : public PlaybackThread {
584 public:
585
586 DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
587 ~DirectOutputThread();
588
589 // Thread virtuals
590 virtual bool threadLoop();
591
592 virtual int getTrackName_l();
593 virtual void deleteTrackName_l(int name);
594 virtual bool checkForNewParameters_l();
595
596 private:
597 float mLeftVolume;
598 float mRightVolume;
599 };
600
601 class DuplicatingThread : public MixerThread {
602 public:
603 DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread);
604 ~DuplicatingThread();
605
606 // Thread virtuals
607 virtual bool threadLoop();
608 void addOutputTrack(MixerThread* thread);
609 void removeOutputTrack(MixerThread* thread);
610
611 private:
612 SortedVector < sp<OutputTrack> > mOutputTracks;
613 };
614
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700615 PlaybackThread *checkPlaybackThread_l(int output) const;
616 MixerThread *checkMixerThread_l(int output) const;
617 RecordThread *checkRecordThread_l(int input) const;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700618 float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; }
Eric Laurentb3687ae2009-09-15 07:10:12 -0700619 void audioConfigChanged_l(int event, const sp<ThreadBase>& thread, void *param2);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700620
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800621 friend class AudioBuffer;
622
623 class TrackHandle : public android::BnAudioTrack {
624 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700625 TrackHandle(const sp<PlaybackThread::Track>& track);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800626 virtual ~TrackHandle();
627 virtual status_t start();
628 virtual void stop();
629 virtual void flush();
630 virtual void mute(bool);
631 virtual void pause();
632 virtual void setVolume(float left, float right);
633 virtual sp<IMemory> getCblk() const;
634 virtual status_t onTransact(
635 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
636 private:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700637 sp<PlaybackThread::Track> mTrack;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800638 };
639
640 friend class Client;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700641 friend class PlaybackThread::Track;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800642
643
644 void removeClient(pid_t pid);
645
646
Eric Laurent9d91ad52009-07-17 12:17:14 -0700647 // record thread
648 class RecordThread : public ThreadBase, public AudioBufferProvider
649 {
650 public:
651
652 // record track
653 class RecordTrack : public TrackBase {
654 public:
655 RecordTrack(const wp<ThreadBase>& thread,
656 const sp<Client>& client,
657 uint32_t sampleRate,
658 int format,
659 int channelCount,
660 int frameCount,
661 uint32_t flags);
662 ~RecordTrack();
663
664 virtual status_t start();
665 virtual void stop();
666
667 bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
668 bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
669
670 private:
671 friend class AudioFlinger;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700672 friend class RecordThread;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700673
674 RecordTrack(const RecordTrack&);
675 RecordTrack& operator = (const RecordTrack&);
676
677 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
678
679 bool mOverflow;
680 };
681
682
683 RecordThread(const sp<AudioFlinger>& audioFlinger,
684 AudioStreamIn *input,
685 uint32_t sampleRate,
686 uint32_t channels);
687 ~RecordThread();
688
689 virtual bool threadLoop();
690 virtual status_t readyToRun() { return NO_ERROR; }
691 virtual void onFirstRef();
692
693 status_t start(RecordTrack* recordTrack);
694 void stop(RecordTrack* recordTrack);
695 status_t dump(int fd, const Vector<String16>& args);
696 AudioStreamIn* getInput() { return mInput; }
697
698 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
699 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
700 virtual bool checkForNewParameters_l();
701 virtual String8 getParameters(const String8& keys);
702 virtual void audioConfigChanged(int event, int param = 0);
703 void readInputParameters();
704
705 private:
706 RecordThread();
707 AudioStreamIn *mInput;
708 sp<RecordTrack> mActiveTrack;
709 Condition mStartStopCond;
710 AudioResampler *mResampler;
711 int32_t *mRsmpOutBuffer;
712 int16_t *mRsmpInBuffer;
713 size_t mRsmpInIndex;
714 size_t mInputBytes;
715 int mReqChannelCount;
716 uint32_t mReqSampleRate;
717 };
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800718
719 class RecordHandle : public android::BnAudioRecord {
720 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700721 RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800722 virtual ~RecordHandle();
723 virtual status_t start();
724 virtual void stop();
725 virtual sp<IMemory> getCblk() const;
726 virtual status_t onTransact(
727 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
728 private:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700729 sp<RecordThread::RecordTrack> mRecordTrack;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800730 };
731
Eric Laurent9d91ad52009-07-17 12:17:14 -0700732 friend class RecordThread;
733 friend class PlaybackThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800734
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800735
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700736 mutable Mutex mLock;
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700737
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800738 DefaultKeyedVector< pid_t, wp<Client> > mClients;
739
Eric Laurent9d91ad52009-07-17 12:17:14 -0700740 mutable Mutex mHardwareLock;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800741 AudioHardwareInterface* mAudioHardware;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800742 mutable int mHardwareStatus;
The Android Open Source Projectbcef13b2009-03-11 12:11:56 -0700743
Eric Laurent9d91ad52009-07-17 12:17:14 -0700744
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700745 DefaultKeyedVector< int, sp<PlaybackThread> > mPlaybackThreads;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700746 PlaybackThread::stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
747 float mMasterVolume;
748 bool mMasterMute;
749
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700750 DefaultKeyedVector< int, sp<RecordThread> > mRecordThreads;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700751
752 SortedVector< sp<IBinder> > mNotificationClients;
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700753 int mNextThreadId;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800754};
755
756// ----------------------------------------------------------------------------
757
758}; // namespace android
759
760#endif // ANDROID_AUDIO_FLINGER_H