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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
65 virtual ~AudioRendererImpl(); | 65 virtual ~AudioRendererImpl(); |
66 | 66 |
67 // AudioRenderer implementation. | 67 // AudioRenderer implementation. |
68 virtual void Initialize(DemuxerStream* stream, | 68 virtual void Initialize(DemuxerStream* stream, |
69 const PipelineStatusCB& init_cb, | 69 const PipelineStatusCB& init_cb, |
70 const StatisticsCB& statistics_cb, | 70 const StatisticsCB& statistics_cb, |
71 const base::Closure& underflow_cb, | 71 const base::Closure& underflow_cb, |
72 const TimeCB& time_cb, | 72 const TimeCB& time_cb, |
73 const base::Closure& ended_cb, | 73 const base::Closure& ended_cb, |
74 const PipelineStatusCB& error_cb) OVERRIDE; | 74 const PipelineStatusCB& error_cb) OVERRIDE; |
75 virtual void Play() OVERRIDE; | 75 virtual void StartRendering() OVERRIDE; |
76 virtual void Pause() OVERRIDE; | 76 virtual void StopRendering() OVERRIDE; |
77 virtual void Flush(const base::Closure& callback) OVERRIDE; | 77 virtual void Flush(const base::Closure& callback) OVERRIDE; |
78 virtual void Stop(const base::Closure& callback) OVERRIDE; | 78 virtual void Stop(const base::Closure& callback) OVERRIDE; |
79 virtual void SetPlaybackRate(float rate) OVERRIDE; | 79 virtual void SetPlaybackRate(float rate) OVERRIDE; |
80 virtual void Preroll(base::TimeDelta time, | 80 virtual void Preroll(base::TimeDelta time, |
81 const PipelineStatusCB& cb) OVERRIDE; | 81 const PipelineStatusCB& cb) OVERRIDE; |
82 virtual void ResumeAfterUnderflow() OVERRIDE; | 82 virtual void ResumeAfterUnderflow() OVERRIDE; |
83 virtual void SetVolume(float volume) OVERRIDE; | 83 virtual void SetVolume(float volume) OVERRIDE; |
84 | 84 |
85 // Disables underflow support. When used, |state_| will never transition to | 85 // Disables underflow support. When used, |state_| will never transition to |
86 // kUnderflow resulting in Render calls that underflow returning 0 frames | 86 // kUnderflow resulting in Render calls that underflow returning 0 frames |
87 // instead of some number of silence frames. Must be called prior to | 87 // instead of some number of silence frames. Must be called prior to |
88 // Initialize(). | 88 // Initialize(). |
89 void DisableUnderflowForTesting(); | 89 void DisableUnderflowForTesting(); |
90 | 90 |
91 // Allows injection of a custom time callback for non-realtime testing. | 91 // Allows injection of a custom time callback for non-realtime testing. |
92 typedef base::Callback<base::TimeTicks()> NowCB; | 92 typedef base::Callback<base::TimeTicks()> NowCB; |
93 void set_now_cb_for_testing(const NowCB& now_cb) { | 93 void set_now_cb_for_testing(const NowCB& now_cb) { |
94 now_cb_ = now_cb; | 94 now_cb_ = now_cb; |
95 } | 95 } |
96 | 96 |
97 private: | 97 private: |
98 friend class AudioRendererImplTest; | 98 friend class AudioRendererImplTest; |
99 | 99 |
100 // TODO(acolwell): Add a state machine graph. | 100 // Important detail: being in kPlaying doesn't imply that audio is being |
101 // rendered. Rather, it means that the renderer is ready to go. The actual | |
102 // rendering of audio is controlled via Start/StopRendering(). | |
103 // | |
104 // kUninitialized | |
105 // | Initialize() | |
106 // | | |
107 // V | |
108 // kInitializing | |
109 // | Decoders initialized | |
110 // | | |
111 // V Decoders reset | |
112 // kFlushed <------------------ kFlushing | |
113 // | Preroll() ^ | |
114 // | | | |
115 // V | Flush() | |
116 // kPrerolling ----------------> kPlaying ---------. | |
117 // Enough data buffered ^ | Not enough data | |
118 // | | buffered | |
119 // Enough data buffered | V | |
120 // kRebuffering <--- kUnderflow | |
121 // ResumeAfterUnderflow() | |
101 enum State { | 122 enum State { |
102 kUninitialized, | 123 kUninitialized, |
103 kInitializing, | 124 kInitializing, |
104 kPaused, | |
105 kFlushing, | 125 kFlushing, |
126 kFlushed, | |
106 kPrerolling, | 127 kPrerolling, |
107 kPlaying, | 128 kPlaying, |
xhwang1
2014/05/12 18:48:56
nit: now what does kPlaying exactly mean?
scherkus (not reviewing)
2014/05/12 18:55:32
see the comment I added above -- unless your nit i
| |
108 kStopped, | 129 kStopped, |
109 kUnderflow, | 130 kUnderflow, |
110 kRebuffering, | 131 kRebuffering, |
111 }; | 132 }; |
112 | 133 |
113 // Callback from the audio decoder delivering decoded audio samples. | 134 // Callback from the audio decoder delivering decoded audio samples. |
114 void DecodedAudioReady(AudioBufferStream::Status status, | 135 void DecodedAudioReady(AudioBufferStream::Status status, |
115 const scoped_refptr<AudioBuffer>& buffer); | 136 const scoped_refptr<AudioBuffer>& buffer); |
116 | 137 |
117 // Handles buffers that come out of |splicer_|. | 138 // Handles buffers that come out of |splicer_|. |
118 // Returns true if more buffers are needed. | 139 // Returns true if more buffers are needed. |
119 bool HandleSplicerBuffer(const scoped_refptr<AudioBuffer>& buffer); | 140 bool HandleSplicerBuffer(const scoped_refptr<AudioBuffer>& buffer); |
120 | 141 |
121 // Helper functions for AudioDecoder::Status values passed to | 142 // Helper functions for AudioDecoder::Status values passed to |
122 // DecodedAudioReady(). | 143 // DecodedAudioReady(). |
123 void HandleAbortedReadOrDecodeError(bool is_decode_error); | 144 void HandleAbortedReadOrDecodeError(bool is_decode_error); |
124 | 145 |
125 // Estimate earliest time when current buffer can stop playing. | 146 // Estimate earliest time when current buffer can stop playing. |
126 void UpdateEarliestEndTime_Locked(int frames_filled, | 147 void UpdateEarliestEndTime_Locked(int frames_filled, |
127 const base::TimeDelta& playback_delay, | 148 const base::TimeDelta& playback_delay, |
128 const base::TimeTicks& time_now); | 149 const base::TimeTicks& time_now); |
129 | 150 |
130 void DoPlay_Locked(); | 151 void StartRendering_Locked(); |
131 void DoPause_Locked(); | 152 void StopRendering_Locked(); |
132 | 153 |
133 // AudioRendererSink::RenderCallback implementation. | 154 // AudioRendererSink::RenderCallback implementation. |
134 // | 155 // |
135 // NOTE: These are called on the audio callback thread! | 156 // NOTE: These are called on the audio callback thread! |
136 // | 157 // |
137 // Render() fills the given buffer with audio data by delegating to its | 158 // Render() fills the given buffer with audio data by delegating to its |
138 // |algorithm_|. Render() also takes care of updating the clock. | 159 // |algorithm_|. Render() also takes care of updating the clock. |
139 // Returns the number of frames copied into |audio_bus|, which may be less | 160 // Returns the number of frames copied into |audio_bus|, which may be less |
140 // than or equal to the initial number of frames in |audio_bus| | 161 // than or equal to the initial number of frames in |audio_bus| |
141 // | 162 // |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
228 // After Initialize() has completed, all variables below must be accessed | 249 // After Initialize() has completed, all variables below must be accessed |
229 // under |lock_|. ------------------------------------------------------------ | 250 // under |lock_|. ------------------------------------------------------------ |
230 base::Lock lock_; | 251 base::Lock lock_; |
231 | 252 |
232 // Algorithm for scaling audio. | 253 // Algorithm for scaling audio. |
233 scoped_ptr<AudioRendererAlgorithm> algorithm_; | 254 scoped_ptr<AudioRendererAlgorithm> algorithm_; |
234 | 255 |
235 // Simple state tracking variable. | 256 // Simple state tracking variable. |
236 State state_; | 257 State state_; |
237 | 258 |
238 // Keep track of whether or not the sink is playing. | 259 // Keep track of whether or not the sink is playing and whether we should be |
260 // rendering. | |
261 bool rendering_; | |
239 bool sink_playing_; | 262 bool sink_playing_; |
240 | 263 |
241 // Keep track of our outstanding read to |decoder_|. | 264 // Keep track of our outstanding read to |decoder_|. |
242 bool pending_read_; | 265 bool pending_read_; |
243 | 266 |
244 // Keeps track of whether we received and rendered the end of stream buffer. | 267 // Keeps track of whether we received and rendered the end of stream buffer. |
245 bool received_end_of_stream_; | 268 bool received_end_of_stream_; |
246 bool rendered_end_of_stream_; | 269 bool rendered_end_of_stream_; |
247 | 270 |
248 scoped_ptr<AudioClock> audio_clock_; | 271 scoped_ptr<AudioClock> audio_clock_; |
(...skipping 27 matching lines...) Expand all Loading... | |
276 | 299 |
277 // NOTE: Weak pointers must be invalidated before all other member variables. | 300 // NOTE: Weak pointers must be invalidated before all other member variables. |
278 base::WeakPtrFactory<AudioRendererImpl> weak_factory_; | 301 base::WeakPtrFactory<AudioRendererImpl> weak_factory_; |
279 | 302 |
280 DISALLOW_COPY_AND_ASSIGN(AudioRendererImpl); | 303 DISALLOW_COPY_AND_ASSIGN(AudioRendererImpl); |
281 }; | 304 }; |
282 | 305 |
283 } // namespace media | 306 } // namespace media |
284 | 307 |
285 #endif // MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_ | 308 #endif // MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_ |
OLD | NEW |