Loading services/audioflinger/AudioFlinger.cpp +15 −5 Original line number Diff line number Diff line Loading @@ -646,8 +646,12 @@ status_t AudioFlinger::setMasterVolume(float value) // assigned to HALs which do not have master volume support will apply // master volume during the mix operation. Threads with HALs which do // support master volume will simply ignore the setting. for (size_t i = 0; i < mPlaybackThreads.size(); i++) for (size_t i = 0; i < mPlaybackThreads.size(); i++) { if (mPlaybackThreads.valueAt(i)->isDuplicating()) { continue; } mPlaybackThreads.valueAt(i)->setMasterVolume(value); } return NO_ERROR; } Loading Loading @@ -753,8 +757,12 @@ status_t AudioFlinger::setMasterMute(bool muted) // assigned to HALs which do not have master mute support will apply master // mute during the mix operation. Threads with HALs which do support master // mute will simply ignore the setting. for (size_t i = 0; i < mPlaybackThreads.size(); i++) for (size_t i = 0; i < mPlaybackThreads.size(); i++) { if (mPlaybackThreads.valueAt(i)->isDuplicating()) { continue; } mPlaybackThreads.valueAt(i)->setMasterMute(muted); } return NO_ERROR; } Loading Loading @@ -1596,11 +1604,10 @@ status_t AudioFlinger::closeOutput_nonvirtual(audio_io_handle_t output) if (thread->type() == ThreadBase::MIXER) { for (size_t i = 0; i < mPlaybackThreads.size(); i++) { if (mPlaybackThreads.valueAt(i)->type() == ThreadBase::DUPLICATING) { if (mPlaybackThreads.valueAt(i)->isDuplicating()) { DuplicatingThread *dupThread = (DuplicatingThread *)mPlaybackThreads.valueAt(i).get(); dupThread->removeOutputTrack((MixerThread *)thread.get()); } } } Loading @@ -1627,7 +1634,7 @@ status_t AudioFlinger::closeOutput_nonvirtual(audio_io_handle_t output) // The thread entity (active unit of execution) is no longer running here, // but the ThreadBase container still exists. if (thread->type() != ThreadBase::DUPLICATING) { if (!thread->isDuplicating()) { AudioStreamOut *out = thread->clearOutput(); ALOG_ASSERT(out != NULL, "out shouldn't be NULL"); // from now on thread->mOutput is NULL Loading Loading @@ -2000,6 +2007,9 @@ AudioFlinger::PlaybackThread *AudioFlinger::primaryPlaybackThread_l() const { for (size_t i = 0; i < mPlaybackThreads.size(); i++) { PlaybackThread *thread = mPlaybackThreads.valueAt(i).get(); if(thread->isDuplicating()) { continue; } AudioStreamOut *output = thread->getOutput(); if (output != NULL && output->audioHwDev == mPrimaryHardwareDev) { return thread; Loading services/audioflinger/Threads.cpp +4 −1 Original line number Diff line number Diff line Loading @@ -4306,10 +4306,13 @@ void AudioFlinger::DuplicatingThread::removeOutputTrack(MixerThread *thread) mOutputTracks[i]->destroy(); mOutputTracks.removeAt(i); updateWaitTime_l(); if (thread->getOutput() == mOutput) { mOutput = NULL; } return; } } ALOGV("removeOutputTrack(): unkonwn thread: %p", thread); ALOGV("removeOutputTrack(): unknown thread: %p", thread); } // caller must hold mLock Loading services/audioflinger/Threads.h +2 −0 Original line number Diff line number Diff line Loading @@ -118,6 +118,8 @@ public: // static externally-visible type_t type() const { return mType; } bool isDuplicating() const { return (mType == DUPLICATING); } audio_io_handle_t id() const { return mId;} // dynamic externally-visible Loading Loading
services/audioflinger/AudioFlinger.cpp +15 −5 Original line number Diff line number Diff line Loading @@ -646,8 +646,12 @@ status_t AudioFlinger::setMasterVolume(float value) // assigned to HALs which do not have master volume support will apply // master volume during the mix operation. Threads with HALs which do // support master volume will simply ignore the setting. for (size_t i = 0; i < mPlaybackThreads.size(); i++) for (size_t i = 0; i < mPlaybackThreads.size(); i++) { if (mPlaybackThreads.valueAt(i)->isDuplicating()) { continue; } mPlaybackThreads.valueAt(i)->setMasterVolume(value); } return NO_ERROR; } Loading Loading @@ -753,8 +757,12 @@ status_t AudioFlinger::setMasterMute(bool muted) // assigned to HALs which do not have master mute support will apply master // mute during the mix operation. Threads with HALs which do support master // mute will simply ignore the setting. for (size_t i = 0; i < mPlaybackThreads.size(); i++) for (size_t i = 0; i < mPlaybackThreads.size(); i++) { if (mPlaybackThreads.valueAt(i)->isDuplicating()) { continue; } mPlaybackThreads.valueAt(i)->setMasterMute(muted); } return NO_ERROR; } Loading Loading @@ -1596,11 +1604,10 @@ status_t AudioFlinger::closeOutput_nonvirtual(audio_io_handle_t output) if (thread->type() == ThreadBase::MIXER) { for (size_t i = 0; i < mPlaybackThreads.size(); i++) { if (mPlaybackThreads.valueAt(i)->type() == ThreadBase::DUPLICATING) { if (mPlaybackThreads.valueAt(i)->isDuplicating()) { DuplicatingThread *dupThread = (DuplicatingThread *)mPlaybackThreads.valueAt(i).get(); dupThread->removeOutputTrack((MixerThread *)thread.get()); } } } Loading @@ -1627,7 +1634,7 @@ status_t AudioFlinger::closeOutput_nonvirtual(audio_io_handle_t output) // The thread entity (active unit of execution) is no longer running here, // but the ThreadBase container still exists. if (thread->type() != ThreadBase::DUPLICATING) { if (!thread->isDuplicating()) { AudioStreamOut *out = thread->clearOutput(); ALOG_ASSERT(out != NULL, "out shouldn't be NULL"); // from now on thread->mOutput is NULL Loading Loading @@ -2000,6 +2007,9 @@ AudioFlinger::PlaybackThread *AudioFlinger::primaryPlaybackThread_l() const { for (size_t i = 0; i < mPlaybackThreads.size(); i++) { PlaybackThread *thread = mPlaybackThreads.valueAt(i).get(); if(thread->isDuplicating()) { continue; } AudioStreamOut *output = thread->getOutput(); if (output != NULL && output->audioHwDev == mPrimaryHardwareDev) { return thread; Loading
services/audioflinger/Threads.cpp +4 −1 Original line number Diff line number Diff line Loading @@ -4306,10 +4306,13 @@ void AudioFlinger::DuplicatingThread::removeOutputTrack(MixerThread *thread) mOutputTracks[i]->destroy(); mOutputTracks.removeAt(i); updateWaitTime_l(); if (thread->getOutput() == mOutput) { mOutput = NULL; } return; } } ALOGV("removeOutputTrack(): unkonwn thread: %p", thread); ALOGV("removeOutputTrack(): unknown thread: %p", thread); } // caller must hold mLock Loading
services/audioflinger/Threads.h +2 −0 Original line number Diff line number Diff line Loading @@ -118,6 +118,8 @@ public: // static externally-visible type_t type() const { return mType; } bool isDuplicating() const { return (mType == DUPLICATING); } audio_io_handle_t id() const { return mId;} // dynamic externally-visible Loading