Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(517)

Unified Diff: media/filters/audio_renderer_base.cc

Issue 165472: Merge 23255 - Implemented endofstream callback for media::PipelineImpl.... (Closed) Base URL: svn://chrome-svn/chrome/branches/195/src/
Patch Set: Created 11 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/filters/audio_renderer_base.h ('k') | media/filters/audio_renderer_base_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/audio_renderer_base.cc
===================================================================
--- media/filters/audio_renderer_base.cc (revision 23335)
+++ media/filters/audio_renderer_base.cc (working copy)
@@ -13,6 +13,8 @@
AudioRendererBase::AudioRendererBase()
: state_(kUninitialized),
+ recieved_end_of_stream_(false),
+ rendered_end_of_stream_(false),
pending_reads_(0) {
}
@@ -61,6 +63,8 @@
// Throw away everything and schedule our reads.
last_fill_buffer_time_ = base::TimeDelta();
+ recieved_end_of_stream_ = false;
+ rendered_end_of_stream_ = false;
// |algorithm_| will request more reads.
algorithm_->FlushBuffers();
@@ -114,6 +118,15 @@
callback->Run();
}
+bool AudioRendererBase::HasEnded() {
+ AutoLock auto_lock(lock_);
+ if (rendered_end_of_stream_) {
+ DCHECK(algorithm_->IsQueueEmpty())
+ << "Audio queue should be empty if we have rendered end of stream";
+ }
+ return recieved_end_of_stream_ && rendered_end_of_stream_;
+}
+
void AudioRendererBase::OnReadComplete(Buffer* buffer_in) {
AutoLock auto_lock(lock_);
DCHECK(state_ == kPaused || state_ == kSeeking || state_ == kPlaying);
@@ -121,7 +134,9 @@
--pending_reads_;
// Don't enqueue an end-of-stream buffer because it has no data.
- if (!buffer_in->IsEndOfStream()) {
+ if (buffer_in->IsEndOfStream()) {
+ recieved_end_of_stream_ = true;
+ } else {
// Note: Calling this may schedule more reads.
algorithm_->EnqueueBuffer(buffer_in);
}
@@ -129,7 +144,7 @@
// Check for our preroll complete condition.
if (state_ == kSeeking) {
DCHECK(seek_callback_.get());
- if (algorithm_->IsQueueFull() || buffer_in->IsEndOfStream()) {
+ if (algorithm_->IsQueueFull() || recieved_end_of_stream_) {
// Transition into paused whether we have data in |algorithm_| or not.
// FillBuffer() will play silence if there's nothing to fill.
state_ = kPaused;
@@ -174,6 +189,14 @@
// Do the fill.
dest_written = algorithm_->FillBuffer(dest, dest_len);
+ // Check if we finally reached end of stream by emptying |algorithm_|.
+ if (recieved_end_of_stream_ && algorithm_->IsQueueEmpty()) {
+ if (!rendered_end_of_stream_) {
+ rendered_end_of_stream_ = true;
+ host()->NotifyEnded();
+ }
+ }
+
// Get the current time.
last_fill_buffer_time_ = algorithm_->GetTime();
}
Property changes on: media\filters\audio_renderer_base.cc
___________________________________________________________________
Modified: svn:mergeinfo
Merged /trunk/src/media/filters/audio_renderer_base.cc:r23255
« no previous file with comments | « media/filters/audio_renderer_base.h ('k') | media/filters/audio_renderer_base_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698