blob: 8c29da85921bea296d03e0e0ba2629c63d626b95 [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 Laurent09b4ba82009-11-19 09:00:56 -0800216 ThreadBase (const sp<AudioFlinger>& audioFlinger, int id);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700217 virtual ~ThreadBase();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800218
Eric Laurentee47d432009-11-07 00:01:32 -0800219 status_t dumpBase(int fd, const Vector<String16>& args);
220
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800221 // base for record and playback
222 class TrackBase : public AudioBufferProvider, public RefBase {
223
224 public:
225 enum track_state {
226 IDLE,
227 TERMINATED,
228 STOPPED,
229 RESUMING,
230 ACTIVE,
231 PAUSING,
232 PAUSED
233 };
234
235 enum track_flags {
236 STEPSERVER_FAILED = 0x01, // StepServer could not acquire cblk->lock mutex
237 SYSTEM_FLAGS_MASK = 0x0000ffffUL,
238 // The upper 16 bits are used for track-specific flags.
239 };
240
Eric Laurent9d91ad52009-07-17 12:17:14 -0700241 TrackBase(const wp<ThreadBase>& thread,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800242 const sp<Client>& client,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800243 uint32_t sampleRate,
244 int format,
245 int channelCount,
246 int frameCount,
247 uint32_t flags,
248 const sp<IMemory>& sharedBuffer);
249 ~TrackBase();
250
251 virtual status_t start() = 0;
252 virtual void stop() = 0;
253 sp<IMemory> getCblk() const;
Eric Laurentf5aba822009-08-10 23:22:32 -0700254 audio_track_cblk_t* cblk() const { return mCblk; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800255
256 protected:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700257 friend class ThreadBase;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800258 friend class RecordHandle;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700259 friend class PlaybackThread;
260 friend class RecordThread;
261 friend class MixerThread;
262 friend class DirectOutputThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800263
264 TrackBase(const TrackBase&);
265 TrackBase& operator = (const TrackBase&);
266
267 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
268 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
269
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800270 int format() const {
271 return mFormat;
272 }
273
274 int channelCount() const ;
275
276 int sampleRate() const;
277
278 void* getBuffer(uint32_t offset, uint32_t frames) const;
279
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800280 bool isStopped() const {
281 return mState == STOPPED;
282 }
283
284 bool isTerminated() const {
285 return mState == TERMINATED;
286 }
287
288 bool step();
289 void reset();
290
Eric Laurent9d91ad52009-07-17 12:17:14 -0700291 wp<ThreadBase> mThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800292 sp<Client> mClient;
293 sp<IMemory> mCblkMemory;
294 audio_track_cblk_t* mCblk;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800295 void* mBuffer;
296 void* mBufferEnd;
297 uint32_t mFrameCount;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800298 // we don't really need a lock for these
299 int mState;
300 int mClientTid;
301 uint8_t mFormat;
302 uint32_t mFlags;
303 };
304
Eric Laurent9d91ad52009-07-17 12:17:14 -0700305 class ConfigEvent {
306 public:
307 ConfigEvent() : mEvent(0), mParam(0) {}
308
309 int mEvent;
310 int mParam;
311 };
312
313 uint32_t sampleRate() const;
314 int channelCount() const;
315 int format() const;
316 size_t frameCount() const;
317 void wakeUp() { mWaitWorkCV.broadcast(); }
318 void exit();
319 virtual bool checkForNewParameters_l() = 0;
320 virtual status_t setParameters(const String8& keyValuePairs);
321 virtual String8 getParameters(const String8& keys) = 0;
322 virtual void audioConfigChanged(int event, int param = 0) = 0;
323 void sendConfigEvent(int event, int param = 0);
Eric Laurent3464c012009-08-04 09:45:33 -0700324 void sendConfigEvent_l(int event, int param = 0);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700325 void processConfigEvents();
Eric Laurent09b4ba82009-11-19 09:00:56 -0800326 int id() const { return mId;}
Eric Laurent9d91ad52009-07-17 12:17:14 -0700327
Eric Laurent9395d9b2009-07-23 13:17:39 -0700328 mutable Mutex mLock;
329
Eric Laurent9d91ad52009-07-17 12:17:14 -0700330 protected:
331
332 friend class Track;
333 friend class TrackBase;
334 friend class PlaybackThread;
335 friend class MixerThread;
336 friend class DirectOutputThread;
337 friend class DuplicatingThread;
338 friend class RecordThread;
339 friend class RecordTrack;
340
Eric Laurent9d91ad52009-07-17 12:17:14 -0700341 Condition mWaitWorkCV;
342 sp<AudioFlinger> mAudioFlinger;
343 uint32_t mSampleRate;
344 size_t mFrameCount;
345 int mChannelCount;
346 int mFormat;
347 uint32_t mFrameSize;
348 Condition mParamCond;
Eric Laurent3464c012009-08-04 09:45:33 -0700349 Vector<String8> mNewParameters;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700350 status_t mParamStatus;
351 Vector<ConfigEvent *> mConfigEvents;
352 bool mStandby;
Eric Laurent09b4ba82009-11-19 09:00:56 -0800353 int mId;
354 bool mExiting;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700355 };
356
357 // --- PlaybackThread ---
358 class PlaybackThread : public ThreadBase {
359 public:
360
361 enum type {
362 MIXER,
363 DIRECT,
364 DUPLICATING
365 };
366
Eric Laurent0e49d352009-11-09 23:32:22 -0800367 enum mixer_state {
368 MIXER_IDLE,
369 MIXER_TRACKS_ENABLED,
370 MIXER_TRACKS_READY
371 };
372
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800373 // playback track
374 class Track : public TrackBase {
375 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700376 Track( const wp<ThreadBase>& thread,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800377 const sp<Client>& client,
378 int streamType,
379 uint32_t sampleRate,
380 int format,
381 int channelCount,
382 int frameCount,
383 const sp<IMemory>& sharedBuffer);
384 ~Track();
385
386 void dump(char* buffer, size_t size);
387 virtual status_t start();
388 virtual void stop();
389 void pause();
390
391 void flush();
392 void destroy();
393 void mute(bool);
394 void setVolume(float left, float right);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700395 int name() const {
396 return mName;
397 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800398
Eric Laurent570dd0b2009-05-22 09:18:15 -0700399 int type() const {
400 return mStreamType;
401 }
402
403
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800404 protected:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700405 friend class ThreadBase;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800406 friend class AudioFlinger;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700407 friend class TrackHandle;
408 friend class PlaybackThread;
409 friend class MixerThread;
410 friend class DirectOutputThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800411
412 Track(const Track&);
413 Track& operator = (const Track&);
414
415 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700416 bool isMuted() { return mMute; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800417 bool isPausing() const {
418 return mState == PAUSING;
419 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800420 bool isPaused() const {
421 return mState == PAUSED;
422 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800423 bool isReady() const;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800424 void setPaused() { mState = PAUSED; }
425 void reset();
426
Eric Laurent09b4ba82009-11-19 09:00:56 -0800427 bool isOutputTrack() const {
428 return (mStreamType == AudioSystem::NUM_STREAM_TYPES);
429 }
430
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800431 // we don't really need a lock for these
432 float mVolume[2];
433 volatile bool mMute;
434 // FILLED state is used for suppressing volume ramp at begin of playing
435 enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
436 mutable uint8_t mFillingUpStatus;
437 int8_t mRetryCount;
438 sp<IMemory> mSharedBuffer;
439 bool mResetDone;
Eric Laurent570dd0b2009-05-22 09:18:15 -0700440 int mStreamType;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700441 int mName;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800442 }; // end of Track
443
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800444
445 // playback track
446 class OutputTrack : public Track {
447 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700448
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800449 class Buffer: public AudioBufferProvider::Buffer {
450 public:
451 int16_t *mBuffer;
452 };
Eric Laurent9d91ad52009-07-17 12:17:14 -0700453
454 OutputTrack( const wp<ThreadBase>& thread,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800455 uint32_t sampleRate,
456 int format,
457 int channelCount,
458 int frameCount);
459 ~OutputTrack();
460
461 virtual status_t start();
462 virtual void stop();
Eric Laurent9d91ad52009-07-17 12:17:14 -0700463 bool write(int16_t* data, uint32_t frames);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800464 bool bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
Eric Laurent9d91ad52009-07-17 12:17:14 -0700465 bool isActive() { return mActive; }
466 wp<ThreadBase>& thread() { return mThread; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800467
468 private:
469
Eric Laurent9d91ad52009-07-17 12:17:14 -0700470 status_t obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800471 void clearBufferQueue();
Eric Laurent9d91ad52009-07-17 12:17:14 -0700472
473 // Maximum number of pending buffers allocated by OutputTrack::write()
474 static const uint8_t kMaxOverFlowBuffers = 3;
475
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800476 Vector < Buffer* > mBufferQueue;
477 AudioBufferProvider::Buffer mOutBuffer;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700478 uint32_t mWaitTimeMs;
479 bool mActive;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800480
Eric Laurent9d91ad52009-07-17 12:17:14 -0700481 }; // end of OutputTrack
482
Eric Laurent09b4ba82009-11-19 09:00:56 -0800483 PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700484 virtual ~PlaybackThread();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800485
486 virtual status_t dump(int fd, const Vector<String16>& args);
487
488 // Thread virtuals
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800489 virtual status_t readyToRun();
490 virtual void onFirstRef();
491
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800492 virtual uint32_t latency() const;
493
494 virtual status_t setMasterVolume(float value);
495 virtual status_t setMasterMute(bool muted);
496
497 virtual float masterVolume() const;
498 virtual bool masterMute() const;
499
500 virtual status_t setStreamVolume(int stream, float value);
501 virtual status_t setStreamMute(int stream, bool muted);
502
503 virtual float streamVolume(int stream) const;
504 virtual bool streamMute(int stream) const;
505
Eric Laurent9d91ad52009-07-17 12:17:14 -0700506 bool isMusicActive() const;
507
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700508 sp<Track> createTrack_l(
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800509 const sp<AudioFlinger::Client>& client,
510 int streamType,
511 uint32_t sampleRate,
512 int format,
513 int channelCount,
514 int frameCount,
515 const sp<IMemory>& sharedBuffer,
516 status_t *status);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700517
518 AudioStreamOut* getOutput() { return mOutput; }
519
520 virtual int type() const { return mType; }
Eric Laurentf9df2492009-08-06 08:49:39 -0700521 void suspend() { mSuspended++; }
522 void restore() { if (mSuspended) mSuspended--; }
Eric Laurent9d91ad52009-07-17 12:17:14 -0700523 virtual String8 getParameters(const String8& keys);
524 virtual void audioConfigChanged(int event, int param = 0);
525
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800526 struct stream_type_t {
527 stream_type_t()
528 : volume(1.0f),
529 mute(false)
530 {
531 }
532 float volume;
533 bool mute;
534 };
535
Eric Laurent9395d9b2009-07-23 13:17:39 -0700536 protected:
537 int mType;
538 int16_t* mMixBuffer;
Eric Laurentf9df2492009-08-06 08:49:39 -0700539 int mSuspended;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700540 int mBytesWritten;
541 bool mMasterMute;
542 SortedVector< wp<Track> > mActiveTracks;
543
Eric Laurentf5e868b2009-10-05 20:29:18 -0700544 virtual int getTrackName_l() = 0;
545 virtual void deleteTrackName_l(int name) = 0;
Eric Laurent0e49d352009-11-09 23:32:22 -0800546 virtual uint32_t activeSleepTimeUs() = 0;
547 virtual uint32_t idleSleepTimeUs() = 0;
Eric Laurentf5e868b2009-10-05 20:29:18 -0700548
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800549 private:
550
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800551 friend class AudioFlinger;
Eric Laurentf5aba822009-08-10 23:22:32 -0700552 friend class OutputTrack;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800553 friend class Track;
554 friend class TrackBase;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700555 friend class MixerThread;
556 friend class DirectOutputThread;
557 friend class DuplicatingThread;
558
559 PlaybackThread(const Client&);
560 PlaybackThread& operator = (const PlaybackThread&);
561
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700562 status_t addTrack_l(const sp<Track>& track);
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700563 void destroyTrack_l(const sp<Track>& track);
Eric Laurentf5e868b2009-10-05 20:29:18 -0700564
Eric Laurent9d91ad52009-07-17 12:17:14 -0700565 void readOutputParameters();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800566
Eric Laurent9d91ad52009-07-17 12:17:14 -0700567 virtual status_t dumpInternals(int fd, const Vector<String16>& args);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800568 status_t dumpTracks(int fd, const Vector<String16>& args);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700569
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800570 SortedVector< sp<Track> > mTracks;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700571 // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread
572 stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1];
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800573 AudioStreamOut* mOutput;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800574 float mMasterVolume;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800575 nsecs_t mLastWriteTime;
576 int mNumWrites;
577 int mNumDelayedWrites;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800578 bool mInWrite;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800579 };
580
Eric Laurent9d91ad52009-07-17 12:17:14 -0700581 class MixerThread : public PlaybackThread {
582 public:
Eric Laurent09b4ba82009-11-19 09:00:56 -0800583 MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700584 virtual ~MixerThread();
585
586 // Thread virtuals
587 virtual bool threadLoop();
588
589 void getTracks(SortedVector < sp<Track> >& tracks,
590 SortedVector < wp<Track> >& activeTracks,
591 int streamType);
592 void putTracks(SortedVector < sp<Track> >& tracks,
593 SortedVector < wp<Track> >& activeTracks);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700594 virtual bool checkForNewParameters_l();
595 virtual status_t dumpInternals(int fd, const Vector<String16>& args);
596
597 protected:
Eric Laurent0e49d352009-11-09 23:32:22 -0800598 uint32_t prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove);
Eric Laurentf5e868b2009-10-05 20:29:18 -0700599 virtual int getTrackName_l();
600 virtual void deleteTrackName_l(int name);
Eric Laurent0e49d352009-11-09 23:32:22 -0800601 virtual uint32_t activeSleepTimeUs();
602 virtual uint32_t idleSleepTimeUs();
Eric Laurent9d91ad52009-07-17 12:17:14 -0700603
604 AudioMixer* mAudioMixer;
605 };
606
607 class DirectOutputThread : public PlaybackThread {
608 public:
609
Eric Laurent09b4ba82009-11-19 09:00:56 -0800610 DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700611 ~DirectOutputThread();
612
613 // Thread virtuals
614 virtual bool threadLoop();
615
Eric Laurentf5e868b2009-10-05 20:29:18 -0700616 virtual bool checkForNewParameters_l();
617
618 protected:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700619 virtual int getTrackName_l();
620 virtual void deleteTrackName_l(int name);
Eric Laurent0e49d352009-11-09 23:32:22 -0800621 virtual uint32_t activeSleepTimeUs();
622 virtual uint32_t idleSleepTimeUs();
Eric Laurent9d91ad52009-07-17 12:17:14 -0700623
624 private:
625 float mLeftVolume;
626 float mRightVolume;
627 };
628
629 class DuplicatingThread : public MixerThread {
630 public:
Eric Laurent09b4ba82009-11-19 09:00:56 -0800631 DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread, int id);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700632 ~DuplicatingThread();
633
634 // Thread virtuals
635 virtual bool threadLoop();
636 void addOutputTrack(MixerThread* thread);
637 void removeOutputTrack(MixerThread* thread);
638
639 private:
640 SortedVector < sp<OutputTrack> > mOutputTracks;
641 };
642
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700643 PlaybackThread *checkPlaybackThread_l(int output) const;
644 MixerThread *checkMixerThread_l(int output) const;
645 RecordThread *checkRecordThread_l(int input) const;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700646 float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; }
Eric Laurent09b4ba82009-11-19 09:00:56 -0800647 void audioConfigChanged_l(int event, int ioHandle, void *param2);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700648
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800649 friend class AudioBuffer;
650
651 class TrackHandle : public android::BnAudioTrack {
652 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700653 TrackHandle(const sp<PlaybackThread::Track>& track);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800654 virtual ~TrackHandle();
655 virtual status_t start();
656 virtual void stop();
657 virtual void flush();
658 virtual void mute(bool);
659 virtual void pause();
660 virtual void setVolume(float left, float right);
661 virtual sp<IMemory> getCblk() const;
662 virtual status_t onTransact(
663 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
664 private:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700665 sp<PlaybackThread::Track> mTrack;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800666 };
667
668 friend class Client;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700669 friend class PlaybackThread::Track;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800670
671
Eric Laurent0f8ab672009-09-17 05:12:56 -0700672 void removeClient_l(pid_t pid);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800673
674
Eric Laurent9d91ad52009-07-17 12:17:14 -0700675 // record thread
676 class RecordThread : public ThreadBase, public AudioBufferProvider
677 {
678 public:
679
680 // record track
681 class RecordTrack : public TrackBase {
682 public:
683 RecordTrack(const wp<ThreadBase>& thread,
684 const sp<Client>& client,
685 uint32_t sampleRate,
686 int format,
687 int channelCount,
688 int frameCount,
689 uint32_t flags);
690 ~RecordTrack();
691
692 virtual status_t start();
693 virtual void stop();
694
695 bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
696 bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
697
Eric Laurentee47d432009-11-07 00:01:32 -0800698 void dump(char* buffer, size_t size);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700699 private:
700 friend class AudioFlinger;
Eric Laurent9395d9b2009-07-23 13:17:39 -0700701 friend class RecordThread;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700702
703 RecordTrack(const RecordTrack&);
704 RecordTrack& operator = (const RecordTrack&);
705
706 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
707
708 bool mOverflow;
709 };
710
711
712 RecordThread(const sp<AudioFlinger>& audioFlinger,
713 AudioStreamIn *input,
714 uint32_t sampleRate,
Eric Laurent09b4ba82009-11-19 09:00:56 -0800715 uint32_t channels,
716 int id);
Eric Laurent9d91ad52009-07-17 12:17:14 -0700717 ~RecordThread();
718
719 virtual bool threadLoop();
720 virtual status_t readyToRun() { return NO_ERROR; }
721 virtual void onFirstRef();
722
723 status_t start(RecordTrack* recordTrack);
724 void stop(RecordTrack* recordTrack);
725 status_t dump(int fd, const Vector<String16>& args);
726 AudioStreamIn* getInput() { return mInput; }
727
728 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
729 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
730 virtual bool checkForNewParameters_l();
731 virtual String8 getParameters(const String8& keys);
732 virtual void audioConfigChanged(int event, int param = 0);
733 void readInputParameters();
734
735 private:
736 RecordThread();
737 AudioStreamIn *mInput;
738 sp<RecordTrack> mActiveTrack;
739 Condition mStartStopCond;
740 AudioResampler *mResampler;
741 int32_t *mRsmpOutBuffer;
742 int16_t *mRsmpInBuffer;
743 size_t mRsmpInIndex;
744 size_t mInputBytes;
745 int mReqChannelCount;
746 uint32_t mReqSampleRate;
Eric Laurent52910952009-12-05 05:20:01 -0800747 ssize_t mBytesRead;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700748 };
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800749
750 class RecordHandle : public android::BnAudioRecord {
751 public:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700752 RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800753 virtual ~RecordHandle();
754 virtual status_t start();
755 virtual void stop();
756 virtual sp<IMemory> getCblk() const;
757 virtual status_t onTransact(
758 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
759 private:
Eric Laurent9d91ad52009-07-17 12:17:14 -0700760 sp<RecordThread::RecordTrack> mRecordTrack;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800761 };
762
Eric Laurent9d91ad52009-07-17 12:17:14 -0700763 friend class RecordThread;
764 friend class PlaybackThread;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800765
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800766
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700767 mutable Mutex mLock;
The Android Open Source Project22f8def2009-03-09 11:52:12 -0700768
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800769 DefaultKeyedVector< pid_t, wp<Client> > mClients;
770
Eric Laurent9d91ad52009-07-17 12:17:14 -0700771 mutable Mutex mHardwareLock;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800772 AudioHardwareInterface* mAudioHardware;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800773 mutable int mHardwareStatus;
The Android Open Source Projectbcef13b2009-03-11 12:11:56 -0700774
Eric Laurent9d91ad52009-07-17 12:17:14 -0700775
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700776 DefaultKeyedVector< int, sp<PlaybackThread> > mPlaybackThreads;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700777 PlaybackThread::stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
778 float mMasterVolume;
779 bool mMasterMute;
780
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700781 DefaultKeyedVector< int, sp<RecordThread> > mRecordThreads;
Eric Laurent9d91ad52009-07-17 12:17:14 -0700782
783 SortedVector< sp<IBinder> > mNotificationClients;
Eric Laurente0e9ecc2009-07-28 08:44:33 -0700784 int mNextThreadId;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800785};
786
787// ----------------------------------------------------------------------------
788
789}; // namespace android
790
791#endif // ANDROID_AUDIO_FLINGER_H