Index: media/audio/audio_manager.h |
diff --git a/media/audio/audio_manager.h b/media/audio/audio_manager.h |
index cd91b399d6d4595ce60faf0131baa65f9cfd8bca..adb78eb5ded0f8ddc45ed63f004a8d86aff75772 100644 |
--- a/media/audio/audio_manager.h |
+++ b/media/audio/audio_manager.h |
@@ -14,9 +14,11 @@ |
#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 +32,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,8 +39,10 @@ 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 returned instance must be deleted on AudioManager::GetTaskRunner(). |
// |
// The manager will forward CreateAudioLog() calls to the provided |
// AudioLogFactory; as such |audio_log_factory| must outlive the AudioManager. |
@@ -63,16 +60,15 @@ class MEDIA_EXPORT AudioManager { |
// |
// |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 +91,10 @@ class MEDIA_EXPORT AudioManager { |
// like src/chrome. |
static AudioManager* Get(); |
+ // Releases all audio resources. |
+ // Must be called on the same thread as AudioManager was created. |
+ void Shutdown(); |
+ |
// Returns true if the OS reports existence of audio devices. This does not |
// guarantee that the existing devices support all formats and sample rates. |
virtual bool HasAudioOutputDevices() = 0; |
@@ -188,17 +188,17 @@ 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(); |
+ DCHECK(audio_thread_); |
+ 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(); |
+ DCHECK(audio_thread_); |
+ return audio_thread_->GetWorkerTaskRunner(); |
} |
// Allows clients to listen for device state changes; e.g. preferred sample |
@@ -263,21 +263,19 @@ class MEDIA_EXPORT AudioManager { |
protected: |
FRIEND_TEST_ALL_PREFIXES(AudioManagerTest, AudioDebugRecording); |
- AudioManager(scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
- scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner); |
- virtual ~AudioManager(); |
+ explicit AudioManager(std::unique_ptr<AudioThread> audio_thread); |
// Initializes output debug recording. Can be called on any thread; will post |
// to the audio thread if not called on it. |
virtual void InitializeOutputDebugRecording( |
scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) = 0; |
+ virtual void ShutdownOnAudioThread() = 0; |
+ |
private: |
- friend class base::DeleteHelper<AudioManager>; |
- friend class AudioManagerDeleter; |
+ base::ThreadChecker thread_checker_; |
+ std::unique_ptr<AudioThread> audio_thread_; |
- scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
- scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner_; |
DISALLOW_COPY_AND_ASSIGN(AudioManager); |
}; |