diff --git a/media/audio/audio_manager_base.cc b/media/audio/audio_manager_base.cc index a9d46a386d2267..0a32ccd4f5dc46 100644 --- a/media/audio/audio_manager_base.cc +++ b/media/audio/audio_manager_base.cc @@ -8,6 +8,7 @@ #include "base/bind_helpers.h" #include "base/command_line.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" #include "base/threading/thread_task_runner_handle.h" @@ -49,7 +50,7 @@ struct AudioManagerBase::DispatcherParams { const AudioParameters input_params; const AudioParameters output_params; const std::string output_device_id; - scoped_refptr dispatcher; + std::unique_ptr dispatcher; private: DISALLOW_COPY_AND_ASSIGN(DispatcherParams); @@ -258,20 +259,18 @@ AudioOutputStream* AudioManagerBase::MakeAudioOutputStreamProxy( const base::TimeDelta kCloseDelay = base::TimeDelta::FromSeconds(kStreamCloseDelaySeconds); - scoped_refptr dispatcher; + std::unique_ptr dispatcher; if (output_params.format() != AudioParameters::AUDIO_FAKE) { - dispatcher = new AudioOutputResampler(this, params, output_params, - output_device_id, - kCloseDelay); + dispatcher = base::MakeUnique( + this, params, output_params, output_device_id, kCloseDelay); } else { - dispatcher = new AudioOutputDispatcherImpl(this, output_params, - output_device_id, - kCloseDelay); + dispatcher = base::MakeUnique( + this, output_params, output_device_id, kCloseDelay); } - dispatcher_params->dispatcher = dispatcher; + dispatcher_params->dispatcher = std::move(dispatcher); output_dispatchers_.push_back(dispatcher_params); - return new AudioOutputProxy(dispatcher.get()); + return new AudioOutputProxy(dispatcher_params->dispatcher.get()); } void AudioManagerBase::ShowAudioInputSettings() { @@ -306,11 +305,9 @@ void AudioManagerBase::ReleaseInputStream(AudioInputStream* stream) { void AudioManagerBase::Shutdown() { DCHECK(GetTaskRunner()->BelongsToCurrentThread()); + // Close all output streams. - while (!output_dispatchers_.empty()) { - output_dispatchers_.back()->dispatcher->Shutdown(); - output_dispatchers_.pop_back(); - } + output_dispatchers_.clear(); #if defined(OS_MACOSX) // On mac, AudioManager runs on the main thread, loop for which stops diff --git a/media/audio/audio_output_dispatcher.h b/media/audio/audio_output_dispatcher.h index c7dbf0efd93801..f94f95f65389c6 100644 --- a/media/audio/audio_output_dispatcher.h +++ b/media/audio/audio_output_dispatcher.h @@ -19,7 +19,6 @@ #define MEDIA_AUDIO_AUDIO_OUTPUT_DISPATCHER_H_ #include "base/macros.h" -#include "base/memory/ref_counted.h" #include "media/audio/audio_io.h" #include "media/audio/audio_manager.h" #include "media/base/audio_parameters.h" @@ -32,12 +31,12 @@ namespace media { class AudioOutputProxy; -class MEDIA_EXPORT AudioOutputDispatcher - : public base::RefCountedThreadSafe { +class MEDIA_EXPORT AudioOutputDispatcher { public: AudioOutputDispatcher(AudioManager* audio_manager, const AudioParameters& params, const std::string& device_id); + virtual ~AudioOutputDispatcher(); // Called by AudioOutputProxy to open the stream. // Returns false, if it fails to open it. @@ -61,15 +60,9 @@ class MEDIA_EXPORT AudioOutputDispatcher // Called by AudioOutputProxy when the stream is closed. virtual void CloseStream(AudioOutputProxy* stream_proxy) = 0; - // Called on the audio thread when the AudioManager is shutting down. - virtual void Shutdown() = 0; - const std::string& device_id() const { return device_id_; } protected: - friend class base::RefCountedThreadSafe; - virtual ~AudioOutputDispatcher(); - // A no-reference-held pointer (we don't want circular references) back to the // AudioManager that owns this object. AudioManager* audio_manager_; diff --git a/media/audio/audio_output_dispatcher_impl.cc b/media/audio/audio_output_dispatcher_impl.cc index f50748c905d507..b538acde82cdb6 100644 --- a/media/audio/audio_output_dispatcher_impl.cc +++ b/media/audio/audio_output_dispatcher_impl.cc @@ -32,6 +32,12 @@ AudioOutputDispatcherImpl::AudioOutputDispatcherImpl( audio_stream_id_(0) {} AudioOutputDispatcherImpl::~AudioOutputDispatcherImpl() { + CHECK(task_runner_->BelongsToCurrentThread()); + + // Close all idle streams immediately. The |close_timer_| will handle + // invalidating any outstanding tasks upon its destruction. + CloseAllIdleStreams(); + // There must be no idle proxy streams. CHECK_EQ(idle_proxies_, 0u); @@ -122,24 +128,6 @@ void AudioOutputDispatcherImpl::CloseStream(AudioOutputProxy* stream_proxy) { close_timer_.Reset(); } -void AudioOutputDispatcherImpl::Shutdown() { - DCHECK(task_runner_->BelongsToCurrentThread()); - - // Close all idle streams immediately. The |close_timer_| will handle - // invalidating any outstanding tasks upon its destruction. - CloseAllIdleStreams(); - - // No AudioOutputProxy objects should hold a reference to us when we get - // to this stage. - DCHECK(HasOneRef()) << "Only the AudioManager should hold a reference"; - - LOG_IF(WARNING, idle_proxies_ > 0u) << "Idle proxy streams during shutdown: " - << idle_proxies_; - LOG_IF(WARNING, !proxy_to_physical_map_.empty()) - << "Active proxy streams during shutdown: " - << proxy_to_physical_map_.size(); -} - bool AudioOutputDispatcherImpl::HasOutputProxies() const { return idle_proxies_ || !proxy_to_physical_map_.empty(); } diff --git a/media/audio/audio_output_dispatcher_impl.h b/media/audio/audio_output_dispatcher_impl.h index 0923319fab88f3..97eb46bce0cbbc 100644 --- a/media/audio/audio_output_dispatcher_impl.h +++ b/media/audio/audio_output_dispatcher_impl.h @@ -40,6 +40,7 @@ class MEDIA_EXPORT AudioOutputDispatcherImpl : public AudioOutputDispatcher { const AudioParameters& params, const std::string& output_device_id, const base::TimeDelta& close_delay); + ~AudioOutputDispatcherImpl() override; // Opens a new physical stream if there are no pending streams in // |idle_streams_|. Do not call Close() or Stop() if this method fails. @@ -61,8 +62,6 @@ class MEDIA_EXPORT AudioOutputDispatcherImpl : public AudioOutputDispatcher { // kept alive until |close_timer_| fires. void CloseStream(AudioOutputProxy* stream_proxy) override; - void Shutdown() override; - // Returns true if there are any open AudioOutputProxy objects. bool HasOutputProxies() const; @@ -70,9 +69,6 @@ class MEDIA_EXPORT AudioOutputDispatcherImpl : public AudioOutputDispatcher { void CloseAllIdleStreams(); private: - friend class base::RefCountedThreadSafe; - ~AudioOutputDispatcherImpl() override; - // Creates a new physical output stream, opens it and pushes to // |idle_streams_|. Returns false if the stream couldn't be created or // opened. diff --git a/media/audio/audio_output_proxy.h b/media/audio/audio_output_proxy.h index 8a5aab09f1559d..0b358087348f30 100644 --- a/media/audio/audio_output_proxy.h +++ b/media/audio/audio_output_proxy.h @@ -7,7 +7,6 @@ #include "base/compiler_specific.h" #include "base/macros.h" -#include "base/memory/ref_counted.h" #include "base/threading/non_thread_safe.h" #include "media/audio/audio_io.h" #include "media/base/audio_parameters.h" @@ -40,7 +39,7 @@ class MEDIA_EXPORT AudioOutputProxy void Close() override; AudioOutputDispatcher* get_dispatcher_for_testing() const { - return dispatcher_.get(); + return dispatcher_; } private: @@ -55,7 +54,7 @@ class MEDIA_EXPORT AudioOutputProxy ~AudioOutputProxy() override; - scoped_refptr dispatcher_; + AudioOutputDispatcher* dispatcher_; State state_; // Need to save volume here, so that we can restore it in case the stream diff --git a/media/audio/audio_output_proxy_unittest.cc b/media/audio/audio_output_proxy_unittest.cc index 37e012a62b4e66..9900eb18341f9a 100644 --- a/media/audio/audio_output_proxy_unittest.cc +++ b/media/audio/audio_output_proxy_unittest.cc @@ -7,6 +7,7 @@ #include #include +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" @@ -174,10 +175,8 @@ class AudioOutputProxyTest : public testing::Test { } virtual void InitDispatcher(base::TimeDelta close_delay) { - dispatcher_impl_ = new AudioOutputDispatcherImpl(&manager(), - params_, - std::string(), - close_delay); + dispatcher_impl_ = base::MakeUnique( + &manager(), params_, std::string(), close_delay); } virtual void OnStart() {} @@ -422,7 +421,7 @@ class AudioOutputProxyTest : public testing::Test { } base::MessageLoop message_loop_; - scoped_refptr dispatcher_impl_; + std::unique_ptr dispatcher_impl_; MockAudioManager manager_; MockAudioSourceCallback callback_; AudioParameters params_; @@ -439,7 +438,7 @@ class AudioOutputResamplerTest : public AudioOutputProxyTest { resampler_params_ = AudioParameters( AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO, 16000, 16, 1024); - resampler_ = new AudioOutputResampler( + resampler_ = base::MakeUnique( &manager(), params_, resampler_params_, std::string(), close_delay); } @@ -454,7 +453,7 @@ class AudioOutputResamplerTest : public AudioOutputProxyTest { protected: AudioParameters resampler_params_; - scoped_refptr resampler_; + std::unique_ptr resampler_; }; TEST_F(AudioOutputProxyTest, CreateAndClose) { diff --git a/media/audio/audio_output_resampler.cc b/media/audio/audio_output_resampler.cc index e81af4a6a40d9f..33a4ccd960e1c1 100644 --- a/media/audio/audio_output_resampler.cc +++ b/media/audio/audio_output_resampler.cc @@ -13,6 +13,7 @@ #include "base/bind_helpers.h" #include "base/compiler_specific.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/sparse_histogram.h" #include "base/numerics/safe_conversions.h" @@ -255,7 +256,6 @@ void AudioOutputResampler::Reinitialize() { // Log a trace event so we can get feedback in the field when this happens. TRACE_EVENT0("audio", "AudioOutputResampler::Reinitialize"); - dispatcher_->Shutdown(); output_params_ = original_output_params_; streams_opened_ = false; Initialize(); @@ -264,7 +264,7 @@ void AudioOutputResampler::Reinitialize() { void AudioOutputResampler::Initialize() { DCHECK(!streams_opened_); DCHECK(callbacks_.empty()); - dispatcher_ = new AudioOutputDispatcherImpl( + dispatcher_ = base::MakeUnique( audio_manager_, output_params_, device_id_, close_delay_); } @@ -391,17 +391,6 @@ void AudioOutputResampler::CloseStream(AudioOutputProxy* stream_proxy) { } } -void AudioOutputResampler::Shutdown() { - DCHECK(task_runner_->BelongsToCurrentThread()); - - // No AudioOutputProxy objects should hold a reference to us when we get - // to this stage. - DCHECK(HasOneRef()) << "Only the AudioManager should hold a reference"; - - dispatcher_->Shutdown(); - DCHECK(callbacks_.empty()); -} - OnMoreDataConverter::OnMoreDataConverter(const AudioParameters& input_params, const AudioParameters& output_params) : io_ratio_(static_cast(input_params.GetBytesPerSecond()) / diff --git a/media/audio/audio_output_resampler.h b/media/audio/audio_output_resampler.h index 96bba2bab87738..cb516c52bb2d13 100644 --- a/media/audio/audio_output_resampler.h +++ b/media/audio/audio_output_resampler.h @@ -8,7 +8,6 @@ #include #include "base/macros.h" -#include "base/memory/ref_counted.h" #include "base/time/time.h" #include "base/timer/timer.h" #include "media/audio/audio_io.h" @@ -37,6 +36,7 @@ class MEDIA_EXPORT AudioOutputResampler : public AudioOutputDispatcher { const AudioParameters& output_params, const std::string& output_device_id, const base::TimeDelta& close_delay); + ~AudioOutputResampler() override; // AudioOutputDispatcher interface. bool OpenStream() override; @@ -45,12 +45,8 @@ class MEDIA_EXPORT AudioOutputResampler : public AudioOutputDispatcher { void StopStream(AudioOutputProxy* stream_proxy) override; void StreamVolumeSet(AudioOutputProxy* stream_proxy, double volume) override; void CloseStream(AudioOutputProxy* stream_proxy) override; - void Shutdown() override; private: - friend class base::RefCountedThreadSafe; - ~AudioOutputResampler() override; - // Converts low latency based output parameters into high latency // appropriate output parameters in error situations. void SetupFallbackParams(); @@ -62,7 +58,7 @@ class MEDIA_EXPORT AudioOutputResampler : public AudioOutputDispatcher { void Initialize(); // Dispatcher to proxy all AudioOutputDispatcher calls too. - scoped_refptr dispatcher_; + std::unique_ptr dispatcher_; // Map of outstanding OnMoreDataConverter objects. A new object is created // on every StartStream() call and destroyed on CloseStream().