1 /* //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 #include <limits.h> 24 25 #include <media/IAudioFlinger.h> 26 #include <media/IAudioFlingerClient.h> 27 #include <media/IAudioTrack.h> 28 #include <media/IAudioRecord.h> 29 #include <media/AudioTrack.h> 30 31 #include <utils/Atomic.h> 32 #include <utils/Errors.h> 33 #include <utils/threads.h> 34 #include <binder/MemoryDealer.h> 35 #include <utils/SortedVector.h> 36 #include <utils/Vector.h> 37 38 #include <hardware_legacy/AudioHardwareInterface.h> 39 40 #include "AudioBufferProvider.h" 41 42 namespace android { 43 44 class audio_track_cblk_t; 45 class AudioMixer; 46 class AudioBuffer; 47 class AudioResampler; 48 49 50 // ---------------------------------------------------------------------------- 51 52 #define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 53 #define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 54 55 56 // ---------------------------------------------------------------------------- 57 58 static const nsecs_t kStandbyTimeInNsecs = seconds(3); 59 60 class AudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient 61 { 62 public: 63 static void instantiate(); 64 65 virtual status_t dump(int fd, const Vector<String16>& args); 66 67 // IAudioFlinger interface 68 virtual sp<IAudioTrack> createTrack( 69 pid_t pid, 70 int streamType, 71 uint32_t sampleRate, 72 int format, 73 int channelCount, 74 int frameCount, 75 uint32_t flags, 76 const sp<IMemory>& sharedBuffer, 77 int output, 78 status_t *status); 79 80 virtual uint32_t sampleRate(int output) const; 81 virtual int channelCount(int output) const; 82 virtual int format(int output) const; 83 virtual size_t frameCount(int output) const; 84 virtual uint32_t latency(int output) const; 85 86 virtual status_t setMasterVolume(float value); 87 virtual status_t setMasterMute(bool muted); 88 89 virtual float masterVolume() const; 90 virtual bool masterMute() const; 91 92 virtual status_t setStreamVolume(int stream, float value, int output); 93 virtual status_t setStreamMute(int stream, bool muted); 94 95 virtual float streamVolume(int stream, int output) const; 96 virtual bool streamMute(int stream) const; 97 98 virtual status_t setMode(int mode); 99 100 virtual status_t setMicMute(bool state); 101 virtual bool getMicMute() const; 102 103 virtual bool isStreamActive(int stream) const; 104 105 virtual status_t setParameters(int ioHandle, const String8& keyValuePairs); 106 virtual String8 getParameters(int ioHandle, const String8& keys); 107 108 virtual void registerClient(const sp<IAudioFlingerClient>& client); 109 110 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount); 111 virtual unsigned int getInputFramesLost(int ioHandle); 112 113 virtual int openOutput(uint32_t *pDevices, 114 uint32_t *pSamplingRate, 115 uint32_t *pFormat, 116 uint32_t *pChannels, 117 uint32_t *pLatencyMs, 118 uint32_t flags); 119 120 virtual int openDuplicateOutput(int output1, int output2); 121 122 virtual status_t closeOutput(int output); 123 124 virtual status_t suspendOutput(int output); 125 126 virtual status_t restoreOutput(int output); 127 128 virtual int openInput(uint32_t *pDevices, 129 uint32_t *pSamplingRate, 130 uint32_t *pFormat, 131 uint32_t *pChannels, 132 uint32_t acoustics); 133 134 virtual status_t closeInput(int input); 135 136 virtual status_t setStreamOutput(uint32_t stream, int output); 137 138 virtual status_t setVoiceVolume(float volume); 139 140 virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output); 141 142 // IBinder::DeathRecipient 143 virtual void binderDied(const wp<IBinder>& who); 144 145 enum hardware_call_state { 146 AUDIO_HW_IDLE = 0, 147 AUDIO_HW_INIT, 148 AUDIO_HW_OUTPUT_OPEN, 149 AUDIO_HW_OUTPUT_CLOSE, 150 AUDIO_HW_INPUT_OPEN, 151 AUDIO_HW_INPUT_CLOSE, 152 AUDIO_HW_STANDBY, 153 AUDIO_HW_SET_MASTER_VOLUME, 154 AUDIO_HW_GET_ROUTING, 155 AUDIO_HW_SET_ROUTING, 156 AUDIO_HW_GET_MODE, 157 AUDIO_HW_SET_MODE, 158 AUDIO_HW_GET_MIC_MUTE, 159 AUDIO_HW_SET_MIC_MUTE, 160 AUDIO_SET_VOICE_VOLUME, 161 AUDIO_SET_PARAMETER, 162 }; 163 164 // record interface 165 virtual sp<IAudioRecord> openRecord( 166 pid_t pid, 167 int input, 168 uint32_t sampleRate, 169 int format, 170 int channelCount, 171 int frameCount, 172 uint32_t flags, 173 status_t *status); 174 175 virtual status_t onTransact( 176 uint32_t code, 177 const Parcel& data, 178 Parcel* reply, 179 uint32_t flags); 180 181 private: 182 AudioFlinger(); 183 virtual ~AudioFlinger(); 184 185 186 // Internal dump utilites. 187 status_t dumpPermissionDenial(int fd, const Vector<String16>& args); 188 status_t dumpClients(int fd, const Vector<String16>& args); 189 status_t dumpInternals(int fd, const Vector<String16>& args); 190 191 // --- Client --- 192 class Client : public RefBase { 193 public: 194 Client(const sp<AudioFlinger>& audioFlinger, pid_t pid); 195 virtual ~Client(); 196 const sp<MemoryDealer>& heap() const; 197 pid_t pid() const { return mPid; } 198 sp<AudioFlinger> audioFlinger() { return mAudioFlinger; } 199 200 private: 201 Client(const Client&); 202 Client& operator = (const Client&); 203 sp<AudioFlinger> mAudioFlinger; 204 sp<MemoryDealer> mMemoryDealer; 205 pid_t mPid; 206 }; 207 208 209 class TrackHandle; 210 class RecordHandle; 211 class RecordThread; 212 class PlaybackThread; 213 class MixerThread; 214 class DirectOutputThread; 215 class DuplicatingThread; 216 class Track; 217 class RecordTrack; 218 219 class ThreadBase : public Thread { 220 public: 221 ThreadBase (const sp<AudioFlinger>& audioFlinger, int id); 222 virtual ~ThreadBase(); 223 224 status_t dumpBase(int fd, const Vector<String16>& args); 225 226 // base for record and playback 227 class TrackBase : public AudioBufferProvider, public RefBase { 228 229 public: 230 enum track_state { 231 IDLE, 232 TERMINATED, 233 STOPPED, 234 RESUMING, 235 ACTIVE, 236 PAUSING, 237 PAUSED 238 }; 239 240 enum track_flags { 241 STEPSERVER_FAILED = 0x01, // StepServer could not acquire cblk->lock mutex 242 SYSTEM_FLAGS_MASK = 0x0000ffffUL, 243 // The upper 16 bits are used for track-specific flags. 244 }; 245 246 TrackBase(const wp<ThreadBase>& thread, 247 const sp<Client>& client, 248 uint32_t sampleRate, 249 int format, 250 int channelCount, 251 int frameCount, 252 uint32_t flags, 253 const sp<IMemory>& sharedBuffer); 254 ~TrackBase(); 255 256 virtual status_t start() = 0; 257 virtual void stop() = 0; 258 sp<IMemory> getCblk() const; 259 audio_track_cblk_t* cblk() const { return mCblk; } 260 261 protected: 262 friend class ThreadBase; 263 friend class RecordHandle; 264 friend class PlaybackThread; 265 friend class RecordThread; 266 friend class MixerThread; 267 friend class DirectOutputThread; 268 269 TrackBase(const TrackBase&); 270 TrackBase& operator = (const TrackBase&); 271 272 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0; 273 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); 274 275 int format() const { 276 return mFormat; 277 } 278 279 int channelCount() const ; 280 281 int sampleRate() const; 282 283 void* getBuffer(uint32_t offset, uint32_t frames) const; 284 285 bool isStopped() const { 286 return mState == STOPPED; 287 } 288 289 bool isTerminated() const { 290 return mState == TERMINATED; 291 } 292 293 bool step(); 294 void reset(); 295 296 wp<ThreadBase> mThread; 297 sp<Client> mClient; 298 sp<IMemory> mCblkMemory; 299 audio_track_cblk_t* mCblk; 300 void* mBuffer; 301 void* mBufferEnd; 302 uint32_t mFrameCount; 303 // we don't really need a lock for these 304 int mState; 305 int mClientTid; 306 uint8_t mFormat; 307 uint32_t mFlags; 308 }; 309 310 class ConfigEvent { 311 public: 312 ConfigEvent() : mEvent(0), mParam(0) {} 313 314 int mEvent; 315 int mParam; 316 }; 317 318 uint32_t sampleRate() const; 319 int channelCount() const; 320 int format() const; 321 size_t frameCount() const; 322 void wakeUp() { mWaitWorkCV.broadcast(); } 323 void exit(); 324 virtual bool checkForNewParameters_l() = 0; 325 virtual status_t setParameters(const String8& keyValuePairs); 326 virtual String8 getParameters(const String8& keys) = 0; 327 virtual void audioConfigChanged(int event, int param = 0) = 0; 328 void sendConfigEvent(int event, int param = 0); 329 void sendConfigEvent_l(int event, int param = 0); 330 void processConfigEvents(); 331 int id() const { return mId;} 332 bool standby() { return mStandby; } 333 334 mutable Mutex mLock; 335 336 protected: 337 338 friend class Track; 339 friend class TrackBase; 340 friend class PlaybackThread; 341 friend class MixerThread; 342 friend class DirectOutputThread; 343 friend class DuplicatingThread; 344 friend class RecordThread; 345 friend class RecordTrack; 346 347 Condition mWaitWorkCV; 348 sp<AudioFlinger> mAudioFlinger; 349 uint32_t mSampleRate; 350 size_t mFrameCount; 351 int mChannelCount; 352 int mFormat; 353 uint32_t mFrameSize; 354 Condition mParamCond; 355 Vector<String8> mNewParameters; 356 status_t mParamStatus; 357 Vector<ConfigEvent *> mConfigEvents; 358 bool mStandby; 359 int mId; 360 bool mExiting; 361 }; 362 363 // --- PlaybackThread --- 364 class PlaybackThread : public ThreadBase { 365 public: 366 367 enum type { 368 MIXER, 369 DIRECT, 370 DUPLICATING 371 }; 372 373 enum mixer_state { 374 MIXER_IDLE, 375 MIXER_TRACKS_ENABLED, 376 MIXER_TRACKS_READY 377 }; 378 379 // playback track 380 class Track : public TrackBase { 381 public: 382 Track( const wp<ThreadBase>& thread, 383 const sp<Client>& client, 384 int streamType, 385 uint32_t sampleRate, 386 int format, 387 int channelCount, 388 int frameCount, 389 const sp<IMemory>& sharedBuffer); 390 ~Track(); 391 392 void dump(char* buffer, size_t size); 393 virtual status_t start(); 394 virtual void stop(); 395 void pause(); 396 397 void flush(); 398 void destroy(); 399 void mute(bool); 400 void setVolume(float left, float right); 401 int name() const { 402 return mName; 403 } 404 405 int type() const { 406 return mStreamType; 407 } 408 409 410 protected: 411 friend class ThreadBase; 412 friend class AudioFlinger; 413 friend class TrackHandle; 414 friend class PlaybackThread; 415 friend class MixerThread; 416 friend class DirectOutputThread; 417 418 Track(const Track&); 419 Track& operator = (const Track&); 420 421 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 422 bool isMuted() { return mMute; } 423 bool isPausing() const { 424 return mState == PAUSING; 425 } 426 bool isPaused() const { 427 return mState == PAUSED; 428 } 429 bool isReady() const; 430 void setPaused() { mState = PAUSED; } 431 void reset(); 432 433 bool isOutputTrack() const { 434 return (mStreamType == AudioSystem::NUM_STREAM_TYPES); 435 } 436 437 // we don't really need a lock for these 438 float mVolume[2]; 439 volatile bool mMute; 440 // FILLED state is used for suppressing volume ramp at begin of playing 441 enum {FS_FILLING, FS_FILLED, FS_ACTIVE}; 442 mutable uint8_t mFillingUpStatus; 443 int8_t mRetryCount; 444 sp<IMemory> mSharedBuffer; 445 bool mResetDone; 446 int mStreamType; 447 int mName; 448 }; // end of Track 449 450 451 // playback track 452 class OutputTrack : public Track { 453 public: 454 455 class Buffer: public AudioBufferProvider::Buffer { 456 public: 457 int16_t *mBuffer; 458 }; 459 460 OutputTrack( const wp<ThreadBase>& thread, 461 DuplicatingThread *sourceThread, 462 uint32_t sampleRate, 463 int format, 464 int channelCount, 465 int frameCount); 466 ~OutputTrack(); 467 468 virtual status_t start(); 469 virtual void stop(); 470 bool write(int16_t* data, uint32_t frames); 471 bool bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; } 472 bool isActive() { return mActive; } 473 wp<ThreadBase>& thread() { return mThread; } 474 475 private: 476 477 status_t obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs); 478 void clearBufferQueue(); 479 480 // Maximum number of pending buffers allocated by OutputTrack::write() 481 static const uint8_t kMaxOverFlowBuffers = 10; 482 483 Vector < Buffer* > mBufferQueue; 484 AudioBufferProvider::Buffer mOutBuffer; 485 bool mActive; 486 DuplicatingThread* mSourceThread; 487 }; // end of OutputTrack 488 489 PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id); 490 virtual ~PlaybackThread(); 491 492 virtual status_t dump(int fd, const Vector<String16>& args); 493 494 // Thread virtuals 495 virtual status_t readyToRun(); 496 virtual void onFirstRef(); 497 498 virtual uint32_t latency() const; 499 500 virtual status_t setMasterVolume(float value); 501 virtual status_t setMasterMute(bool muted); 502 503 virtual float masterVolume() const; 504 virtual bool masterMute() const; 505 506 virtual status_t setStreamVolume(int stream, float value); 507 virtual status_t setStreamMute(int stream, bool muted); 508 509 virtual float streamVolume(int stream) const; 510 virtual bool streamMute(int stream) const; 511 512 bool isStreamActive(int stream) const; 513 514 sp<Track> createTrack_l( 515 const sp<AudioFlinger::Client>& client, 516 int streamType, 517 uint32_t sampleRate, 518 int format, 519 int channelCount, 520 int frameCount, 521 const sp<IMemory>& sharedBuffer, 522 status_t *status); 523 524 AudioStreamOut* getOutput() { return mOutput; } 525 526 virtual int type() const { return mType; } 527 void suspend() { mSuspended++; } 528 void restore() { if (mSuspended) mSuspended--; } 529 bool isSuspended() { return (mSuspended != 0); } 530 virtual String8 getParameters(const String8& keys); 531 virtual void audioConfigChanged(int event, int param = 0); 532 virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames); 533 534 struct stream_type_t { 535 stream_type_t() 536 : volume(1.0f), 537 mute(false) 538 { 539 } 540 float volume; 541 bool mute; 542 }; 543 544 protected: 545 int mType; 546 int16_t* mMixBuffer; 547 int mSuspended; 548 int mBytesWritten; 549 bool mMasterMute; 550 SortedVector< wp<Track> > mActiveTracks; 551 552 virtual int getTrackName_l() = 0; 553 virtual void deleteTrackName_l(int name) = 0; 554 virtual uint32_t activeSleepTimeUs() = 0; 555 virtual uint32_t idleSleepTimeUs() = 0; 556 557 private: 558 559 friend class AudioFlinger; 560 friend class OutputTrack; 561 friend class Track; 562 friend class TrackBase; 563 friend class MixerThread; 564 friend class DirectOutputThread; 565 friend class DuplicatingThread; 566 567 PlaybackThread(const Client&); 568 PlaybackThread& operator = (const PlaybackThread&); 569 570 status_t addTrack_l(const sp<Track>& track); 571 void destroyTrack_l(const sp<Track>& track); 572 573 void readOutputParameters(); 574 575 virtual status_t dumpInternals(int fd, const Vector<String16>& args); 576 status_t dumpTracks(int fd, const Vector<String16>& args); 577 578 SortedVector< sp<Track> > mTracks; 579 // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread 580 stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1]; 581 AudioStreamOut* mOutput; 582 float mMasterVolume; 583 nsecs_t mLastWriteTime; 584 int mNumWrites; 585 int mNumDelayedWrites; 586 bool mInWrite; 587 }; 588 589 class MixerThread : public PlaybackThread { 590 public: 591 MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id); 592 virtual ~MixerThread(); 593 594 // Thread virtuals 595 virtual bool threadLoop(); 596 597 void getTracks(SortedVector < sp<Track> >& tracks, 598 SortedVector < wp<Track> >& activeTracks, 599 int streamType); 600 void putTracks(SortedVector < sp<Track> >& tracks, 601 SortedVector < wp<Track> >& activeTracks); 602 virtual bool checkForNewParameters_l(); 603 virtual status_t dumpInternals(int fd, const Vector<String16>& args); 604 605 protected: 606 uint32_t prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove); 607 virtual int getTrackName_l(); 608 virtual void deleteTrackName_l(int name); 609 virtual uint32_t activeSleepTimeUs(); 610 virtual uint32_t idleSleepTimeUs(); 611 612 AudioMixer* mAudioMixer; 613 }; 614 615 class DirectOutputThread : public PlaybackThread { 616 public: 617 618 DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id); 619 ~DirectOutputThread(); 620 621 // Thread virtuals 622 virtual bool threadLoop(); 623 624 virtual bool checkForNewParameters_l(); 625 626 protected: 627 virtual int getTrackName_l(); 628 virtual void deleteTrackName_l(int name); 629 virtual uint32_t activeSleepTimeUs(); 630 virtual uint32_t idleSleepTimeUs(); 631 632 private: 633 float mLeftVolume; 634 float mRightVolume; 635 }; 636 637 class DuplicatingThread : public MixerThread { 638 public: 639 DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread, int id); 640 ~DuplicatingThread(); 641 642 // Thread virtuals 643 virtual bool threadLoop(); 644 void addOutputTrack(MixerThread* thread); 645 void removeOutputTrack(MixerThread* thread); 646 uint32_t waitTimeMs() { return mWaitTimeMs; } 647 protected: 648 virtual uint32_t activeSleepTimeUs(); 649 650 private: 651 bool outputsReady(SortedVector< sp<OutputTrack> > &outputTracks); 652 void updateWaitTime(); 653 654 SortedVector < sp<OutputTrack> > mOutputTracks; 655 uint32_t mWaitTimeMs; 656 }; 657 658 PlaybackThread *checkPlaybackThread_l(int output) const; 659 MixerThread *checkMixerThread_l(int output) const; 660 RecordThread *checkRecordThread_l(int input) const; 661 float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; } 662 void audioConfigChanged_l(int event, int ioHandle, void *param2); 663 664 friend class AudioBuffer; 665 666 class TrackHandle : public android::BnAudioTrack { 667 public: 668 TrackHandle(const sp<PlaybackThread::Track>& track); 669 virtual ~TrackHandle(); 670 virtual status_t start(); 671 virtual void stop(); 672 virtual void flush(); 673 virtual void mute(bool); 674 virtual void pause(); 675 virtual void setVolume(float left, float right); 676 virtual sp<IMemory> getCblk() const; 677 virtual status_t onTransact( 678 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 679 private: 680 sp<PlaybackThread::Track> mTrack; 681 }; 682 683 friend class Client; 684 friend class PlaybackThread::Track; 685 686 687 void removeClient_l(pid_t pid); 688 689 690 // record thread 691 class RecordThread : public ThreadBase, public AudioBufferProvider 692 { 693 public: 694 695 // record track 696 class RecordTrack : public TrackBase { 697 public: 698 RecordTrack(const wp<ThreadBase>& thread, 699 const sp<Client>& client, 700 uint32_t sampleRate, 701 int format, 702 int channelCount, 703 int frameCount, 704 uint32_t flags); 705 ~RecordTrack(); 706 707 virtual status_t start(); 708 virtual void stop(); 709 710 bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; } 711 bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; } 712 713 void dump(char* buffer, size_t size); 714 private: 715 friend class AudioFlinger; 716 friend class RecordThread; 717 718 RecordTrack(const RecordTrack&); 719 RecordTrack& operator = (const RecordTrack&); 720 721 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 722 723 bool mOverflow; 724 }; 725 726 727 RecordThread(const sp<AudioFlinger>& audioFlinger, 728 AudioStreamIn *input, 729 uint32_t sampleRate, 730 uint32_t channels, 731 int id); 732 ~RecordThread(); 733 734 virtual bool threadLoop(); 735 virtual status_t readyToRun() { return NO_ERROR; } 736 virtual void onFirstRef(); 737 738 status_t start(RecordTrack* recordTrack); 739 void stop(RecordTrack* recordTrack); 740 status_t dump(int fd, const Vector<String16>& args); 741 AudioStreamIn* getInput() { return mInput; } 742 743 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 744 virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); 745 virtual bool checkForNewParameters_l(); 746 virtual String8 getParameters(const String8& keys); 747 virtual void audioConfigChanged(int event, int param = 0); 748 void readInputParameters(); 749 virtual unsigned int getInputFramesLost(); 750 751 private: 752 RecordThread(); 753 AudioStreamIn *mInput; 754 sp<RecordTrack> mActiveTrack; 755 Condition mStartStopCond; 756 AudioResampler *mResampler; 757 int32_t *mRsmpOutBuffer; 758 int16_t *mRsmpInBuffer; 759 size_t mRsmpInIndex; 760 size_t mInputBytes; 761 int mReqChannelCount; 762 uint32_t mReqSampleRate; 763 ssize_t mBytesRead; 764 }; 765 766 class RecordHandle : public android::BnAudioRecord { 767 public: 768 RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack); 769 virtual ~RecordHandle(); 770 virtual status_t start(); 771 virtual void stop(); 772 virtual sp<IMemory> getCblk() const; 773 virtual status_t onTransact( 774 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 775 private: 776 sp<RecordThread::RecordTrack> mRecordTrack; 777 }; 778 779 friend class RecordThread; 780 friend class PlaybackThread; 781 782 783 mutable Mutex mLock; 784 785 DefaultKeyedVector< pid_t, wp<Client> > mClients; 786 787 mutable Mutex mHardwareLock; 788 AudioHardwareInterface* mAudioHardware; 789 mutable int mHardwareStatus; 790 791 792 DefaultKeyedVector< int, sp<PlaybackThread> > mPlaybackThreads; 793 PlaybackThread::stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES]; 794 float mMasterVolume; 795 bool mMasterMute; 796 797 DefaultKeyedVector< int, sp<RecordThread> > mRecordThreads; 798 799 SortedVector< sp<IBinder> > mNotificationClients; 800 int mNextThreadId; 801 }; 802 803 // ---------------------------------------------------------------------------- 804 805 }; // namespace android 806 807 #endif // ANDROID_AUDIO_FLINGER_H 808