From 162b2efbb08d1f76c58e6106d5901afcdaf9295f Mon Sep 17 00:00:00 2001 From: David Sansome Date: Thu, 29 May 2014 21:33:53 +1000 Subject: [PATCH] If we don't know the length of a song from the metadata, get it from the pipeline which has the real length. Fixes #2818 when the length isn't in the podcast metadata. --- src/engines/gstengine.cpp | 12 +++++++++--- src/ui/mainwindow.cpp | 5 +++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/engines/gstengine.cpp b/src/engines/gstengine.cpp index a87985701..29fa9df13 100755 --- a/src/engines/gstengine.cpp +++ b/src/engines/gstengine.cpp @@ -192,15 +192,21 @@ void GstEngine::ReloadSettings() { qint64 GstEngine::position_nanosec() const { if (!current_pipeline_) return 0; - qint64 result = current_pipeline_->position() - beginning_nanosec_; + const qint64 result = current_pipeline_->position() - beginning_nanosec_; return qint64(qMax(0ll, result)); } qint64 GstEngine::length_nanosec() const { if (!current_pipeline_) return 0; - qint64 result = end_nanosec_ - beginning_nanosec_; - return qint64(qMax(0ll, result)); + const qint64 result = end_nanosec_ - beginning_nanosec_; + + if (result > 0) { + return result; + } else { + // Get the length from the pipeline if we don't know. + return current_pipeline_->length(); + } } Engine::State GstEngine::state() const { diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index a1c350dad..fb7b36f0b 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -1280,7 +1280,7 @@ void MainWindow::UpdateTrackPosition() { PlaylistItemPtr item(app_->player()->GetCurrentItem()); const int position = std::floor( float(app_->player()->engine()->position_nanosec()) / kNsecPerSec + 0.5); - const int length = item->Metadata().length_nanosec() / kNsecPerSec; + const int length = app_->player()->engine()->length_nanosec() / kNsecPerSec; const int scrobble_point = playlist->scrobble_point_nanosec() / kNsecPerSec; if (length <= 0) { @@ -1339,7 +1339,8 @@ void MainWindow::UpdateTrackSliderPosition() { const int slider_position = std::floor( float(app_->player()->engine()->position_nanosec()) / kNsecPerMsec); - const int slider_length = item->Metadata().length_nanosec() / kNsecPerMsec; + const int slider_length = + app_->player()->engine()->length_nanosec() / kNsecPerMsec; // Update the slider ui_->track_slider->SetValue(slider_position, slider_length);