| Index: chrome/browser/renderer_host/audio_renderer_host.h
|
| diff --git a/chrome/browser/renderer_host/audio_renderer_host.h b/chrome/browser/renderer_host/audio_renderer_host.h
|
| index 4df24ba9214fa600e66b772db4d2f45e661ef5ef..8128d61f545c88205ff9d17fcb9b54285092aae8 100644
|
| --- a/chrome/browser/renderer_host/audio_renderer_host.h
|
| +++ b/chrome/browser/renderer_host/audio_renderer_host.h
|
| @@ -17,11 +17,31 @@
|
| // passing a SharedMemoryHandle for filling the buffer.
|
| // NotifyPacketReady(|stream_id|) would be called when the buffer is filled
|
| // and ready to be consumed.
|
| +//
|
| +// This class is owned by BrowserRenderProcessHost, and instantiated on UI
|
| +// thread, but all other operations and method calls (except Destroy()) happens
|
| +// in IO thread, so we need to be extra careful about the lifetime of this
|
| +// object. AudioManager is a singleton and created in IO thread, audio output
|
| +// streams are also created in the IO thread, so we need to destroy them also
|
| +// in IO thread. After this class is created, a task of OnInitialized() is
|
| +// posted on IO thread in which singleton of AudioManager is created and
|
| +// AddRef() is called to increase one ref count of this object. Owner of this
|
| +// class should call Destroy() before decrementing the ref count to this object,
|
| +// which essentially post a task of OnDestroyed() on IO thread. Inside
|
| +// OnDestroyed(), audio output streams are destroyed and Release() is called
|
| +// which may result in self-destruction.
|
| +//
|
| +// TODO(hclam): Have these things done before having real implementations:
|
| +// 1. Make sure this class has greater or equal lifetime to
|
| +// IPC:Message::Sender, essentially ResourceMessageFilter.
|
| +// 2. Listen to destruction event of the browser and do cleanup in case this
|
| +// class is not destructed nicely during browser close.
|
|
|
| #ifndef CHROME_BROWSER_RENDERER_HOST_AUDIO_RENDERER_HOST_H_
|
| #define CHROME_BROWSER_RENDERER_HOST_AUDIO_RENDERER_HOST_H_
|
|
|
| #include "base/id_map.h"
|
| +#include "base/ref_counted.h"
|
| #include "base/shared_memory.h"
|
| #include "chrome/common/ipc_message.h"
|
| #include "media/audio/audio_output.h"
|
| @@ -29,7 +49,7 @@
|
| class AudioManager;
|
| class MessageLoop;
|
|
|
| -class AudioRendererHost {
|
| +class AudioRendererHost : public base::RefCountedThreadSafe<AudioRendererHost> {
|
| public:
|
| static const int32 INVALID_ID = 0;
|
|
|
| @@ -74,14 +94,24 @@ class AudioRendererHost {
|
| // consumed.
|
| void NotifyPacketReady(int32 stream_id);
|
|
|
| - // Destroy all audio output streams.
|
| - void DestroyAllStreams();
|
| + // Called from UI thread from the owner of this object.
|
| + void Destroy();
|
|
|
| // Destroy the stream specified by |stream_id| and remove it from map.
|
| // *DO NOT* call this method other than from IPCAudioSource.
|
| void DestroySource(int32 stream_id);
|
|
|
| private:
|
| + // Methods called on IO thread.
|
| + // Called on IO thread when this object is created and initialized.
|
| + void OnInitialized();
|
| + // Called on IO thread when this object needs to be destroyed and after
|
| + // Destroy() is called from owner of this class in UI thread.
|
| + void OnDestroyed();
|
| +
|
| + // Destroy all audio output streams.
|
| + void DestroyAllStreams();
|
| +
|
| // The container for AudioOutputStream and serves audio packet for it by IPC.
|
| class IPCAudioSource : public AudioOutputStream::AudioSourceCallback {
|
| public:
|
| @@ -124,7 +154,7 @@ class AudioRendererHost {
|
|
|
| // Only used for DCHECKs to make sure all methods calls are from the same
|
| // thread as this object is created.
|
| - MessageLoop* message_loop_;
|
| + MessageLoop* io_loop_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(AudioRendererHost);
|
| };
|
|
|