blob: 369901950d3ae1c3934d01827837df977f3bcd99 [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; }
Eric Laurent0f8ab672009-09-17 05:12:56 -0700192 sp<AudioFlinger> audioFlinger() { return mAudioFlinger; }
193
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800194 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 Laurent9d91ad52009-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 Projectedbf3b62009-03-03 19:31:44 -0800211
Eric Laurent9d91ad52009-07-17 12:17:14 -0700212 class ThreadBase : public Thread {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800213 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700214 ThreadBase (const sp<AudioFlinger>& audioFlinger);
215 virtual ~ThreadBase();
The Android Open Source Projectedbf3b62009-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 Laurent9d91ad52009-07-17 12:17:14 -0700237 TrackBase(const wp<ThreadBase>& thread,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800238 const sp<Client>& client,
The Android Open Source Projectedbf3b62009-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;
Eric Laurentf5aba822009-08-10 23:22:32 -0700250 audio_track_cblk_t* cblk() const { return mCblk; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800251
252 protected:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700253 friend class ThreadBase;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800254 friend class RecordHandle;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700255 friend class PlaybackThread;
256 friend class RecordThread;
257 friend class MixerThread;
258 friend class DirectOutputThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800259
260 TrackBase(const TrackBase&);
261 TrackBase& operator = (const TrackBase&);
262
263 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
264 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
265
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800266 int format() const {
267 return mFormat;
268 }
269
270 int channelCount() const ;
271
272 int sampleRate() const;
273
274 void* getBuffer(uint32_t offset, uint32_t frames) const;
275
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800276 bool isStopped() const {
277 return mState == STOPPED;
278 }
279
280 bool isTerminated() const {
281 return mState == TERMINATED;
282 }
283
284 bool step();
285 void reset();
286
Eric Laurent9d91ad52009-07-17 12:17:14 -0700287 wp<ThreadBase> mThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800288 sp<Client> mClient;
289 sp<IMemory> mCblkMemory;
290 audio_track_cblk_t* mCblk;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800291 void* mBuffer;
292 void* mBufferEnd;
293 uint32_t mFrameCount;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800294 // we don't really need a lock for these
295 int mState;
296 int mClientTid;
297 uint8_t mFormat;
298 uint32_t mFlags;
299 };
300
Eric Laurent9d91ad52009-07-17 12:17:14 -0700301 class ConfigEvent {
302 public:
303 ConfigEvent() : mEvent(0), mParam(0) {}
304
305 int mEvent;
306 int mParam;
307 };
308
309 uint32_t sampleRate() const;
310 int channelCount() const;
311 int format() const;
312 size_t frameCount() const;
313 void wakeUp() { mWaitWorkCV.broadcast(); }
314 void exit();
315 virtual bool checkForNewParameters_l() = 0;
316 virtual status_t setParameters(const String8& keyValuePairs);
317 virtual String8 getParameters(const String8& keys) = 0;
318 virtual void audioConfigChanged(int event, int param = 0) = 0;
319 void sendConfigEvent(int event, int param = 0);
Eric Laurent3464c012009-08-04 09:45:33 -0700320 void sendConfigEvent_l(int event, int param = 0);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700321 void processConfigEvents();
322
Eric Laurent9395d9b2009-07-23 13:17:39 -0700323 mutable Mutex mLock;
324
Eric Laurent9d91ad52009-07-17 12:17:14 -0700325 protected:
326
327 friend class Track;
328 friend class TrackBase;
329 friend class PlaybackThread;
330 friend class MixerThread;
331 friend class DirectOutputThread;
332 friend class DuplicatingThread;
333 friend class RecordThread;
334 friend class RecordTrack;
335
Eric Laurent9d91ad52009-07-17 12:17:14 -0700336 Condition mWaitWorkCV;
337 sp<AudioFlinger> mAudioFlinger;
338 uint32_t mSampleRate;
339 size_t mFrameCount;
340 int mChannelCount;
341 int mFormat;
342 uint32_t mFrameSize;
343 Condition mParamCond;
Eric Laurent3464c012009-08-04 09:45:33 -0700344 Vector<String8> mNewParameters;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700345 status_t mParamStatus;
346 Vector<ConfigEvent *> mConfigEvents;
347 bool mStandby;
348 };
349
350 // --- PlaybackThread ---
351 class PlaybackThread : public ThreadBase {
352 public:
353
354 enum type {
355 MIXER,
356 DIRECT,
357 DUPLICATING
358 };
359
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800360 // playback track
361 class Track : public TrackBase {
362 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700363 Track( const wp<ThreadBase>& thread,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800364 const sp<Client>& client,
365 int streamType,
366 uint32_t sampleRate,
367 int format,
368 int channelCount,
369 int frameCount,
370 const sp<IMemory>& sharedBuffer);
371 ~Track();
372
373 void dump(char* buffer, size_t size);
374 virtual status_t start();
375 virtual void stop();
376 void pause();
377
378 void flush();
379 void destroy();
380 void mute(bool);
381 void setVolume(float left, float right);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700382 int name() const {
383 return mName;
384 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800385
Eric Laurent570dd0b2009-05-22 09:18:15 -0700386 int type() const {
387 return mStreamType;
388 }
389
390
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800391 protected:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700392 friend class ThreadBase;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800393 friend class AudioFlinger;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700394 friend class TrackHandle;
395 friend class PlaybackThread;
396 friend class MixerThread;
397 friend class DirectOutputThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800398
399 Track(const Track&);
400 Track& operator = (const Track&);
401
402 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700403 bool isMuted() { return mMute; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800404 bool isPausing() const {
405 return mState == PAUSING;
406 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800407 bool isPaused() const {
408 return mState == PAUSED;
409 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800410 bool isReady() const;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800411 void setPaused() { mState = PAUSED; }
412 void reset();
413
414 // we don't really need a lock for these
415 float mVolume[2];
416 volatile bool mMute;
417 // FILLED state is used for suppressing volume ramp at begin of playing
418 enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
419 mutable uint8_t mFillingUpStatus;
420 int8_t mRetryCount;
421 sp<IMemory> mSharedBuffer;
422 bool mResetDone;
Eric Laurent570dd0b2009-05-22 09:18:15 -0700423 int mStreamType;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700424 int mName;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800425 }; // end of Track
426
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800427
428 // playback track
429 class OutputTrack : public Track {
430 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700431
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800432 class Buffer: public AudioBufferProvider::Buffer {
433 public:
434 int16_t *mBuffer;
435 };
Eric Laurent9d91ad52009-07-17 12:17:14 -0700436
437 OutputTrack( const wp<ThreadBase>& thread,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800438 uint32_t sampleRate,
439 int format,
440 int channelCount,
441 int frameCount);
442 ~OutputTrack();
443
444 virtual status_t start();
445 virtual void stop();
Eric Laurent9d91ad52009-07-17 12:17:14 -0700446 bool write(int16_t* data, uint32_t frames);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800447 bool bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
Eric Laurent9d91ad52009-07-17 12:17:14 -0700448 bool isActive() { return mActive; }
449 wp<ThreadBase>& thread() { return mThread; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800450
451 private:
452
Eric Laurent9d91ad52009-07-17 12:17:14 -0700453 status_t obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800454 void clearBufferQueue();
Eric Laurent9d91ad52009-07-17 12:17:14 -0700455
456 // Maximum number of pending buffers allocated by OutputTrack::write()
457 static const uint8_t kMaxOverFlowBuffers = 3;
458
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800459 Vector < Buffer* > mBufferQueue;
460 AudioBufferProvider::Buffer mOutBuffer;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700461 uint32_t mWaitTimeMs;
462 bool mActive;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800463
Eric Laurent9d91ad52009-07-17 12:17:14 -0700464 }; // end of OutputTrack
465
466 PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
467 virtual ~PlaybackThread();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800468
469 virtual status_t dump(int fd, const Vector<String16>& args);
470
471 // Thread virtuals
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800472 virtual status_t readyToRun();
473 virtual void onFirstRef();
474
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800475 virtual uint32_t latency() const;
476
477 virtual status_t setMasterVolume(float value);
478 virtual status_t setMasterMute(bool muted);
479
480 virtual float masterVolume() const;
481 virtual bool masterMute() const;
482
483 virtual status_t setStreamVolume(int stream, float value);
484 virtual status_t setStreamMute(int stream, bool muted);
485
486 virtual float streamVolume(int stream) const;
487 virtual bool streamMute(int stream) const;
488
Eric Laurent9d91ad52009-07-17 12:17:14 -0700489 bool isMusicActive() const;
490
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700491 sp<Track> createTrack_l(
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800492 const sp<AudioFlinger::Client>& client,
493 int streamType,
494 uint32_t sampleRate,
495 int format,
496 int channelCount,
497 int frameCount,
498 const sp<IMemory>& sharedBuffer,
499 status_t *status);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700500
501 AudioStreamOut* getOutput() { return mOutput; }
502
503 virtual int type() const { return mType; }
Eric Laurentf9df2492009-08-06 08:49:39 -0700504 void suspend() { mSuspended++; }
505 void restore() { if (mSuspended) mSuspended--; }
Eric Laurent9d91ad52009-07-17 12:17:14 -0700506 virtual String8 getParameters(const String8& keys);
507 virtual void audioConfigChanged(int event, int param = 0);
508
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800509 struct stream_type_t {
510 stream_type_t()
511 : volume(1.0f),
512 mute(false)
513 {
514 }
515 float volume;
516 bool mute;
517 };
518
Eric Laurent9395d9b2009-07-23 13:17:39 -0700519 protected:
520 int mType;
521 int16_t* mMixBuffer;
Eric Laurentf9df2492009-08-06 08:49:39 -0700522 int mSuspended;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700523 int mBytesWritten;
524 bool mMasterMute;
525 SortedVector< wp<Track> > mActiveTracks;
526
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800527 private:
528
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800529 friend class AudioFlinger;
Eric Laurentf5aba822009-08-10 23:22:32 -0700530 friend class OutputTrack;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800531 friend class Track;
532 friend class TrackBase;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700533 friend class MixerThread;
534 friend class DirectOutputThread;
535 friend class DuplicatingThread;
536
537 PlaybackThread(const Client&);
538 PlaybackThread& operator = (const PlaybackThread&);
539
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700540 status_t addTrack_l(const sp<Track>& track);
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700541 void destroyTrack_l(const sp<Track>& track);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700542 virtual int getTrackName_l() = 0;
543 virtual void deleteTrackName_l(int name) = 0;
544 void readOutputParameters();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800545
Eric Laurent9d91ad52009-07-17 12:17:14 -0700546 virtual status_t dumpInternals(int fd, const Vector<String16>& args);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800547 status_t dumpTracks(int fd, const Vector<String16>& args);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700548
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800549 SortedVector< sp<Track> > mTracks;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700550 // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread
551 stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1];
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800552 AudioStreamOut* mOutput;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800553 float mMasterVolume;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800554 nsecs_t mLastWriteTime;
555 int mNumWrites;
556 int mNumDelayedWrites;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800557 bool mInWrite;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700558 int mMinBytesToWrite;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800559 };
560
Eric Laurent9d91ad52009-07-17 12:17:14 -0700561 class MixerThread : public PlaybackThread {
562 public:
563 MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
564 virtual ~MixerThread();
565
566 // Thread virtuals
567 virtual bool threadLoop();
568
569 void getTracks(SortedVector < sp<Track> >& tracks,
570 SortedVector < wp<Track> >& activeTracks,
571 int streamType);
572 void putTracks(SortedVector < sp<Track> >& tracks,
573 SortedVector < wp<Track> >& activeTracks);
574 virtual int getTrackName_l();
575 virtual void deleteTrackName_l(int name);
576 virtual bool checkForNewParameters_l();
577 virtual status_t dumpInternals(int fd, const Vector<String16>& args);
578
579 protected:
580 size_t prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove);
581
582 AudioMixer* mAudioMixer;
583 };
584
585 class DirectOutputThread : public PlaybackThread {
586 public:
587
588 DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
589 ~DirectOutputThread();
590
591 // Thread virtuals
592 virtual bool threadLoop();
593
594 virtual int getTrackName_l();
595 virtual void deleteTrackName_l(int name);
596 virtual bool checkForNewParameters_l();
597
598 private:
599 float mLeftVolume;
600 float mRightVolume;
601 };
602
603 class DuplicatingThread : public MixerThread {
604 public:
605 DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread);
606 ~DuplicatingThread();
607
608 // Thread virtuals
609 virtual bool threadLoop();
610 void addOutputTrack(MixerThread* thread);
611 void removeOutputTrack(MixerThread* thread);
612
613 private:
614 SortedVector < sp<OutputTrack> > mOutputTracks;
615 };
616
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700617 PlaybackThread *checkPlaybackThread_l(int output) const;
618 MixerThread *checkMixerThread_l(int output) const;
619 RecordThread *checkRecordThread_l(int input) const;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700620 float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; }
Eric Laurentb3687ae2009-09-15 07:10:12 -0700621 void audioConfigChanged_l(int event, const sp<ThreadBase>& thread, void *param2);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700622
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800623 friend class AudioBuffer;
624
625 class TrackHandle : public android::BnAudioTrack {
626 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700627 TrackHandle(const sp<PlaybackThread::Track>& track);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800628 virtual ~TrackHandle();
629 virtual status_t start();
630 virtual void stop();
631 virtual void flush();
632 virtual void mute(bool);
633 virtual void pause();
634 virtual void setVolume(float left, float right);
635 virtual sp<IMemory> getCblk() const;
636 virtual status_t onTransact(
637 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
638 private:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700639 sp<PlaybackThread::Track> mTrack;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800640 };
641
642 friend class Client;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700643 friend class PlaybackThread::Track;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800644
645
Eric Laurent0f8ab672009-09-17 05:12:56 -0700646 void removeClient_l(pid_t pid);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800647
648
Eric Laurent9d91ad52009-07-17 12:17:14 -0700649 // record thread
650 class RecordThread : public ThreadBase, public AudioBufferProvider
651 {
652 public:
653
654 // record track
655 class RecordTrack : public TrackBase {
656 public:
657 RecordTrack(const wp<ThreadBase>& thread,
658 const sp<Client>& client,
659 uint32_t sampleRate,
660 int format,
661 int channelCount,
662 int frameCount,
663 uint32_t flags);
664 ~RecordTrack();
665
666 virtual status_t start();
667 virtual void stop();
668
669 bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
670 bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
671
672 private:
673 friend class AudioFlinger;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700674 friend class RecordThread;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700675
676 RecordTrack(const RecordTrack&);
677 RecordTrack& operator = (const RecordTrack&);
678
679 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
680
681 bool mOverflow;
682 };
683
684
685 RecordThread(const sp<AudioFlinger>& audioFlinger,
686 AudioStreamIn *input,
687 uint32_t sampleRate,
688 uint32_t channels);
689 ~RecordThread();
690
691 virtual bool threadLoop();
692 virtual status_t readyToRun() { return NO_ERROR; }
693 virtual void onFirstRef();
694
695 status_t start(RecordTrack* recordTrack);
696 void stop(RecordTrack* recordTrack);
697 status_t dump(int fd, const Vector<String16>& args);
698 AudioStreamIn* getInput() { return mInput; }
699
700 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
701 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
702 virtual bool checkForNewParameters_l();
703 virtual String8 getParameters(const String8& keys);
704 virtual void audioConfigChanged(int event, int param = 0);
705 void readInputParameters();
706
707 private:
708 RecordThread();
709 AudioStreamIn *mInput;
710 sp<RecordTrack> mActiveTrack;
711 Condition mStartStopCond;
712 AudioResampler *mResampler;
713 int32_t *mRsmpOutBuffer;
714 int16_t *mRsmpInBuffer;
715 size_t mRsmpInIndex;
716 size_t mInputBytes;
717 int mReqChannelCount;
718 uint32_t mReqSampleRate;
719 };
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800720
721 class RecordHandle : public android::BnAudioRecord {
722 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700723 RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800724 virtual ~RecordHandle();
725 virtual status_t start();
726 virtual void stop();
727 virtual sp<IMemory> getCblk() const;
728 virtual status_t onTransact(
729 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
730 private:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700731 sp<RecordThread::RecordTrack> mRecordTrack;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800732 };
733
Eric Laurent9d91ad52009-07-17 12:17:14 -0700734 friend class RecordThread;
735 friend class PlaybackThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800736
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800737
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700738 mutable Mutex mLock;
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700739
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800740 DefaultKeyedVector< pid_t, wp<Client> > mClients;
741
Eric Laurent9d91ad52009-07-17 12:17:14 -0700742 mutable Mutex mHardwareLock;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800743 AudioHardwareInterface* mAudioHardware;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800744 mutable int mHardwareStatus;
The Android Open Source Projectbcef13b2009-03-11 12:11:56 -0700745
Eric Laurent9d91ad52009-07-17 12:17:14 -0700746
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700747 DefaultKeyedVector< int, sp<PlaybackThread> > mPlaybackThreads;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700748 PlaybackThread::stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
749 float mMasterVolume;
750 bool mMasterMute;
751
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700752 DefaultKeyedVector< int, sp<RecordThread> > mRecordThreads;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700753
754 SortedVector< sp<IBinder> > mNotificationClients;
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700755 int mNextThreadId;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800756};
757
758// ----------------------------------------------------------------------------
759
760}; // namespace android
761
762#endif // ANDROID_AUDIO_FLINGER_H