| 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 StartRendering() OVERRIDE; | 75 virtual void Play() OVERRIDE; |
| 76 virtual void StopRendering() OVERRIDE; | 76 virtual void Pause() 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 // Important detail: being in kPlaying doesn't imply that audio is being | 100 // TODO(acolwell): Add a state machine graph. |
| 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() | |
| 122 enum State { | 101 enum State { |
| 123 kUninitialized, | 102 kUninitialized, |
| 124 kInitializing, | 103 kInitializing, |
| 104 kPaused, |
| 125 kFlushing, | 105 kFlushing, |
| 126 kFlushed, | |
| 127 kPrerolling, | 106 kPrerolling, |
| 128 kPlaying, | 107 kPlaying, |
| 129 kStopped, | 108 kStopped, |
| 130 kUnderflow, | 109 kUnderflow, |
| 131 kRebuffering, | 110 kRebuffering, |
| 132 }; | 111 }; |
| 133 | 112 |
| 134 // Callback from the audio decoder delivering decoded audio samples. | 113 // Callback from the audio decoder delivering decoded audio samples. |
| 135 void DecodedAudioReady(AudioBufferStream::Status status, | 114 void DecodedAudioReady(AudioBufferStream::Status status, |
| 136 const scoped_refptr<AudioBuffer>& buffer); | 115 const scoped_refptr<AudioBuffer>& buffer); |
| 137 | 116 |
| 138 // Handles buffers that come out of |splicer_|. | 117 // Handles buffers that come out of |splicer_|. |
| 139 // Returns true if more buffers are needed. | 118 // Returns true if more buffers are needed. |
| 140 bool HandleSplicerBuffer(const scoped_refptr<AudioBuffer>& buffer); | 119 bool HandleSplicerBuffer(const scoped_refptr<AudioBuffer>& buffer); |
| 141 | 120 |
| 142 // Helper functions for AudioDecoder::Status values passed to | 121 // Helper functions for AudioDecoder::Status values passed to |
| 143 // DecodedAudioReady(). | 122 // DecodedAudioReady(). |
| 144 void HandleAbortedReadOrDecodeError(bool is_decode_error); | 123 void HandleAbortedReadOrDecodeError(bool is_decode_error); |
| 145 | 124 |
| 146 // Estimate earliest time when current buffer can stop playing. | 125 // Estimate earliest time when current buffer can stop playing. |
| 147 void UpdateEarliestEndTime_Locked(int frames_filled, | 126 void UpdateEarliestEndTime_Locked(int frames_filled, |
| 148 const base::TimeDelta& playback_delay, | 127 const base::TimeDelta& playback_delay, |
| 149 const base::TimeTicks& time_now); | 128 const base::TimeTicks& time_now); |
| 150 | 129 |
| 151 void StartRendering_Locked(); | 130 void DoPlay_Locked(); |
| 152 void StopRendering_Locked(); | 131 void DoPause_Locked(); |
| 153 | 132 |
| 154 // AudioRendererSink::RenderCallback implementation. | 133 // AudioRendererSink::RenderCallback implementation. |
| 155 // | 134 // |
| 156 // NOTE: These are called on the audio callback thread! | 135 // NOTE: These are called on the audio callback thread! |
| 157 // | 136 // |
| 158 // Render() fills the given buffer with audio data by delegating to its | 137 // Render() fills the given buffer with audio data by delegating to its |
| 159 // |algorithm_|. Render() also takes care of updating the clock. | 138 // |algorithm_|. Render() also takes care of updating the clock. |
| 160 // Returns the number of frames copied into |audio_bus|, which may be less | 139 // Returns the number of frames copied into |audio_bus|, which may be less |
| 161 // than or equal to the initial number of frames in |audio_bus| | 140 // than or equal to the initial number of frames in |audio_bus| |
| 162 // | 141 // |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 // After Initialize() has completed, all variables below must be accessed | 228 // After Initialize() has completed, all variables below must be accessed |
| 250 // under |lock_|. ------------------------------------------------------------ | 229 // under |lock_|. ------------------------------------------------------------ |
| 251 base::Lock lock_; | 230 base::Lock lock_; |
| 252 | 231 |
| 253 // Algorithm for scaling audio. | 232 // Algorithm for scaling audio. |
| 254 scoped_ptr<AudioRendererAlgorithm> algorithm_; | 233 scoped_ptr<AudioRendererAlgorithm> algorithm_; |
| 255 | 234 |
| 256 // Simple state tracking variable. | 235 // Simple state tracking variable. |
| 257 State state_; | 236 State state_; |
| 258 | 237 |
| 259 // Keep track of whether or not the sink is playing and whether we should be | 238 // Keep track of whether or not the sink is playing. |
| 260 // rendering. | |
| 261 bool rendering_; | |
| 262 bool sink_playing_; | 239 bool sink_playing_; |
| 263 | 240 |
| 264 // Keep track of our outstanding read to |decoder_|. | 241 // Keep track of our outstanding read to |decoder_|. |
| 265 bool pending_read_; | 242 bool pending_read_; |
| 266 | 243 |
| 267 // Keeps track of whether we received and rendered the end of stream buffer. | 244 // Keeps track of whether we received and rendered the end of stream buffer. |
| 268 bool received_end_of_stream_; | 245 bool received_end_of_stream_; |
| 269 bool rendered_end_of_stream_; | 246 bool rendered_end_of_stream_; |
| 270 | 247 |
| 271 scoped_ptr<AudioClock> audio_clock_; | 248 scoped_ptr<AudioClock> audio_clock_; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 299 | 276 |
| 300 // NOTE: Weak pointers must be invalidated before all other member variables. | 277 // NOTE: Weak pointers must be invalidated before all other member variables. |
| 301 base::WeakPtrFactory<AudioRendererImpl> weak_factory_; | 278 base::WeakPtrFactory<AudioRendererImpl> weak_factory_; |
| 302 | 279 |
| 303 DISALLOW_COPY_AND_ASSIGN(AudioRendererImpl); | 280 DISALLOW_COPY_AND_ASSIGN(AudioRendererImpl); |
| 304 }; | 281 }; |
| 305 | 282 |
| 306 } // namespace media | 283 } // namespace media |
| 307 | 284 |
| 308 #endif // MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_ | 285 #endif // MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_ |
| OLD | NEW |