diff options
| author | Eric Laurent <elaurent@google.com> | 2011-08-30 10:51:54 -0700 | 
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-08-30 10:51:54 -0700 | 
| commit | b76e90de3c64626fe07a68469d0a59a31c8efb6b (patch) | |
| tree | b8ced112fa7e83a34898679552a26744610ce0e1 /services | |
| parent | 1619f3d3428e9d502dc477d31e0681fe1cd12b89 (diff) | |
| parent | 9f6530f53ae9eda43f4e7c1cb30d2379db00aa00 (diff) | |
| download | frameworks_av-b76e90de3c64626fe07a68469d0a59a31c8efb6b.zip frameworks_av-b76e90de3c64626fe07a68469d0a59a31c8efb6b.tar.gz frameworks_av-b76e90de3c64626fe07a68469d0a59a31c8efb6b.tar.bz2  | |
Merge "226483: A2DP connected, but music out to speaker"
Diffstat (limited to 'services')
| -rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 20 | ||||
| -rw-r--r-- | services/audioflinger/AudioFlinger.h | 6 | 
2 files changed, 25 insertions, 1 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index d617af8..94efa74 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -1362,6 +1362,7 @@ AudioFlinger::PlaybackThread::PlaybackThread(const sp<AudioFlinger>& audioFlinge      for (int stream = 0; stream < AUDIO_STREAM_CNT; stream++) {          mStreamTypes[stream].volume = mAudioFlinger->streamVolumeInternal(stream);          mStreamTypes[stream].mute = mAudioFlinger->streamMute(stream); +        mStreamTypes[stream].valid = true;      }  } @@ -1530,6 +1531,14 @@ sp<AudioFlinger::PlaybackThread::Track>  AudioFlinger::PlaybackThread::createTra              chain->setStrategy(AudioSystem::getStrategyForStream((audio_stream_type_t)track->type()));              chain->incTrackCnt();          } + +        // invalidate track immediately if the stream type was moved to another thread since +        // createTrack() was called by the client process. +        if (!mStreamTypes[streamType].valid) { +            LOGW("createTrack_l() on thread %p: invalidating track on stream %d", +                 this, streamType); +            android_atomic_or(CBLK_INVALID_ON, &track->mCblk->flags); +        }      }      lStatus = NO_ERROR; @@ -2219,6 +2228,14 @@ void AudioFlinger::MixerThread::invalidateTracks(int streamType)      }  } +void AudioFlinger::PlaybackThread::setStreamValid(int streamType, bool valid) +{ +    LOGV ("PlaybackThread::setStreamValid() thread %p, streamType %d, valid %d", +            this,  streamType, valid); +    Mutex::Autolock _l(mLock); + +    mStreamTypes[streamType].valid = valid; +}  // getTrackName_l() must be called with ThreadBase::mLock held  int AudioFlinger::MixerThread::getTrackName_l() @@ -5074,11 +5091,14 @@ status_t AudioFlinger::setStreamOutput(uint32_t stream, int output)      LOGV("setStreamOutput() stream %d to output %d", stream, output);      audioConfigChanged_l(AudioSystem::STREAM_CONFIG_CHANGED, output, &stream); +    dstThread->setStreamValid(stream, true); +      for (size_t i = 0; i < mPlaybackThreads.size(); i++) {          PlaybackThread *thread = mPlaybackThreads.valueAt(i).get();          if (thread != dstThread &&              thread->type() != ThreadBase::DIRECT) {              MixerThread *srcThread = (MixerThread *)thread; +            srcThread->setStreamValid(stream, false);              srcThread->invalidateTracks(stream);          }      } diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index 1ceb0ec..2e05593 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -751,14 +751,18 @@ private:                      virtual uint32_t hasAudioSession(int sessionId);                      virtual uint32_t getStrategyForSession_l(int sessionId); +                            void setStreamValid(int streamType, bool valid); +          struct  stream_type_t {              stream_type_t()                  :   volume(1.0f), -                    mute(false) +                    mute(false), +                    valid(true)              {              }              float       volume;              bool        mute; +            bool        valid;          };      protected:  | 
