blob: 56599f6ea656be556a5d82b4430c4488b2890d01 [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
Eric Laurent63da2b62009-10-21 08:14:22 -0700136 virtual status_t setVoiceVolume(float volume);
137
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800138 // IBinder::DeathRecipient
139 virtual void binderDied(const wp<IBinder>& who);
140
141 enum hardware_call_state {
142 AUDIO_HW_IDLE = 0,
143 AUDIO_HW_INIT,
144 AUDIO_HW_OUTPUT_OPEN,
145 AUDIO_HW_OUTPUT_CLOSE,
146 AUDIO_HW_INPUT_OPEN,
147 AUDIO_HW_INPUT_CLOSE,
148 AUDIO_HW_STANDBY,
149 AUDIO_HW_SET_MASTER_VOLUME,
150 AUDIO_HW_GET_ROUTING,
151 AUDIO_HW_SET_ROUTING,
152 AUDIO_HW_GET_MODE,
153 AUDIO_HW_SET_MODE,
154 AUDIO_HW_GET_MIC_MUTE,
155 AUDIO_HW_SET_MIC_MUTE,
156 AUDIO_SET_VOICE_VOLUME,
157 AUDIO_SET_PARAMETER,
158 };
159
160 // record interface
161 virtual sp<IAudioRecord> openRecord(
162 pid_t pid,
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700163 int input,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800164 uint32_t sampleRate,
165 int format,
166 int channelCount,
167 int frameCount,
168 uint32_t flags,
169 status_t *status);
170
171 virtual status_t onTransact(
172 uint32_t code,
173 const Parcel& data,
174 Parcel* reply,
175 uint32_t flags);
176
177private:
178 AudioFlinger();
179 virtual ~AudioFlinger();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800180
The Android Open Source Projectedbf3b62009-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; }
Eric Laurent0f8ab672009-09-17 05:12:56 -0700194 sp<AudioFlinger> audioFlinger() { return mAudioFlinger; }
195
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800196 private:
197 Client(const Client&);
198 Client& operator = (const Client&);
199 sp<AudioFlinger> mAudioFlinger;
200 sp<MemoryDealer> mMemoryDealer;
201 pid_t mPid;
202 };
203
204
205 class TrackHandle;
206 class RecordHandle;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700207 class RecordThread;
208 class PlaybackThread;
209 class MixerThread;
210 class DirectOutputThread;
211 class Track;
212 class RecordTrack;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800213
Eric Laurent9d91ad52009-07-17 12:17:14 -0700214 class ThreadBase : public Thread {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800215 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700216 ThreadBase (const sp<AudioFlinger>& audioFlinger);
217 virtual ~ThreadBase();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800218
219 // base for record and playback
220 class TrackBase : public AudioBufferProvider, public RefBase {
221
222 public:
223 enum track_state {
224 IDLE,
225 TERMINATED,
226 STOPPED,
227 RESUMING,
228 ACTIVE,
229 PAUSING,
230 PAUSED
231 };
232
233 enum track_flags {
234 STEPSERVER_FAILED = 0x01, // StepServer could not acquire cblk->lock mutex
235 SYSTEM_FLAGS_MASK = 0x0000ffffUL,
236 // The upper 16 bits are used for track-specific flags.
237 };
238
Eric Laurent9d91ad52009-07-17 12:17:14 -0700239 TrackBase(const wp<ThreadBase>& thread,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800240 const sp<Client>& client,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800241 uint32_t sampleRate,
242 int format,
243 int channelCount,
244 int frameCount,
245 uint32_t flags,
246 const sp<IMemory>& sharedBuffer);
247 ~TrackBase();
248
249 virtual status_t start() = 0;
250 virtual void stop() = 0;
251 sp<IMemory> getCblk() const;
Eric Laurentf5aba822009-08-10 23:22:32 -0700252 audio_track_cblk_t* cblk() const { return mCblk; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800253
254 protected:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700255 friend class ThreadBase;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800256 friend class RecordHandle;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700257 friend class PlaybackThread;
258 friend class RecordThread;
259 friend class MixerThread;
260 friend class DirectOutputThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800261
262 TrackBase(const TrackBase&);
263 TrackBase& operator = (const TrackBase&);
264
265 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
266 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
267
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800268 int format() const {
269 return mFormat;
270 }
271
272 int channelCount() const ;
273
274 int sampleRate() const;
275
276 void* getBuffer(uint32_t offset, uint32_t frames) const;
277
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800278 bool isStopped() const {
279 return mState == STOPPED;
280 }
281
282 bool isTerminated() const {
283 return mState == TERMINATED;
284 }
285
286 bool step();
287 void reset();
288
Eric Laurent9d91ad52009-07-17 12:17:14 -0700289 wp<ThreadBase> mThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800290 sp<Client> mClient;
291 sp<IMemory> mCblkMemory;
292 audio_track_cblk_t* mCblk;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800293 void* mBuffer;
294 void* mBufferEnd;
295 uint32_t mFrameCount;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800296 // we don't really need a lock for these
297 int mState;
298 int mClientTid;
299 uint8_t mFormat;
300 uint32_t mFlags;
301 };
302
Eric Laurent9d91ad52009-07-17 12:17:14 -0700303 class ConfigEvent {
304 public:
305 ConfigEvent() : mEvent(0), mParam(0) {}
306
307 int mEvent;
308 int mParam;
309 };
310
311 uint32_t sampleRate() const;
312 int channelCount() const;
313 int format() const;
314 size_t frameCount() const;
315 void wakeUp() { mWaitWorkCV.broadcast(); }
316 void exit();
317 virtual bool checkForNewParameters_l() = 0;
318 virtual status_t setParameters(const String8& keyValuePairs);
319 virtual String8 getParameters(const String8& keys) = 0;
320 virtual void audioConfigChanged(int event, int param = 0) = 0;
321 void sendConfigEvent(int event, int param = 0);
Eric Laurent3464c012009-08-04 09:45:33 -0700322 void sendConfigEvent_l(int event, int param = 0);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700323 void processConfigEvents();
324
Eric Laurent9395d9b2009-07-23 13:17:39 -0700325 mutable Mutex mLock;
326
Eric Laurent9d91ad52009-07-17 12:17:14 -0700327 protected:
328
329 friend class Track;
330 friend class TrackBase;
331 friend class PlaybackThread;
332 friend class MixerThread;
333 friend class DirectOutputThread;
334 friend class DuplicatingThread;
335 friend class RecordThread;
336 friend class RecordTrack;
337
Eric Laurent9d91ad52009-07-17 12:17:14 -0700338 Condition mWaitWorkCV;
339 sp<AudioFlinger> mAudioFlinger;
340 uint32_t mSampleRate;
341 size_t mFrameCount;
342 int mChannelCount;
343 int mFormat;
344 uint32_t mFrameSize;
345 Condition mParamCond;
Eric Laurent3464c012009-08-04 09:45:33 -0700346 Vector<String8> mNewParameters;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700347 status_t mParamStatus;
348 Vector<ConfigEvent *> mConfigEvents;
349 bool mStandby;
350 };
351
352 // --- PlaybackThread ---
353 class PlaybackThread : public ThreadBase {
354 public:
355
356 enum type {
357 MIXER,
358 DIRECT,
359 DUPLICATING
360 };
361
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800362 // playback track
363 class Track : public TrackBase {
364 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700365 Track( const wp<ThreadBase>& thread,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800366 const sp<Client>& client,
367 int streamType,
368 uint32_t sampleRate,
369 int format,
370 int channelCount,
371 int frameCount,
372 const sp<IMemory>& sharedBuffer);
373 ~Track();
374
375 void dump(char* buffer, size_t size);
376 virtual status_t start();
377 virtual void stop();
378 void pause();
379
380 void flush();
381 void destroy();
382 void mute(bool);
383 void setVolume(float left, float right);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700384 int name() const {
385 return mName;
386 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800387
Eric Laurent570dd0b2009-05-22 09:18:15 -0700388 int type() const {
389 return mStreamType;
390 }
391
392
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800393 protected:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700394 friend class ThreadBase;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800395 friend class AudioFlinger;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700396 friend class TrackHandle;
397 friend class PlaybackThread;
398 friend class MixerThread;
399 friend class DirectOutputThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800400
401 Track(const Track&);
402 Track& operator = (const Track&);
403
404 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700405 bool isMuted() { return mMute; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800406 bool isPausing() const {
407 return mState == PAUSING;
408 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800409 bool isPaused() const {
410 return mState == PAUSED;
411 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800412 bool isReady() const;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800413 void setPaused() { mState = PAUSED; }
414 void reset();
415
416 // we don't really need a lock for these
417 float mVolume[2];
418 volatile bool mMute;
419 // FILLED state is used for suppressing volume ramp at begin of playing
420 enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
421 mutable uint8_t mFillingUpStatus;
422 int8_t mRetryCount;
423 sp<IMemory> mSharedBuffer;
424 bool mResetDone;
Eric Laurent570dd0b2009-05-22 09:18:15 -0700425 int mStreamType;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700426 int mName;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800427 }; // end of Track
428
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800429
430 // playback track
431 class OutputTrack : public Track {
432 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700433
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800434 class Buffer: public AudioBufferProvider::Buffer {
435 public:
436 int16_t *mBuffer;
437 };
Eric Laurent9d91ad52009-07-17 12:17:14 -0700438
439 OutputTrack( const wp<ThreadBase>& thread,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800440 uint32_t sampleRate,
441 int format,
442 int channelCount,
443 int frameCount);
444 ~OutputTrack();
445
446 virtual status_t start();
447 virtual void stop();
Eric Laurent9d91ad52009-07-17 12:17:14 -0700448 bool write(int16_t* data, uint32_t frames);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800449 bool bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
Eric Laurent9d91ad52009-07-17 12:17:14 -0700450 bool isActive() { return mActive; }
451 wp<ThreadBase>& thread() { return mThread; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800452
453 private:
454
Eric Laurent9d91ad52009-07-17 12:17:14 -0700455 status_t obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800456 void clearBufferQueue();
Eric Laurent9d91ad52009-07-17 12:17:14 -0700457
458 // Maximum number of pending buffers allocated by OutputTrack::write()
459 static const uint8_t kMaxOverFlowBuffers = 3;
460
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800461 Vector < Buffer* > mBufferQueue;
462 AudioBufferProvider::Buffer mOutBuffer;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700463 uint32_t mWaitTimeMs;
464 bool mActive;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800465
Eric Laurent9d91ad52009-07-17 12:17:14 -0700466 }; // end of OutputTrack
467
468 PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
469 virtual ~PlaybackThread();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800470
471 virtual status_t dump(int fd, const Vector<String16>& args);
472
473 // Thread virtuals
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800474 virtual status_t readyToRun();
475 virtual void onFirstRef();
476
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800477 virtual uint32_t latency() const;
478
479 virtual status_t setMasterVolume(float value);
480 virtual status_t setMasterMute(bool muted);
481
482 virtual float masterVolume() const;
483 virtual bool masterMute() const;
484
485 virtual status_t setStreamVolume(int stream, float value);
486 virtual status_t setStreamMute(int stream, bool muted);
487
488 virtual float streamVolume(int stream) const;
489 virtual bool streamMute(int stream) const;
490
Eric Laurent9d91ad52009-07-17 12:17:14 -0700491 bool isMusicActive() const;
492
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700493 sp<Track> createTrack_l(
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800494 const sp<AudioFlinger::Client>& client,
495 int streamType,
496 uint32_t sampleRate,
497 int format,
498 int channelCount,
499 int frameCount,
500 const sp<IMemory>& sharedBuffer,
501 status_t *status);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700502
503 AudioStreamOut* getOutput() { return mOutput; }
504
505 virtual int type() const { return mType; }
Eric Laurentf9df2492009-08-06 08:49:39 -0700506 void suspend() { mSuspended++; }
507 void restore() { if (mSuspended) mSuspended--; }
Eric Laurent9d91ad52009-07-17 12:17:14 -0700508 virtual String8 getParameters(const String8& keys);
509 virtual void audioConfigChanged(int event, int param = 0);
510
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800511 struct stream_type_t {
512 stream_type_t()
513 : volume(1.0f),
514 mute(false)
515 {
516 }
517 float volume;
518 bool mute;
519 };
520
Eric Laurent9395d9b2009-07-23 13:17:39 -0700521 protected:
522 int mType;
523 int16_t* mMixBuffer;
Eric Laurentf9df2492009-08-06 08:49:39 -0700524 int mSuspended;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700525 int mBytesWritten;
526 bool mMasterMute;
527 SortedVector< wp<Track> > mActiveTracks;
528
Eric Laurentf5e868b2009-10-05 20:29:18 -0700529 virtual int getTrackName_l() = 0;
530 virtual void deleteTrackName_l(int name) = 0;
531 virtual uint32_t getMaxBufferRecoveryInUsecs() = 0;
532
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800533 private:
534
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800535 friend class AudioFlinger;
Eric Laurentf5aba822009-08-10 23:22:32 -0700536 friend class OutputTrack;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800537 friend class Track;
538 friend class TrackBase;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700539 friend class MixerThread;
540 friend class DirectOutputThread;
541 friend class DuplicatingThread;
542
543 PlaybackThread(const Client&);
544 PlaybackThread& operator = (const PlaybackThread&);
545
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700546 status_t addTrack_l(const sp<Track>& track);
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700547 void destroyTrack_l(const sp<Track>& track);
Eric Laurentf5e868b2009-10-05 20:29:18 -0700548
Eric Laurent9d91ad52009-07-17 12:17:14 -0700549 void readOutputParameters();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800550
Eric Laurent9d91ad52009-07-17 12:17:14 -0700551 virtual status_t dumpInternals(int fd, const Vector<String16>& args);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800552 status_t dumpTracks(int fd, const Vector<String16>& args);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700553
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800554 SortedVector< sp<Track> > mTracks;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700555 // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread
556 stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1];
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800557 AudioStreamOut* mOutput;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800558 float mMasterVolume;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800559 nsecs_t mLastWriteTime;
560 int mNumWrites;
561 int mNumDelayedWrites;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800562 bool mInWrite;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700563 int mMinBytesToWrite;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800564 };
565
Eric Laurent9d91ad52009-07-17 12:17:14 -0700566 class MixerThread : public PlaybackThread {
567 public:
568 MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
569 virtual ~MixerThread();
570
571 // Thread virtuals
572 virtual bool threadLoop();
573
574 void getTracks(SortedVector < sp<Track> >& tracks,
575 SortedVector < wp<Track> >& activeTracks,
576 int streamType);
577 void putTracks(SortedVector < sp<Track> >& tracks,
578 SortedVector < wp<Track> >& activeTracks);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700579 virtual bool checkForNewParameters_l();
580 virtual status_t dumpInternals(int fd, const Vector<String16>& args);
581
582 protected:
583 size_t prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove);
Eric Laurentf5e868b2009-10-05 20:29:18 -0700584 virtual int getTrackName_l();
585 virtual void deleteTrackName_l(int name);
586 virtual uint32_t getMaxBufferRecoveryInUsecs();
Eric Laurent9d91ad52009-07-17 12:17:14 -0700587
588 AudioMixer* mAudioMixer;
589 };
590
591 class DirectOutputThread : public PlaybackThread {
592 public:
593
594 DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
595 ~DirectOutputThread();
596
597 // Thread virtuals
598 virtual bool threadLoop();
599
Eric Laurentf5e868b2009-10-05 20:29:18 -0700600 virtual bool checkForNewParameters_l();
601
602 protected:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700603 virtual int getTrackName_l();
604 virtual void deleteTrackName_l(int name);
Eric Laurentf5e868b2009-10-05 20:29:18 -0700605 virtual uint32_t getMaxBufferRecoveryInUsecs();
Eric Laurent9d91ad52009-07-17 12:17:14 -0700606
607 private:
608 float mLeftVolume;
609 float mRightVolume;
610 };
611
612 class DuplicatingThread : public MixerThread {
613 public:
614 DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread);
615 ~DuplicatingThread();
616
617 // Thread virtuals
618 virtual bool threadLoop();
619 void addOutputTrack(MixerThread* thread);
620 void removeOutputTrack(MixerThread* thread);
621
622 private:
623 SortedVector < sp<OutputTrack> > mOutputTracks;
624 };
625
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700626 PlaybackThread *checkPlaybackThread_l(int output) const;
627 MixerThread *checkMixerThread_l(int output) const;
628 RecordThread *checkRecordThread_l(int input) const;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700629 float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; }
Eric Laurentb3687ae2009-09-15 07:10:12 -0700630 void audioConfigChanged_l(int event, const sp<ThreadBase>& thread, void *param2);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700631
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800632 friend class AudioBuffer;
633
634 class TrackHandle : public android::BnAudioTrack {
635 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700636 TrackHandle(const sp<PlaybackThread::Track>& track);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800637 virtual ~TrackHandle();
638 virtual status_t start();
639 virtual void stop();
640 virtual void flush();
641 virtual void mute(bool);
642 virtual void pause();
643 virtual void setVolume(float left, float right);
644 virtual sp<IMemory> getCblk() const;
645 virtual status_t onTransact(
646 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
647 private:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700648 sp<PlaybackThread::Track> mTrack;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800649 };
650
651 friend class Client;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700652 friend class PlaybackThread::Track;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800653
654
Eric Laurent0f8ab672009-09-17 05:12:56 -0700655 void removeClient_l(pid_t pid);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800656
657
Eric Laurent9d91ad52009-07-17 12:17:14 -0700658 // record thread
659 class RecordThread : public ThreadBase, public AudioBufferProvider
660 {
661 public:
662
663 // record track
664 class RecordTrack : public TrackBase {
665 public:
666 RecordTrack(const wp<ThreadBase>& thread,
667 const sp<Client>& client,
668 uint32_t sampleRate,
669 int format,
670 int channelCount,
671 int frameCount,
672 uint32_t flags);
673 ~RecordTrack();
674
675 virtual status_t start();
676 virtual void stop();
677
678 bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
679 bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
680
681 private:
682 friend class AudioFlinger;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700683 friend class RecordThread;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700684
685 RecordTrack(const RecordTrack&);
686 RecordTrack& operator = (const RecordTrack&);
687
688 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
689
690 bool mOverflow;
691 };
692
693
694 RecordThread(const sp<AudioFlinger>& audioFlinger,
695 AudioStreamIn *input,
696 uint32_t sampleRate,
697 uint32_t channels);
698 ~RecordThread();
699
700 virtual bool threadLoop();
701 virtual status_t readyToRun() { return NO_ERROR; }
702 virtual void onFirstRef();
703
704 status_t start(RecordTrack* recordTrack);
705 void stop(RecordTrack* recordTrack);
706 status_t dump(int fd, const Vector<String16>& args);
707 AudioStreamIn* getInput() { return mInput; }
708
709 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
710 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
711 virtual bool checkForNewParameters_l();
712 virtual String8 getParameters(const String8& keys);
713 virtual void audioConfigChanged(int event, int param = 0);
714 void readInputParameters();
715
716 private:
717 RecordThread();
718 AudioStreamIn *mInput;
719 sp<RecordTrack> mActiveTrack;
720 Condition mStartStopCond;
721 AudioResampler *mResampler;
722 int32_t *mRsmpOutBuffer;
723 int16_t *mRsmpInBuffer;
724 size_t mRsmpInIndex;
725 size_t mInputBytes;
726 int mReqChannelCount;
727 uint32_t mReqSampleRate;
728 };
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800729
730 class RecordHandle : public android::BnAudioRecord {
731 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700732 RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800733 virtual ~RecordHandle();
734 virtual status_t start();
735 virtual void stop();
736 virtual sp<IMemory> getCblk() const;
737 virtual status_t onTransact(
738 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
739 private:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700740 sp<RecordThread::RecordTrack> mRecordTrack;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800741 };
742
Eric Laurent9d91ad52009-07-17 12:17:14 -0700743 friend class RecordThread;
744 friend class PlaybackThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800745
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800746
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700747 mutable Mutex mLock;
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700748
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800749 DefaultKeyedVector< pid_t, wp<Client> > mClients;
750
Eric Laurent9d91ad52009-07-17 12:17:14 -0700751 mutable Mutex mHardwareLock;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800752 AudioHardwareInterface* mAudioHardware;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800753 mutable int mHardwareStatus;
The Android Open Source Projectbcef13b2009-03-11 12:11:56 -0700754
Eric Laurent9d91ad52009-07-17 12:17:14 -0700755
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700756 DefaultKeyedVector< int, sp<PlaybackThread> > mPlaybackThreads;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700757 PlaybackThread::stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
758 float mMasterVolume;
759 bool mMasterMute;
760
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700761 DefaultKeyedVector< int, sp<RecordThread> > mRecordThreads;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700762
763 SortedVector< sp<IBinder> > mNotificationClients;
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700764 int mNextThreadId;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800765};
766
767// ----------------------------------------------------------------------------
768
769}; // namespace android
770
771#endif // ANDROID_AUDIO_FLINGER_H