blob: 7c84e62635c0b9f490adb9ccc5ed0a6309ac4215 [file] [log] [blame]
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -07001/* //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/IAudioTrack.h>
26#include <media/IAudioRecord.h>
27#include <media/AudioTrack.h>
28
29#include <utils/Atomic.h>
30#include <utils/Errors.h>
31#include <utils/threads.h>
32#include <utils/MemoryDealer.h>
33#include <utils/KeyedVector.h>
34#include <utils/SortedVector.h>
35
36#include <hardware/AudioHardwareInterface.h>
37
38#include "AudioBufferProvider.h"
39
40namespace android {
41
42class audio_track_cblk_t;
43class AudioMixer;
44class AudioBuffer;
45
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080046
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070047// ----------------------------------------------------------------------------
48
49#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true ))
50#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false ))
51
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080052
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070053// ----------------------------------------------------------------------------
54
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080055static const nsecs_t kStandbyTimeInNsecs = seconds(3);
56
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070057class AudioFlinger : public BnAudioFlinger, protected Thread
58{
59public:
60 static void instantiate();
61
62 virtual status_t dump(int fd, const Vector<String16>& args);
63
64 // Thread virtuals
65 virtual bool threadLoop();
66 virtual status_t readyToRun();
67 virtual void onFirstRef();
68
69 // IAudioFlinger interface
70 virtual sp<IAudioTrack> createTrack(
71 pid_t pid,
72 int streamType,
73 uint32_t sampleRate,
74 int format,
75 int channelCount,
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080076 int frameCount,
77 uint32_t flags,
78 const sp<IMemory>& sharedBuffer,
79 status_t *status);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070080
81 virtual uint32_t sampleRate() const;
82 virtual int channelCount() const;
83 virtual int format() const;
84 virtual size_t frameCount() const;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080085 virtual size_t latency() const;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070086
87 virtual status_t setMasterVolume(float value);
88 virtual status_t setMasterMute(bool muted);
89
90 virtual float masterVolume() const;
91 virtual bool masterMute() const;
92
93 virtual status_t setStreamVolume(int stream, float value);
94 virtual status_t setStreamMute(int stream, bool muted);
95
96 virtual float streamVolume(int stream) const;
97 virtual bool streamMute(int stream) const;
98
99 virtual status_t setRouting(int mode, uint32_t routes, uint32_t mask);
100 virtual uint32_t getRouting(int mode) const;
101
102 virtual status_t setMode(int mode);
103 virtual int getMode() const;
104
105 virtual status_t setMicMute(bool state);
106 virtual bool getMicMute() const;
107
108 virtual bool isMusicActive() const;
109
110 virtual status_t setParameter(const char* key, const char* value);
111
112 enum hardware_call_state {
113 AUDIO_HW_IDLE = 0,
114 AUDIO_HW_INIT,
115 AUDIO_HW_OUTPUT_OPEN,
116 AUDIO_HW_OUTPUT_CLOSE,
117 AUDIO_HW_INPUT_OPEN,
118 AUDIO_HW_INPUT_CLOSE,
119 AUDIO_HW_STANDBY,
120 AUDIO_HW_SET_MASTER_VOLUME,
121 AUDIO_HW_GET_ROUTING,
122 AUDIO_HW_SET_ROUTING,
123 AUDIO_HW_GET_MODE,
124 AUDIO_HW_SET_MODE,
125 AUDIO_HW_GET_MIC_MUTE,
126 AUDIO_HW_SET_MIC_MUTE,
127 AUDIO_SET_VOICE_VOLUME,
128 AUDIO_SET_PARAMETER,
129 };
130
131 // record interface
132 virtual sp<IAudioRecord> openRecord(
133 pid_t pid,
134 int streamType,
135 uint32_t sampleRate,
136 int format,
137 int channelCount,
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800138 int frameCount,
139 uint32_t flags,
140 status_t *status);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700141
142 virtual status_t onTransact(
143 uint32_t code,
144 const Parcel& data,
145 Parcel* reply,
146 uint32_t flags);
147
148private:
149 AudioFlinger();
150 virtual ~AudioFlinger();
151
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800152 void setOutput(AudioStreamOut* output);
The Android Open Source Project27629322009-01-09 17:51:23 -0800153 void doSetOutput(AudioStreamOut* output);
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800154 size_t getOutputFrameCount(AudioStreamOut* output);
155
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700156 // Internal dump utilites.
157 status_t dumpPermissionDenial(int fd, const Vector<String16>& args);
158 status_t dumpClients(int fd, const Vector<String16>& args);
159 status_t dumpTracks(int fd, const Vector<String16>& args);
160 status_t dumpInternals(int fd, const Vector<String16>& args);
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800161
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700162 // --- Client ---
163 class Client : public RefBase {
164 public:
165 Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
166 virtual ~Client();
167 const sp<MemoryDealer>& heap() const;
168 pid_t pid() const { return mPid; }
169 private:
170 Client(const Client&);
171 Client& operator = (const Client&);
172 sp<AudioFlinger> mAudioFlinger;
173 sp<MemoryDealer> mMemoryDealer;
174 pid_t mPid;
175 };
176
177
178 // --- Track ---
179 class TrackHandle;
180 class RecordHandle;
181 class AudioRecordThread;
182
183 // base for record and playback
184 class TrackBase : public AudioBufferProvider, public RefBase {
185
186 public:
187 enum track_state {
188 IDLE,
189 TERMINATED,
190 STOPPED,
191 RESUMING,
192 ACTIVE,
193 PAUSING,
194 PAUSED
195 };
196
197 enum track_flags {
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800198 STEPSERVER_FAILED = 0x01 // StepServer could not acquire cblk->lock mutex
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700199 };
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800200
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700201 TrackBase( const sp<AudioFlinger>& audioFlinger,
202 const sp<Client>& client,
203 int streamType,
204 uint32_t sampleRate,
205 int format,
206 int channelCount,
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800207 int frameCount,
208 const sp<IMemory>& sharedBuffer);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700209 ~TrackBase();
210
211 virtual status_t start() = 0;
212 virtual void stop() = 0;
213 sp<IMemory> getCblk() const;
214
215 protected:
216 friend class AudioFlinger;
217 friend class RecordHandle;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800218 friend class AudioRecordThread;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700219
220 TrackBase(const TrackBase&);
221 TrackBase& operator = (const TrackBase&);
222
223 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
224 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
225
226 audio_track_cblk_t* cblk() const {
227 return mCblk;
228 }
229
230 int type() const {
231 return mStreamType;
232 }
233
234 int format() const {
235 return mFormat;
236 }
237
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800238 int channelCount() const ;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700239
240 int sampleRate() const;
241
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800242 void* getBuffer(uint32_t offset, uint32_t frames) const;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700243
244 int name() const {
245 return mName;
246 }
247
248 bool isStopped() const {
249 return mState == STOPPED;
250 }
251
252 bool isTerminated() const {
253 return mState == TERMINATED;
254 }
255
256 bool step();
257 void reset();
258
259 sp<AudioFlinger> mAudioFlinger;
260 sp<Client> mClient;
261 sp<IMemory> mCblkMemory;
262 audio_track_cblk_t* mCblk;
263 int mStreamType;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800264 void* mBuffer;
265 void* mBufferEnd;
266 uint32_t mFrameCount;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700267 int mName;
268 // we don't really need a lock for these
269 int mState;
270 int mClientTid;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800271 uint8_t mFormat;
272 uint8_t mFlags;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700273 };
274
275 // playback track
276 class Track : public TrackBase {
277 public:
278 Track( const sp<AudioFlinger>& audioFlinger,
279 const sp<Client>& client,
280 int streamType,
281 uint32_t sampleRate,
282 int format,
283 int channelCount,
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800284 int frameCount,
285 const sp<IMemory>& sharedBuffer);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700286 ~Track();
287
288 void dump(char* buffer, size_t size);
289 virtual status_t start();
290 virtual void stop();
291 void pause();
292
293 void flush();
294 void destroy();
295 void mute(bool);
296 void setVolume(float left, float right);
297
298 private:
299 friend class AudioFlinger;
300 friend class TrackHandle;
301
302 Track(const Track&);
303 Track& operator = (const Track&);
304
305 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
306
307 bool isMuted() const {
308 return mMute;
309 }
310
311 bool isPausing() const {
312 return mState == PAUSING;
313 }
314
315 bool isPaused() const {
316 return mState == PAUSED;
317 }
318
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800319 bool isReady() const;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700320
321 void setPaused() { mState = PAUSED; }
322 void reset();
323
324 // we don't really need a lock for these
325 float mVolume[2];
326 volatile bool mMute;
327 // FILLED state is used for suppressing volume ramp at begin of playing
328 enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
329 mutable uint8_t mFillingUpStatus;
330 int8_t mRetryCount;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800331 sp<IMemory> mSharedBuffer;
332 bool mResetDone;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700333 }; // end of Track
334
335 friend class AudioBuffer;
336
337 class TrackHandle : public android::BnAudioTrack {
338 public:
339 TrackHandle(const sp<Track>& track);
340 virtual ~TrackHandle();
341 virtual status_t start();
342 virtual void stop();
343 virtual void flush();
344 virtual void mute(bool);
345 virtual void pause();
346 virtual void setVolume(float left, float right);
347 virtual sp<IMemory> getCblk() const;
348 virtual status_t onTransact(
349 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
350 private:
351 sp<Track> mTrack;
352 };
353
354 struct stream_type_t {
355 stream_type_t()
356 : volume(1.0f),
357 mute(false)
358 {
359 }
360 float volume;
361 bool mute;
362 };
363
364 friend class Client;
365 friend class Track;
366
367
368 void removeClient(pid_t pid);
369
370 status_t addTrack(const sp<Track>& track);
371 void removeTrack(wp<Track> track, int name);
372 void remove_track_l(wp<Track> track, int name);
373 void destroyTrack(const sp<Track>& track);
374
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800375 AudioMixer* audioMixer() {
376 return mAudioMixer;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700377 }
378
379 // record track
380 class RecordTrack : public TrackBase {
381 public:
382 RecordTrack( const sp<AudioFlinger>& audioFlinger,
383 const sp<Client>& client,
384 int streamType,
385 uint32_t sampleRate,
386 int format,
387 int channelCount,
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800388 int frameCount);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700389 ~RecordTrack();
390
391 virtual status_t start();
392 virtual void stop();
393
394 bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
395 bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
396
397 private:
398 friend class AudioFlinger;
399 friend class RecordHandle;
400 friend class AudioRecordThread;
401
402 RecordTrack(const Track&);
403 RecordTrack& operator = (const Track&);
404
405 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
406
407 bool mOverflow;
408 };
409
410 class RecordHandle : public android::BnAudioRecord {
411 public:
412 RecordHandle(const sp<RecordTrack>& recordTrack);
413 virtual ~RecordHandle();
414 virtual status_t start();
415 virtual void stop();
416 virtual sp<IMemory> getCblk() const;
417 virtual status_t onTransact(
418 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
419 private:
420 sp<RecordTrack> mRecordTrack;
421 };
422
423 // record thread
424 class AudioRecordThread : public Thread
425 {
426 public:
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800427 AudioRecordThread(AudioHardwareInterface* audioHardware);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700428 virtual ~AudioRecordThread();
429 virtual bool threadLoop();
430 virtual status_t readyToRun() { return NO_ERROR; }
431 virtual void onFirstRef() {}
432
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800433 status_t start(RecordTrack* recordTrack);
434 void stop(RecordTrack* recordTrack);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700435 void exit();
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700436
437 private:
438 AudioRecordThread();
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800439 AudioHardwareInterface *mAudioHardware;
440 sp<RecordTrack> mRecordTrack;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700441 Mutex mLock;
442 Condition mWaitWorkCV;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700443 volatile bool mActive;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800444 status_t mStartStatus;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700445 };
446
447 friend class AudioRecordThread;
448
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800449 status_t startRecord(RecordTrack* recordTrack);
450 void stopRecord(RecordTrack* recordTrack);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700451
452 mutable Mutex mHardwareLock;
453 mutable Mutex mLock;
454 mutable Condition mWaitWorkCV;
455 DefaultKeyedVector< pid_t, wp<Client> > mClients;
456 SortedVector< wp<Track> > mActiveTracks;
457 SortedVector< sp<Track> > mTracks;
458 float mMasterVolume;
459 uint32_t mMasterRouting;
460 bool mMasterMute;
461 stream_type_t mStreamTypes[AudioTrack::NUM_STREAM_TYPES];
462
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800463 AudioMixer* mHardwareAudioMixer;
464 AudioMixer* mA2dpAudioMixer;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700465 AudioMixer* mAudioMixer;
466 AudioHardwareInterface* mAudioHardware;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800467 AudioHardwareInterface* mA2dpAudioInterface;
468 AudioStreamOut* mHardwareOutput;
469 AudioStreamOut* mA2dpOutput;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700470 AudioStreamOut* mOutput;
The Android Open Source Project27629322009-01-09 17:51:23 -0800471 AudioStreamOut* mRequestedOutput;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700472 sp<AudioRecordThread> mAudioRecordThread;
473 uint32_t mSampleRate;
474 size_t mFrameCount;
475 int mChannelCount;
476 int mFormat;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700477 int16_t* mMixBuffer;
478 mutable int mHardwareStatus;
479 nsecs_t mLastWriteTime;
480 int mNumWrites;
481 int mNumDelayedWrites;
482 bool mStandby;
483 bool mInWrite;
484};
485
486// ----------------------------------------------------------------------------
487
488}; // namespace android
489
490#endif // ANDROID_AUDIO_FLINGER_H