diff options
| -rw-r--r-- | core/jni/android_media_AudioRecord.cpp | 2 | ||||
| -rw-r--r-- | core/jni/android_media_AudioSystem.cpp | 2 | ||||
| -rw-r--r-- | core/jni/android_media_ToneGenerator.cpp | 2 | ||||
| -rw-r--r-- | include/media/AudioSystem.h | 2 | ||||
| -rw-r--r-- | include/media/AudioTrack.h | 46 | ||||
| -rw-r--r-- | include/media/EffectsFactoryApi.h | 8 | ||||
| -rw-r--r-- | include/media/IAudioTrack.h | 8 | ||||
| -rw-r--r-- | include/media/MemoryLeakTrackUtil.h | 2 | ||||
| -rw-r--r-- | include/private/media/AudioTrackShared.h | 29 | ||||
| -rw-r--r-- | include/utils/KeyedVector.h | 2 | ||||
| -rw-r--r-- | media/jni/soundpool/SoundPool.cpp | 2 | ||||
| -rw-r--r-- | media/libmedia/AudioTrack.cpp | 15 | ||||
| -rw-r--r-- | media/libmedia/IAudioTrack.cpp | 2 | ||||
| -rw-r--r-- | media/libmedia/ToneGenerator.cpp | 2 | ||||
| -rw-r--r-- | media/libmedia/mediaplayer.cpp | 2 | ||||
| -rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 10 | ||||
| -rw-r--r-- | services/audioflinger/AudioFlinger.h | 16 | ||||
| -rw-r--r-- | services/audioflinger/AudioMixer.cpp | 7 | ||||
| -rw-r--r-- | services/audioflinger/AudioMixer.h | 2 | 
19 files changed, 107 insertions, 54 deletions
| diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp index 547607ec2947..68a8de8f7c70 100644 --- a/core/jni/android_media_AudioRecord.cpp +++ b/core/jni/android_media_AudioRecord.cpp @@ -220,7 +220,7 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this,          ALOGE("Error creating AudioRecord: Error retrieving session id pointer");          goto native_init_failure;      } -    // read the audio session ID back from AudioTrack in case a new session was created during set() +    // read the audio session ID back from AudioRecord in case a new session was created during set()      nSession[0] = lpRecorder->getSessionId();      env->ReleasePrimitiveArrayCritical(jSession, nSession, 0);      nSession = NULL; diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 31c5ed482a3d..ee5eb7e87506 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -1,4 +1,4 @@ -/* //device/libs/android_runtime/android_media_AudioSystem.cpp +/*  **  ** Copyright 2006, The Android Open Source Project  ** diff --git a/core/jni/android_media_ToneGenerator.cpp b/core/jni/android_media_ToneGenerator.cpp index 0a337fae781e..544b4c09661f 100644 --- a/core/jni/android_media_ToneGenerator.cpp +++ b/core/jni/android_media_ToneGenerator.cpp @@ -1,4 +1,4 @@ -/* //device/libs/android_runtime/android_media_AudioSystem.cpp +/*   **   ** Copyright 2008, The Android Open Source Project   ** diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h index da99620ea039..1916ac5fd781 100644 --- a/include/media/AudioSystem.h +++ b/include/media/AudioSystem.h @@ -131,7 +131,7 @@ public:          NUM_CONFIG_EVENTS      }; -    // audio output descritor used to cache output configurations in client process to avoid frequent calls +    // audio output descriptor used to cache output configurations in client process to avoid frequent calls      // through IAudioFlinger      class OutputDescriptor {      public: diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index 03a30888278e..ac7f6cf22c10 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -58,8 +58,8 @@ public:          EVENT_BUFFER_END = 5        // Playback head is at the end of the buffer.      }; -    /* Create Buffer on the stack and pass it to obtainBuffer() -     * and releaseBuffer(). +    /* Client should declare Buffer on the stack and pass address to obtainBuffer() +     * and releaseBuffer().  See also callback_t for EVENT_MORE_DATA.       */      class Buffer @@ -68,12 +68,16 @@ public:          enum {              MUTE    = 0x00000001          }; -        uint32_t    flags; +        uint32_t    flags;        // 0 or MUTE          audio_format_t format; // but AUDIO_FORMAT_PCM_8_BIT -> AUDIO_FORMAT_PCM_16_BIT          // accessed directly by WebKit ANP callback          int         channelCount; // will be removed in the future, do not use -        size_t      frameCount; -        size_t      size; + +        size_t      frameCount;   // number of sample frames corresponding to size; +                                  // on input it is the number of frames desired, +                                  // on output is the number of frames actually filled + +        size_t      size;         // input/output in byte units          union {              void*       raw;              short*      i16;    // signed 16-bit @@ -84,15 +88,15 @@ public:      /* As a convenience, if a callback is supplied, a handler thread       * is automatically created with the appropriate priority. This thread -     * invokes the callback when a new buffer becomes available or an underrun condition occurs. +     * invokes the callback when a new buffer becomes available or various conditions occur.       * Parameters:       *       * event:   type of event notified (see enum AudioTrack::event_type).       * user:    Pointer to context for use by the callback receiver.       * info:    Pointer to optional parameter according to event type:       *          - EVENT_MORE_DATA: pointer to AudioTrack::Buffer struct. The callback must not write -     *          more bytes than indicated by 'size' field and update 'size' if less bytes are -     *          written. +     *            more bytes than indicated by 'size' field and update 'size' if fewer bytes are +     *            written.       *          - EVENT_UNDERRUN: unused.       *          - EVENT_LOOP_END: pointer to an int indicating the number of loops remaining.       *          - EVENT_MARKER: pointer to an uint32_t containing the marker position in frames. @@ -225,7 +229,7 @@ public:       */              uint32_t     latency() const; -    /* getters, see constructor */ +    /* getters, see constructors and set() */              audio_stream_type_t streamType() const;              audio_format_t format() const; @@ -400,13 +404,19 @@ public:              status_t    attachAuxEffect(int effectId);      /* Obtains a buffer of "frameCount" frames. The buffer must be -     * filled entirely. If the track is stopped, obtainBuffer() returns +     * filled entirely, and then released with releaseBuffer(). +     * If the track is stopped, obtainBuffer() returns       * STOPPED instead of NO_ERROR as long as there are buffers available,       * at which point NO_MORE_BUFFERS is returned.       * Buffers will be returned until the pool (buffercount())       * is exhausted, at which point obtainBuffer() will either block       * or return WOULD_BLOCK depending on the value of the "blocking"       * parameter. +     * +     * Interpretation of waitCount: +     *  +n  limits wait time to n * WAIT_PERIOD_MS, +     *  -1  causes an (almost) infinite wait time, +     *   0  non-blocking.       */          enum { @@ -415,12 +425,19 @@ public:          };              status_t    obtainBuffer(Buffer* audioBuffer, int32_t waitCount); + +    /* Release a filled buffer of "frameCount" frames for AudioFlinger to process. */              void        releaseBuffer(Buffer* audioBuffer);      /* As a convenience we provide a write() interface to the audio buffer. -     * This is implemented on top of lockBuffer/unlockBuffer. For best -     * performance use callbacks. Return actual number of bytes written. -     * +     * This is implemented on top of obtainBuffer/releaseBuffer. For best +     * performance use callbacks. Returns actual number of bytes written >= 0, +     * or one of the following negative status codes: +     *      INVALID_OPERATION   AudioTrack is configured for shared buffer mode +     *      BAD_VALUE           size is invalid +     *      STOPPED             AudioTrack was stopped during the write +     *      NO_MORE_BUFFERS     when obtainBuffer() returns same +     *      or any other error code returned by IAudioTrack::start() or restoreTrack_l().       */              ssize_t     write(const void* buffer, size_t size); @@ -447,6 +464,7 @@ private:          AudioTrack& mReceiver;      }; +            // body of AudioTrackThread::threadLoop()              bool processAudioBuffer(const sp<AudioTrackThread>& thread);              status_t createTrack_l(audio_stream_type_t streamType,                                   uint32_t sampleRate, @@ -483,7 +501,7 @@ private:      bool                    mActive;                // protected by mLock -    callback_t              mCbf; +    callback_t              mCbf;                   // callback handler for events, or NULL      void*                   mUserData;      uint32_t                mNotificationFramesReq; // requested number of frames between each notification callback      uint32_t                mNotificationFramesAct; // actual number of frames between each notification callback diff --git a/include/media/EffectsFactoryApi.h b/include/media/EffectsFactoryApi.h index df83995aab19..65c26f4794be 100644 --- a/include/media/EffectsFactoryApi.h +++ b/include/media/EffectsFactoryApi.h @@ -87,7 +87,7 @@ int EffectQueryEffect(uint32_t index, effect_descriptor_t *pDescriptor);  //    Description:    Creates an effect engine of the specified type and returns an  //          effect control interface on this engine. The function will allocate the  //          resources for an instance of the requested effect engine and return -//          a handler on the effect control interface. +//          a handle on the effect control interface.  //  //    Input:  //          pEffectUuid:    pointer to the effect uuid. @@ -115,17 +115,17 @@ int EffectCreate(const effect_uuid_t *pEffectUuid, int32_t sessionId, int32_t io  //  //    Function:       EffectRelease  // -//    Description:    Releases the effect engine whose handler is given as argument. +//    Description:    Releases the effect engine whose handle is given as argument.  //          All resources allocated to this particular instance of the effect are  //          released.  //  //    Input: -//          handle:    handler on the effect interface to be released. +//          handle:    handle on the effect interface to be released.  //  //    Output:  //        returned value:    0          successful operation.  //                          -ENODEV     factory failed to initialize -//                          -EINVAL     invalid interface handler +//                          -EINVAL     invalid interface handle  //  ////////////////////////////////////////////////////////////////////////////////  int EffectRelease(effect_handle_t handle); diff --git a/include/media/IAudioTrack.h b/include/media/IAudioTrack.h index b346722aa5d1..e4772a17edec 100644 --- a/include/media/IAudioTrack.h +++ b/include/media/IAudioTrack.h @@ -46,12 +46,12 @@ public:      /* Stop a track. If set, the callback will cease being called and       * obtainBuffer will return an error. Buffers that are already released  -     * will be processed, unless flush() is called. +     * will continue to be processed, unless/until flush() is called.       */      virtual void        stop() = 0; -    /* Flush a stopped track. All pending buffers are discarded. -     * This function has no effect if the track is not stopped. +    /* Flush a stopped or paused track. All pending/released buffers are discarded. +     * This function has no effect if the track is not stopped or paused.       */      virtual void        flush() = 0; @@ -62,7 +62,7 @@ public:      /* Pause a track. If set, the callback will cease being called and       * obtainBuffer will return an error. Buffers that are already released  -     * will be processed, unless flush() is called. +     * will continue to be processed, unless/until flush() is called.       */      virtual void        pause() = 0; diff --git a/include/media/MemoryLeakTrackUtil.h b/include/media/MemoryLeakTrackUtil.h index 290b7481712f..ac0f6b266b6d 100644 --- a/include/media/MemoryLeakTrackUtil.h +++ b/include/media/MemoryLeakTrackUtil.h @@ -19,7 +19,7 @@  namespace android {  /* - * Dump the memory adddress of the calling process to the given fd. + * Dump the memory address of the calling process to the given fd.   */  extern void dumpMemoryAddresses(int fd); diff --git a/include/private/media/AudioTrackShared.h b/include/private/media/AudioTrackShared.h index 23226c0f3505..af2db9379f31 100644 --- a/include/private/media/AudioTrackShared.h +++ b/include/private/media/AudioTrackShared.h @@ -62,16 +62,23 @@ struct audio_track_cblk_t      // are in the same line of data cache.                  Mutex       lock;           // sizeof(int)                  Condition   cv;             // sizeof(int) + +                // next 4 are offsets within "buffers"      volatile    uint32_t    user;      volatile    uint32_t    server;                  uint32_t    userBase;                  uint32_t    serverBase; + +                // if there is a shared buffer, "buffers" is the value of pointer() for the shared +                // buffer, otherwise "buffers" points immediately after the control block                  void*       buffers;                  uint32_t    frameCount; +                  // Cache line boundary +                  uint32_t    loopStart; -                uint32_t    loopEnd; -                int         loopCount; +                uint32_t    loopEnd;        // read-only for server, read/write for client +                int         loopCount;      // read/write for client                  // Channel volumes are fixed point U4.12, so 0x1000 means 1.0.                  // Left channel is in [0:15], right channel is in [16:31]. @@ -82,29 +89,39 @@ private:  public:                  uint32_t    sampleRate; +                  // NOTE: audio_track_cblk_t::frameSize is not equal to AudioTrack::frameSize() for                  // 8 bit PCM data: in this case,  mCblk->frameSize is based on a sample size of                  // 16 bit because data is converted to 16 bit before being stored in buffer +                // read-only for client, server writes once at initialization and is then read-only                  uint8_t     frameSize;       // would normally be size_t, but 8 bits is plenty + +                // never used                  uint8_t     pad1; + +                // used by client only                  uint16_t    bufferTimeoutMs; // Maximum cumulated timeout before restarting audioflinger -                uint16_t    waitTimeMs;      // Cumulated wait time +                uint16_t    waitTimeMs;      // Cumulated wait time, used by client only  private: +                // client write-only, server read-only                  uint16_t    mSendLevel;      // Fixed point U4.12 so 0x1000 means 1.0  public:      volatile    int32_t     flags;                  // Cache line boundary (32 bytes) +                // Since the control block is always located in shared memory, this constructor +                // is only used for placement new().  It is never used for regular new() or stack.                              audio_track_cblk_t(); -                uint32_t    stepUser(uint32_t frameCount); -                bool        stepServer(uint32_t frameCount); +                uint32_t    stepUser(uint32_t frameCount);      // called by client only, where +                // client includes regular AudioTrack and AudioFlinger::PlaybackThread::OutputTrack +                bool        stepServer(uint32_t frameCount);    // called by server only                  void*       buffer(uint32_t offset) const;                  uint32_t    framesAvailable();                  uint32_t    framesAvailable_l(); -                uint32_t    framesReady(); +                uint32_t    framesReady();                      // called by server only                  bool        tryLock();                  // No barriers on the following operations, so the ordering of loads/stores diff --git a/include/utils/KeyedVector.h b/include/utils/KeyedVector.h index 6bcdea4ff182..fcc3bcfa00a1 100644 --- a/include/utils/KeyedVector.h +++ b/include/utils/KeyedVector.h @@ -66,7 +66,7 @@ public:              ssize_t         indexOfKey(const KEY& key) const;      /*! -     * modifing the array +     * modifying the array       */              VALUE&          editValueFor(const KEY& key); diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp index df4fbb55bc7e..ceb87db12aee 100644 --- a/media/jni/soundpool/SoundPool.cpp +++ b/media/jni/soundpool/SoundPool.cpp @@ -623,7 +623,7 @@ void SoundChannel::play(const sp<Sample>& sample, int nextChannelID, float leftV          newTrack->setVolume(leftVolume, rightVolume);          newTrack->setLoop(0, frameCount, loop); -        // From now on, AudioTrack callbacks recevieved with previous toggle value will be ignored. +        // From now on, AudioTrack callbacks received with previous toggle value will be ignored.          mToggle = toggle;          mAudioTrack = newTrack;          mPos = 0; diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index e91678aeb4e7..aead9a1654be 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -1,4 +1,4 @@ -/* frameworks/base/media/libmedia/AudioTrack.cpp +/*  **  ** Copyright 2007, The Android Open Source Project  ** @@ -772,7 +772,7 @@ status_t AudioTrack::createTrack_l(                  }              }          } else { -            // Ensure that buffer alignment matches channelcount +            // Ensure that buffer alignment matches channelCount              int channelCount = popcount(channelMask);              if (((uint32_t)sharedBuffer->pointer() & (channelCount | 1)) != 0) {                  ALOGE("Invalid buffer alignement: address %p, channelCount %d", sharedBuffer->pointer(), channelCount); @@ -959,7 +959,8 @@ ssize_t AudioTrack::write(const void* buffer, size_t userSize)      if (mSharedBuffer != 0) return INVALID_OPERATION;      if (ssize_t(userSize) < 0) { -        // sanity-check. user is most-likely passing an error code. +        // Sanity-check: user is most-likely passing an error code, and it would +        // make the return value ambiguous (actualSize vs error).          ALOGE("AudioTrack::write(buffer=%p, size=%u (%d)",                  buffer, userSize, userSize);          return BAD_VALUE; @@ -982,8 +983,6 @@ ssize_t AudioTrack::write(const void* buffer, size_t userSize)      do {          audioBuffer.frameCount = userSize/frameSz; -        // Calling obtainBuffer() with a negative wait count causes -        // an (almost) infinite wait time.          status_t err = obtainBuffer(&audioBuffer, -1);          if (err < 0) {              // out of buffers, return #bytes written @@ -1073,6 +1072,9 @@ bool AudioTrack::processAudioBuffer(const sp<AudioTrackThread>& thread)          frames = mRemainingFrames;      } +    // See description of waitCount parameter at declaration of obtainBuffer(). +    // The logic below prevents us from being stuck below at obtainBuffer() +    // not being able to handle timed events (position, markers, loops).      int32_t waitCount = -1;      if (mUpdatePeriod || (!mMarkerReached && mMarkerPosition) || mLoopCount) {          waitCount = 1; @@ -1082,9 +1084,6 @@ bool AudioTrack::processAudioBuffer(const sp<AudioTrackThread>& thread)          audioBuffer.frameCount = frames; -        // Calling obtainBuffer() with a wait count of 1 -        // limits wait time to WAIT_PERIOD_MS. This prevents from being -        // stuck here not being able to handle timed events (position, markers, loops).          status_t err = obtainBuffer(&audioBuffer, waitCount);          if (err < NO_ERROR) {              if (err != TIMED_OUT) { diff --git a/media/libmedia/IAudioTrack.cpp b/media/libmedia/IAudioTrack.cpp index 37246424e0d3..a7958debe1ae 100644 --- a/media/libmedia/IAudioTrack.cpp +++ b/media/libmedia/IAudioTrack.cpp @@ -1,4 +1,4 @@ -/* //device/extlibs/pv/android/IAudioTrack.cpp +/*  **  ** Copyright 2007, The Android Open Source Project  ** diff --git a/media/libmedia/ToneGenerator.cpp b/media/libmedia/ToneGenerator.cpp index 6cb10aa4e3ad..54eb98a963c9 100644 --- a/media/libmedia/ToneGenerator.cpp +++ b/media/libmedia/ToneGenerator.cpp @@ -791,7 +791,7 @@ const unsigned char /*tone_type*/ ToneGenerator::sToneMappingTable[NUM_REGIONS-1  //        generators, instantiates output audio track.  //  //    Input: -//        streamType:        Type of stream used for tone playback (enum AudioTrack::stream_type) +//        streamType:        Type of stream used for tone playback  //        volume:            volume applied to tone (0.0 to 1.0)  //  //    Output: diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp index f1c47dd91b40..250425b5d5b0 100644 --- a/media/libmedia/mediaplayer.cpp +++ b/media/libmedia/mediaplayer.cpp @@ -1,4 +1,4 @@ -/* mediaplayer.cpp +/*  **  ** Copyright 2006, The Android Open Source Project  ** diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 878df2d3e815..c8807fabc333 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -1,4 +1,4 @@ -/* //device/include/server/AudioFlinger/AudioFlinger.cpp +/*  **  ** Copyright 2007, The Android Open Source Project  ** @@ -621,6 +621,7 @@ status_t AudioFlinger::setMasterMute(bool muted)      }      Mutex::Autolock _l(mLock); +    // This is an optimization, so PlaybackThread doesn't have to look at the one from AudioFlinger      mMasterMute = muted;      for (size_t i = 0; i < mPlaybackThreads.size(); i++)         mPlaybackThreads.valueAt(i)->setMasterMute(muted); @@ -3122,6 +3123,7 @@ bool AudioFlinger::DuplicatingThread::threadLoop()  void AudioFlinger::DuplicatingThread::addOutputTrack(MixerThread *thread)  { +    // FIXME explain this formula      int frameCount = (3 * mFrameCount * mSampleRate) / thread->sampleRate();      OutputTrack *outputTrack = new OutputTrack((ThreadBase *)thread,                                              this, @@ -3393,7 +3395,7 @@ void AudioFlinger::PlaybackThread::Track::destroy()  {      // NOTE: destroyTrack_l() can remove a strong reference to this Track      // by removing it from mTracks vector, so there is a risk that this Tracks's -    // desctructor is called. As the destructor needs to lock mLock, +    // destructor is called. As the destructor needs to lock mLock,      // we must acquire a strong reference on this Track before locking mLock      // here so that the destructor is called only when exiting this function.      // On the other hand, as long as Track::destroy() is only called by @@ -3999,6 +4001,7 @@ void AudioFlinger::PlaybackThread::OutputTrack::clearBufferQueue()  AudioFlinger::Client::Client(const sp<AudioFlinger>& audioFlinger, pid_t pid)      :   RefBase(),          mAudioFlinger(audioFlinger), +        // FIXME should be a "k" constant not hard-coded, in .h or ro. property, see 4 lines below          mMemoryDealer(new MemoryDealer(1024*1024, "AudioFlinger::Client")),          mPid(pid)  { @@ -4660,7 +4663,7 @@ bool AudioFlinger::RecordThread::checkForNewParameters_l()          }          if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {              // do not accept frame count changes if tracks are open as the track buffer -            // size depends on frame count and correct behavior would not be garantied +            // size depends on frame count and correct behavior would not be guaranteed              // if frame count is changed after track creation              if (mActiveTrack != 0) {                  status = INVALID_OPERATION; @@ -6108,7 +6111,6 @@ status_t AudioFlinger::EffectModule::addHandle(const sp<EffectHandle>& handle)      status_t status;      Mutex::Autolock _l(mLock); -    // First handle in mHandles has highest priority and controls the effect module      int priority = handle->priority();      size_t size = mHandles.size();      sp<EffectHandle> h; diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index aa0ee7630785..48a23fabad94 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -1,4 +1,4 @@ -/* //device/include/server/AudioFlinger/AudioFlinger.h +/*  **  ** Copyright 2007, The Android Open Source Project  ** @@ -290,6 +290,8 @@ private:              enum track_state {                  IDLE,                  TERMINATED, +                // These are order-sensitive; do not change order without reviewing the impact. +                // In particular there are assumptions about > STOPPED.                  STOPPED,                  RESUMING,                  ACTIVE, @@ -760,6 +762,9 @@ private:          int                             mSuspended;          int                             mBytesWritten;      private: +        // mMasterMute is in both PlaybackThread and in AudioFlinger.  When a +        // PlaybackThread needs to find out if master-muted, it checks it's local +        // copy rather than the one in AudioFlinger.  This optimization saves a lock.          bool                            mMasterMute;      protected:          SortedVector< wp<Track> >       mActiveTracks; @@ -853,6 +858,8 @@ private:      private:          void applyVolume(uint16_t leftVol, uint16_t rightVol, bool ramp); +        // volumes last sent to audio HAL with stream->set_volume() +        // FIXME use standard representation and names          float mLeftVolFloat;          float mRightVolFloat;          uint16_t mLeftVolShort; @@ -900,6 +907,7 @@ private:      friend class AudioBuffer; +    // server side of the client's IAudioTrack      class TrackHandle : public android::BnAudioTrack {      public:                              TrackHandle(const sp<PlaybackThread::Track>& track); @@ -1024,6 +1032,7 @@ private:                  ssize_t                             mBytesRead;      }; +    // server side of the client's IAudioRecord      class RecordHandle : public android::BnAudioRecord {      public:          RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack); @@ -1152,6 +1161,7 @@ mutable Mutex               mLock;      // mutex for process, commands and handl          status_t            mStatus;    // initialization status          effect_state        mState;     // current activation state          Vector< wp<EffectHandle> > mHandles;    // list of client handles +                    // First handle in mHandles has highest priority and controls the effect module          uint32_t mMaxDisableWaitCnt;    // maximum grace period before forcing an effect off after                                          // sending disable command.          uint32_t mDisableWaitCnt;       // current process() calls count during disable period. @@ -1377,6 +1387,7 @@ mutable Mutex               mLock;      // mutex for process, commands and handl              hwDev(dev), stream(in) {}      }; +    // for mAudioSessionRefs only      struct AudioSessionRef {          // FIXME rename parameter names when fields get "m" prefix          AudioSessionRef(int sessionid_, pid_t pid_) : @@ -1432,10 +1443,11 @@ mutable Mutex               mLock;      // mutex for process, commands and handl                  DefaultKeyedVector< audio_io_handle_t, sp<RecordThread> >    mRecordThreads;                  DefaultKeyedVector< pid_t, sp<NotificationClient> >    mNotificationClients; -                volatile int32_t                    mNextUniqueId; +                volatile int32_t                    mNextUniqueId;  // updated by android_atomic_inc                  audio_mode_t                        mMode;                  bool                                mBtNrecIsOff; +                // protected by mLock                  Vector<AudioSessionRef*> mAudioSessionRefs;                  float       masterVolume_l() const  { return mMasterVolume; } diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp index 191520a33a54..cb7678b23e71 100644 --- a/services/audioflinger/AudioMixer.cpp +++ b/services/audioflinger/AudioMixer.cpp @@ -1,4 +1,4 @@ -/* //device/include/server/AudioFlinger/AudioMixer.cpp +/*  **  ** Copyright 2007, The Android Open Source Project  ** @@ -961,7 +961,12 @@ void AudioMixer::process__genericResampling(state_t* state)  // one track, 16 bits stereo without resampling is the most common case  void AudioMixer::process__OneTrack16BitsStereoNoResampling(state_t* state)  { +    // This method is only called when state->enabledTracks has exactly +    // one bit set.  The asserts below would verify this, but are commented out +    // since the whole point of this method is to optimize performance. +    //assert(0 != state->enabledTracks);      const int i = 31 - __builtin_clz(state->enabledTracks); +    //assert((1 << i) == state->enabledTracks);      const track_t& t = state->tracks[i];      AudioBufferProvider::Buffer& b(t.buffer); diff --git a/services/audioflinger/AudioMixer.h b/services/audioflinger/AudioMixer.h index c709686f6825..c95691865c8c 100644 --- a/services/audioflinger/AudioMixer.h +++ b/services/audioflinger/AudioMixer.h @@ -1,4 +1,4 @@ -/* //device/include/server/AudioFlinger/AudioMixer.h +/*  **  ** Copyright 2007, The Android Open Source Project  ** |