diff options
| author | 2015-03-09 08:36:35 -0700 | |
|---|---|---|
| committer | 2015-03-09 08:40:12 -0700 | |
| commit | 18c225d05480e7b80b312ef90d15789b34ce6bbc (patch) | |
| tree | 749c3889c36db67a316898f6a998826fdd13f393 | |
| parent | b801f73343194cd081f675a5dc2b3e90959cf6d1 (diff) | |
Revert "soundpool: reuse channel for same sample if available"
This reverts commit 570576b51b8123ab05b36707ec752cf966292ca5.
Bug: 19635137
Change-Id: I8385ac4c151a375c19c3606698081c947b6216e3
| -rw-r--r-- | media/jni/soundpool/SoundPool.cpp | 83 | ||||
| -rw-r--r-- | media/jni/soundpool/SoundPool.h | 4 | 
2 files changed, 34 insertions, 53 deletions
| diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp index 8957b3cb1362..a73209bf1979 100644 --- a/media/jni/soundpool/SoundPool.cpp +++ b/media/jni/soundpool/SoundPool.cpp @@ -256,7 +256,7 @@ int SoundPool::play(int sampleID, float leftVolume, float rightVolume,      dump();      // allocate a channel -    channel = allocateChannel_l(priority, sampleID); +    channel = allocateChannel_l(priority);      // no channel allocated - return 0      if (!channel) { @@ -271,25 +271,13 @@ int SoundPool::play(int sampleID, float leftVolume, float rightVolume,      return channelID;  } -SoundChannel* SoundPool::allocateChannel_l(int priority, int sampleID) +SoundChannel* SoundPool::allocateChannel_l(int priority)  {      List<SoundChannel*>::iterator iter;      SoundChannel* channel = NULL; -    // check if channel for given sampleID still available +    // allocate a channel      if (!mChannels.empty()) { -        for (iter = mChannels.begin(); iter != mChannels.end(); ++iter) { -            if (sampleID == (*iter)->getPrevSampleID() && (*iter)->state() == SoundChannel::IDLE) { -                channel = *iter; -                mChannels.erase(iter); -                ALOGV("Allocated recycled channel for same sampleID"); -                break; -            } -        } -    } - -    // allocate any channel -    if (!channel && !mChannels.empty()) {          iter = mChannels.begin();          if (priority >= (*iter)->priority()) {              channel = *iter; @@ -660,7 +648,6 @@ error:  void SoundChannel::init(SoundPool* soundPool)  {      mSoundPool = soundPool; -    mPrevSampleID = -1;  }  // call with sound pool lock held @@ -669,7 +656,7 @@ void SoundChannel::play(const sp<Sample>& sample, int nextChannelID, float leftV  {      sp<AudioTrack> oldTrack;      sp<AudioTrack> newTrack; -    status_t status = NO_ERROR; +    status_t status;      { // scope for the lock          Mutex::Autolock lock(&mLock); @@ -714,41 +701,38 @@ void SoundChannel::play(const sp<Sample>& sample, int nextChannelID, float leftV          }  #endif -        if (!mAudioTrack.get() || mPrevSampleID != sample->sampleID()) { -            // mToggle toggles each time a track is started on a given channel. -            // The toggle is concatenated with the SoundChannel address and passed to AudioTrack -            // as callback user data. This enables the detection of callbacks received from the old -            // audio track while the new one is being started and avoids processing them with -            // wrong audio audio buffer size  (mAudioBufferSize) -            unsigned long toggle = mToggle ^ 1; -            void *userData = (void *)((unsigned long)this | toggle); -            audio_channel_mask_t channelMask = audio_channel_out_mask_from_count(numChannels); - -            // do not create a new audio track if current track is compatible with sample parameters -    #ifdef USE_SHARED_MEM_BUFFER -            newTrack = new AudioTrack(streamType, sampleRate, sample->format(), -                    channelMask, sample->getIMemory(), AUDIO_OUTPUT_FLAG_FAST, callback, userData); -    #else -            uint32_t bufferFrames = (totalFrames + (kDefaultBufferCount - 1)) / kDefaultBufferCount; -            newTrack = new AudioTrack(streamType, sampleRate, sample->format(), -                    channelMask, frameCount, AUDIO_OUTPUT_FLAG_FAST, callback, userData, -                    bufferFrames); -    #endif -            oldTrack = mAudioTrack; -            status = newTrack->initCheck(); -            if (status != NO_ERROR) { -                ALOGE("Error creating AudioTrack"); -                goto exit; -            } -            // From now on, AudioTrack callbacks received with previous toggle value will be ignored. -            mToggle = toggle; -            mAudioTrack = newTrack; -        } else { -            newTrack = mAudioTrack; -            ALOGV("reusing track %p for sample %d", mAudioTrack.get(), sample->sampleID()); +        // mToggle toggles each time a track is started on a given channel. +        // The toggle is concatenated with the SoundChannel address and passed to AudioTrack +        // as callback user data. This enables the detection of callbacks received from the old +        // audio track while the new one is being started and avoids processing them with +        // wrong audio audio buffer size  (mAudioBufferSize) +        unsigned long toggle = mToggle ^ 1; +        void *userData = (void *)((unsigned long)this | toggle); +        audio_channel_mask_t channelMask = audio_channel_out_mask_from_count(numChannels); + +        // do not create a new audio track if current track is compatible with sample parameters +#ifdef USE_SHARED_MEM_BUFFER +        newTrack = new AudioTrack(streamType, sampleRate, sample->format(), +                channelMask, sample->getIMemory(), AUDIO_OUTPUT_FLAG_FAST, callback, userData); +#else +        uint32_t bufferFrames = (totalFrames + (kDefaultBufferCount - 1)) / kDefaultBufferCount; +        newTrack = new AudioTrack(streamType, sampleRate, sample->format(), +                channelMask, frameCount, AUDIO_OUTPUT_FLAG_FAST, callback, userData, +                bufferFrames); +#endif +        oldTrack = mAudioTrack; +        status = newTrack->initCheck(); +        if (status != NO_ERROR) { +            ALOGE("Error creating AudioTrack"); +            goto exit;          } +        ALOGV("setVolume %p", newTrack.get());          newTrack->setVolume(leftVolume, rightVolume);          newTrack->setLoop(0, frameCount, loop); + +        // From now on, AudioTrack callbacks received with previous toggle value will be ignored. +        mToggle = toggle; +        mAudioTrack = newTrack;          mPos = 0;          mSample = sample;          mChannelID = nextChannelID; @@ -891,7 +875,6 @@ bool SoundChannel::doStop_l()          setVolume_l(0, 0);          ALOGV("stop");          mAudioTrack->stop(); -        mPrevSampleID = mSample->sampleID();          mSample.clear();          mState = IDLE;          mPriority = IDLE_PRIORITY; diff --git a/media/jni/soundpool/SoundPool.h b/media/jni/soundpool/SoundPool.h index f520406e8753..9d9cbdf701af 100644 --- a/media/jni/soundpool/SoundPool.h +++ b/media/jni/soundpool/SoundPool.h @@ -136,7 +136,6 @@ public:      void nextEvent();      int nextChannelID() { return mNextEvent.channelID(); }      void dump(); -    int getPrevSampleID(void) { return mPrevSampleID; }  private:      static void callback(int event, void* user, void *info); @@ -153,7 +152,6 @@ private:      int                 mAudioBufferSize;      unsigned long       mToggle;      bool                mAutoPaused; -    int                 mPrevSampleID;  };  // application object for managing a pool of sounds @@ -195,7 +193,7 @@ private:      sp<Sample> findSample(int sampleID) { return mSamples.valueFor(sampleID); }      SoundChannel* findChannel (int channelID);      SoundChannel* findNextChannel (int channelID); -    SoundChannel* allocateChannel_l(int priority, int sampleID); +    SoundChannel* allocateChannel_l(int priority);      void moveToFront_l(SoundChannel* channel);      void notify(SoundPoolEvent event);      void dump(); |