| Index: media/audio/audio_manager.h
|
| diff --git a/media/audio/audio_manager.h b/media/audio/audio_manager.h
|
| index 2060e9f510ea8ec569d181d3eb313fc151c4927d..977b3c1e426fce0a6e69534c8e1e3d5d90ffedca 100644
|
| --- a/media/audio/audio_manager.h
|
| +++ b/media/audio/audio_manager.h
|
| @@ -12,11 +12,12 @@
|
| #include "base/gtest_prod_util.h"
|
| #include "base/macros.h"
|
| #include "base/memory/ref_counted.h"
|
| -#include "base/sequenced_task_runner_helpers.h"
|
| #include "base/strings/string16.h"
|
| +#include "base/threading/thread_checker.h"
|
| #include "build/build_config.h"
|
| #include "media/audio/audio_device_description.h"
|
| #include "media/audio/audio_logging.h"
|
| +#include "media/audio/audio_thread.h"
|
| #include "media/base/audio_parameters.h"
|
|
|
| namespace base {
|
| @@ -30,13 +31,6 @@ class AudioInputStream;
|
| class AudioManager;
|
| class AudioOutputStream;
|
|
|
| -class MEDIA_EXPORT AudioManagerDeleter {
|
| - public:
|
| - void operator()(const AudioManager* instance) const;
|
| -};
|
| -using ScopedAudioManagerPtr =
|
| - std::unique_ptr<AudioManager, AudioManagerDeleter>;
|
| -
|
| // Manages all audio resources. Provides some convenience functions that avoid
|
| // the need to provide iterators over the existing streams.
|
| //
|
| @@ -44,35 +38,33 @@ using ScopedAudioManagerPtr =
|
| // thread hang is detected, it is reported to UMA.
|
| class MEDIA_EXPORT AudioManager {
|
| public:
|
| + virtual ~AudioManager();
|
| +
|
| // Construct the audio manager; only one instance is allowed.
|
| - // The returned instance must be deleted on AudioManager::GetTaskRunnner().
|
| //
|
| // The manager will forward CreateAudioLog() calls to the provided
|
| // AudioLogFactory; as such |audio_log_factory| must outlive the AudioManager.
|
| //
|
| - // The manager will use |task_runner| for audio IO. This same task runner
|
| - // is returned by GetTaskRunner().
|
| - // On OS_MACOSX, CoreAudio requires that |task_runner| must belong to the
|
| - // main thread of the process, which in our case is sadly the browser UI
|
| - // thread. Failure to execute calls on the right thread leads to crashes and
|
| - // odd behavior. See http://crbug.com/158170.
|
| + // The manager will use |audio_thread->GetTaskRunner()| for audio IO.
|
| + // On OS_MACOSX, CoreAudio requires that |audio_thread->GetTaskRunner()|
|
| + // must belong to the main thread of the process, which in our case is sadly
|
| + // the browser UI thread. Failure to execute calls on the right thread leads
|
| + // to crashes and odd behavior. See http://crbug.com/158170.
|
| //
|
| - // The manager will use |worker_task_runner| for heavyweight tasks.
|
| - // The |worker_task_runner| may be the same as |task_runner|. This same
|
| - // task runner is returned by GetWorkerTaskRunner.
|
| + // The manager will use |audio_thread->GetWorkerTaskRunner()| for heavyweight
|
| + // tasks. The |audio_thread->GetWorkerTaskRunner()| may be the same as
|
| + // |audio_thread->GetTaskRunner()|.
|
| //
|
| // |file_task_runner| is used for audio debug recordings and is the task
|
| // runner to do file output operations on.
|
| - static ScopedAudioManagerPtr Create(
|
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner,
|
| - scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
|
| + static std::unique_ptr<AudioManager> Create(
|
| + std::unique_ptr<AudioThread> audio_thread,
|
| scoped_refptr<base::SingleThreadTaskRunner> file_task_runner,
|
| AudioLogFactory* audio_log_factory);
|
|
|
| // A convenience wrapper of AudioManager::Create for testing.
|
| - // The given |task_runner| is shared for both audio io and heavyweight tasks.
|
| - static ScopedAudioManagerPtr CreateForTesting(
|
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner);
|
| + static std::unique_ptr<AudioManager> CreateForTesting(
|
| + std::unique_ptr<AudioThread> audio_thread);
|
|
|
| // Starts monitoring AudioManager task runner for hangs.
|
| // Runs the monitor on the given |task_runner|, which must be different from
|
| @@ -95,6 +87,11 @@ class MEDIA_EXPORT AudioManager {
|
| // like src/chrome.
|
| static AudioManager* Get();
|
|
|
| + // Releases all audio resources.
|
| + // Must be called before deletion and on the same thread as AudioManager
|
| + // was created.
|
| + void Shutdown();
|
| +
|
| // Log callback used for sending log messages from a stream to the object
|
| // that manages the stream.
|
| using LogCallback = base::Callback<void(const std::string&)>;
|
| @@ -151,17 +148,15 @@ class MEDIA_EXPORT AudioManager {
|
| const LogCallback& log_callback) = 0;
|
|
|
| // Returns the task runner used for audio IO.
|
| - // TODO(alokp): Rename to task_runner().
|
| base::SingleThreadTaskRunner* GetTaskRunner() const {
|
| - return task_runner_.get();
|
| + return audio_thread_->GetTaskRunner();
|
| }
|
|
|
| // Heavyweight tasks should use GetWorkerTaskRunner() instead of
|
| // GetTaskRunner(). On most platforms they are the same, but some share the
|
| // UI loop with the audio IO loop.
|
| - // TODO(alokp): Rename to worker_task_runner().
|
| base::SingleThreadTaskRunner* GetWorkerTaskRunner() const {
|
| - return worker_task_runner_.get();
|
| + return audio_thread_->GetWorkerTaskRunner();
|
| }
|
|
|
| // Allows clients to listen for device state changes; e.g. preferred sample
|
| @@ -200,9 +195,9 @@ class MEDIA_EXPORT AudioManager {
|
| FRIEND_TEST_ALL_PREFIXES(AudioManagerTest, AudioDebugRecording);
|
| friend class AudioDeviceInfoAccessorForTests;
|
|
|
| - AudioManager(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
|
| - scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner);
|
| - virtual ~AudioManager();
|
| + explicit AudioManager(std::unique_ptr<AudioThread> audio_thread);
|
| +
|
| + virtual void ShutdownOnAudioThread() = 0;
|
|
|
| // Initializes output debug recording. Can be called on any thread; will post
|
| // to the audio thread if not called on it.
|
| @@ -274,12 +269,12 @@ class MEDIA_EXPORT AudioManager {
|
| const std::string& input_device_id) = 0;
|
|
|
| private:
|
| - friend class base::DeleteHelper<AudioManager>;
|
| - friend class AudioManagerDeleter;
|
| friend class AudioSystemImpl;
|
|
|
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
|
| - scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner_;
|
| + std::unique_ptr<AudioThread> audio_thread_;
|
| + bool shutdown_ = false; // True after |this| has been shutdown.
|
| +
|
| + THREAD_CHECKER(thread_checker_);
|
| DISALLOW_COPY_AND_ASSIGN(AudioManager);
|
| };
|
|
|
|
|