OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Audio rendering unit utilizing an AudioRendererSink to output data. | 5 // Audio rendering unit utilizing an AudioRendererSink to output data. |
6 // | 6 // |
7 // This class lives inside three threads during it's lifetime, namely: | 7 // This class lives inside three threads during it's lifetime, namely: |
8 // 1. Render thread | 8 // 1. Render thread |
9 // Where the object is created. | 9 // Where the object is created. |
10 // 2. Media thread (provided via constructor) | 10 // 2. Media thread (provided via constructor) |
(...skipping 18 matching lines...) Expand all Loading... | |
29 #include "base/power_monitor/power_observer.h" | 29 #include "base/power_monitor/power_observer.h" |
30 #include "base/synchronization/lock.h" | 30 #include "base/synchronization/lock.h" |
31 #include "media/base/audio_decoder.h" | 31 #include "media/base/audio_decoder.h" |
32 #include "media/base/audio_renderer.h" | 32 #include "media/base/audio_renderer.h" |
33 #include "media/base/audio_renderer_sink.h" | 33 #include "media/base/audio_renderer_sink.h" |
34 #include "media/base/decryptor.h" | 34 #include "media/base/decryptor.h" |
35 #include "media/base/media_log.h" | 35 #include "media/base/media_log.h" |
36 #include "media/base/time_source.h" | 36 #include "media/base/time_source.h" |
37 #include "media/filters/audio_renderer_algorithm.h" | 37 #include "media/filters/audio_renderer_algorithm.h" |
38 #include "media/filters/decoder_stream.h" | 38 #include "media/filters/decoder_stream.h" |
39 #include "media/renderers/default_renderer_factory.h" | |
39 | 40 |
40 namespace base { | 41 namespace base { |
41 class SingleThreadTaskRunner; | 42 class SingleThreadTaskRunner; |
42 class TickClock; | 43 class TickClock; |
43 } | 44 } |
44 | 45 |
45 namespace media { | 46 namespace media { |
46 | 47 |
47 class AudioBufferConverter; | 48 class AudioBufferConverter; |
48 class AudioBus; | 49 class AudioBus; |
49 class AudioClock; | 50 class AudioClock; |
50 | 51 |
51 class MEDIA_EXPORT AudioRendererImpl | 52 class MEDIA_EXPORT AudioRendererImpl |
52 : public AudioRenderer, | 53 : public AudioRenderer, |
53 public TimeSource, | 54 public TimeSource, |
54 public base::PowerObserver, | 55 public base::PowerObserver, |
55 NON_EXPORTED_BASE(public AudioRendererSink::RenderCallback) { | 56 NON_EXPORTED_BASE(public AudioRendererSink::RenderCallback) { |
56 public: | 57 public: |
57 // |task_runner| is the thread on which AudioRendererImpl will execute. | 58 // |task_runner| is the thread on which AudioRendererImpl will execute. |
58 // | 59 // |
59 // |sink| is used as the destination for the rendered audio. | 60 // |sink| is used as the destination for the rendered audio. |
60 // | 61 // |
61 // |decoders| contains the AudioDecoders to use when initializing. | 62 // |decoders| contains the AudioDecoders to use when initializing. |
62 AudioRendererImpl( | 63 AudioRendererImpl( |
63 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 64 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
64 AudioRendererSink* sink, | 65 AudioRendererSink* sink, |
65 ScopedVector<AudioDecoder> decoders, | 66 const CreateAudioDecodersCB& create_audio_decoders_cb, |
66 const scoped_refptr<MediaLog>& media_log); | 67 const scoped_refptr<MediaLog>& media_log); |
67 ~AudioRendererImpl() override; | 68 ~AudioRendererImpl() override; |
68 | 69 |
69 // TimeSource implementation. | 70 // TimeSource implementation. |
70 void StartTicking() override; | 71 void StartTicking() override; |
71 void StopTicking() override; | 72 void StopTicking() override; |
72 void SetPlaybackRate(double rate) override; | 73 void SetPlaybackRate(double rate) override; |
73 void SetMediaTime(base::TimeDelta time) override; | 74 void SetMediaTime(base::TimeDelta time) override; |
74 base::TimeDelta CurrentMediaTime() override; | 75 base::TimeDelta CurrentMediaTime() override; |
75 bool GetWallClockTimes( | 76 bool GetWallClockTimes( |
(...skipping 13 matching lines...) Expand all Loading... | |
89 // base::PowerObserver implementation. | 90 // base::PowerObserver implementation. |
90 void OnSuspend() override; | 91 void OnSuspend() override; |
91 void OnResume() override; | 92 void OnResume() override; |
92 | 93 |
93 private: | 94 private: |
94 friend class AudioRendererImplTest; | 95 friend class AudioRendererImplTest; |
95 | 96 |
96 // Important detail: being in kPlaying doesn't imply that audio is being | 97 // Important detail: being in kPlaying doesn't imply that audio is being |
97 // rendered. Rather, it means that the renderer is ready to go. The actual | 98 // rendered. Rather, it means that the renderer is ready to go. The actual |
98 // rendering of audio is controlled via Start/StopRendering(). | 99 // rendering of audio is controlled via Start/StopRendering(). |
100 // Audio renderer can be reinitialized completely by calling Initialize again | |
101 // when it is in a kFlushed and stopped (StopTicking) state. | |
xhwang
2017/03/22 22:31:12
Please update AudioRenderer interface documentatio
servolk
2017/03/23 17:08:10
Done.
| |
99 // | 102 // |
100 // kUninitialized | 103 // kUninitialized |
101 // | Initialize() | 104 // +----> | Initialize() |
102 // | | 105 // | | |
103 // V | 106 // | V |
104 // kInitializing | 107 // | kInitializing |
105 // | Decoders initialized | 108 // | | Decoders initialized |
106 // | | 109 // | | |
107 // V Decoders reset | 110 // | V Decoders reset |
108 // kFlushed <------------------ kFlushing | 111 // +- kFlushed <------------------ kFlushing |
109 // | StartPlaying() ^ | 112 // | StartPlaying() ^ |
110 // | | | 113 // | | |
111 // | | Flush() | 114 // | | Flush() |
112 // `---------> kPlaying --------' | 115 // `---------> kPlaying --------' |
113 enum State { | 116 enum State { |
114 kUninitialized, | 117 kUninitialized, |
115 kInitializing, | 118 kInitializing, |
116 kFlushing, | 119 kFlushing, |
117 kFlushed, | 120 kFlushed, |
118 kPlaying | 121 kPlaying |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
246 // under |lock_|. ------------------------------------------------------------ | 249 // under |lock_|. ------------------------------------------------------------ |
247 base::Lock lock_; | 250 base::Lock lock_; |
248 | 251 |
249 // Algorithm for scaling audio. | 252 // Algorithm for scaling audio. |
250 double playback_rate_; | 253 double playback_rate_; |
251 std::unique_ptr<AudioRendererAlgorithm> algorithm_; | 254 std::unique_ptr<AudioRendererAlgorithm> algorithm_; |
252 | 255 |
253 // Simple state tracking variable. | 256 // Simple state tracking variable. |
254 State state_; | 257 State state_; |
255 | 258 |
259 CreateAudioDecodersCB create_audio_decoders_cb_; | |
260 | |
256 BufferingState buffering_state_; | 261 BufferingState buffering_state_; |
257 | 262 |
258 // Keep track of whether or not the sink is playing and whether we should be | 263 // Keep track of whether or not the sink is playing and whether we should be |
259 // rendering. | 264 // rendering. |
260 bool rendering_; | 265 bool rendering_; |
261 bool sink_playing_; | 266 bool sink_playing_; |
262 | 267 |
263 // Keep track of our outstanding read to |decoder_|. | 268 // Keep track of our outstanding read to |decoder_|. |
264 bool pending_read_; | 269 bool pending_read_; |
265 | 270 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
298 | 303 |
299 // NOTE: Weak pointers must be invalidated before all other member variables. | 304 // NOTE: Weak pointers must be invalidated before all other member variables. |
300 base::WeakPtrFactory<AudioRendererImpl> weak_factory_; | 305 base::WeakPtrFactory<AudioRendererImpl> weak_factory_; |
301 | 306 |
302 DISALLOW_COPY_AND_ASSIGN(AudioRendererImpl); | 307 DISALLOW_COPY_AND_ASSIGN(AudioRendererImpl); |
303 }; | 308 }; |
304 | 309 |
305 } // namespace media | 310 } // namespace media |
306 | 311 |
307 #endif // MEDIA_RENDERERS_AUDIO_RENDERER_IMPL_H_ | 312 #endif // MEDIA_RENDERERS_AUDIO_RENDERER_IMPL_H_ |
OLD | NEW |