diff options
Diffstat (limited to 'chromium/services/audio/stream_factory.cc')
-rw-r--r-- | chromium/services/audio/stream_factory.cc | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/chromium/services/audio/stream_factory.cc b/chromium/services/audio/stream_factory.cc index ff64baf61b7..8e6d662a79a 100644 --- a/chromium/services/audio/stream_factory.cc +++ b/chromium/services/audio/stream_factory.cc @@ -127,8 +127,9 @@ void StreamFactory::BindMuter( if (it == muters_.end()) { auto muter_ptr = std::make_unique<LocalMuter>(&coordinator_, group_id); muter = muter_ptr.get(); - muter->SetAllBindingsLostCallback(base::BindOnce( - &StreamFactory::DestroyMuter, base::Unretained(this), muter)); + muter->SetAllBindingsLostCallback( + base::BindOnce(&StreamFactory::DestroyMuter, + base::Unretained(this), muter_ptr->GetWeakPtr())); muters_.emplace_back(std::move(muter_ptr)); } else { muter = it->get(); @@ -201,9 +202,10 @@ void StreamFactory::DestroyOutputStream(OutputStream* stream) { DCHECK_EQ(1u, erased); } -void StreamFactory::DestroyMuter(LocalMuter* muter) { +void StreamFactory::DestroyMuter(base::WeakPtr<LocalMuter> muter) { DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); - DCHECK(muter); + if (!muter) + return; // Output streams have a task posting before destruction (see the OnError // function in output_stream.cc). To ensure that stream destruction and @@ -212,13 +214,11 @@ void StreamFactory::DestroyMuter(LocalMuter* muter) { // Otherwise, a "destroy all streams, then destroy the muter" sequence may // result in a brief blip of audio. auto do_destroy = [](base::WeakPtr<StreamFactory> weak_this, - LocalMuter* muter) { - if (weak_this) { - + base::WeakPtr<LocalMuter> muter) { + if (weak_this && muter) { const auto it = std::find_if(weak_this->muters_.begin(), weak_this->muters_.end(), - base::MatchesUniquePtr(muter)); - DCHECK(it != weak_this->muters_.end()); + base::MatchesUniquePtr(muter.get())); weak_this->muters_.erase(it); } }; |