Index: trunk/src/media/audio/audio_output_dispatcher_impl.h |
=================================================================== |
--- trunk/src/media/audio/audio_output_dispatcher_impl.h (revision 230541) |
+++ trunk/src/media/audio/audio_output_dispatcher_impl.h (working copy) |
@@ -13,11 +13,12 @@ |
#ifndef MEDIA_AUDIO_AUDIO_OUTPUT_DISPATCHER_IMPL_H_ |
#define MEDIA_AUDIO_AUDIO_OUTPUT_DISPATCHER_IMPL_H_ |
+#include <list> |
#include <map> |
-#include <vector> |
#include "base/basictypes.h" |
#include "base/memory/ref_counted.h" |
+#include "base/memory/weak_ptr.h" |
#include "base/timer/timer.h" |
#include "media/audio/audio_io.h" |
#include "media/audio/audio_manager.h" |
@@ -30,8 +31,8 @@ |
class MEDIA_EXPORT AudioOutputDispatcherImpl : public AudioOutputDispatcher { |
public: |
- // |close_delay| specifies delay after the stream is idle until the audio |
- // device is closed. |
+ // |close_delay_ms| specifies delay after the stream is paused until |
+ // the audio device is closed. |
AudioOutputDispatcherImpl(AudioManager* audio_manager, |
const AudioParameters& params, |
const std::string& output_device_id, |
@@ -59,26 +60,38 @@ |
virtual void Shutdown() OVERRIDE; |
private: |
+ typedef std::map<AudioOutputProxy*, AudioOutputStream*> AudioStreamMap; |
friend class base::RefCountedThreadSafe<AudioOutputDispatcherImpl>; |
virtual ~AudioOutputDispatcherImpl(); |
+ friend class AudioOutputProxyTest; |
+ |
// Creates a new physical output stream, opens it and pushes to |
// |idle_streams_|. Returns false if the stream couldn't be created or |
// opened. |
bool CreateAndOpenStream(); |
- // Closes all |idle_streams_|. |
- void CloseIdleStreams(); |
+ // A task scheduled by StartStream(). Opens a new stream and puts |
+ // it in |idle_streams_|. |
+ void OpenTask(); |
- size_t idle_proxies_; |
- std::vector<AudioOutputStream*> idle_streams_; |
+ // Before a stream is reused, it should sit idle for a bit. This task is |
+ // called once that time has elapsed. |
+ void StopStreamTask(); |
- // When streams are stopped they're added to |idle_streams_|, if no stream is |
- // reused before |close_delay_| elapses |close_timer_| will run |
- // CloseIdleStreams(). |
+ // Called by |close_timer_|. Closes all pending streams. |
+ void ClosePendingStreams(); |
+ |
+ base::TimeDelta pause_delay_; |
+ size_t paused_proxies_; |
+ typedef std::list<AudioOutputStream*> AudioOutputStreamList; |
+ AudioOutputStreamList idle_streams_; |
+ AudioOutputStreamList pausing_streams_; |
+ |
+ // Used to post delayed tasks to ourselves that we cancel inside Shutdown(). |
+ base::WeakPtrFactory<AudioOutputDispatcherImpl> weak_this_; |
base::DelayTimer<AudioOutputDispatcherImpl> close_timer_; |
- typedef std::map<AudioOutputProxy*, AudioOutputStream*> AudioStreamMap; |
AudioStreamMap proxy_to_physical_map_; |
DISALLOW_COPY_AND_ASSIGN(AudioOutputDispatcherImpl); |