From 9b224fd87da4da4cd9cf46bf08d8c6874a373a50 Mon Sep 17 00:00:00 2001 From: David Sansome Date: Wed, 19 May 2010 13:26:23 +0000 Subject: [PATCH] Fix the fader behaviour a bit --- src/engines/gstenginepipeline.cpp | 20 +++++++++++++++----- src/engines/gstenginepipeline.h | 3 ++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/engines/gstenginepipeline.cpp b/src/engines/gstenginepipeline.cpp index 63497664b..724193654 100644 --- a/src/engines/gstenginepipeline.cpp +++ b/src/engines/gstenginepipeline.cpp @@ -358,19 +358,28 @@ void GstEnginePipeline::UpdateVolume() { void GstEnginePipeline::StartFader(int duration_msec, QTimeLine::Direction direction, QTimeLine::CurveShape shape) { - delete fader_; + // If there's already another fader running then start from the same time + // that one was already at. + int start_time = direction == QTimeLine::Forward ? 0 : duration_msec; + if (fader_ && fader_->state() == QTimeLine::Running) + start_time = fader_->currentTime(); - fader_ = new QTimeLine(duration_msec, this); - connect(fader_, SIGNAL(valueChanged(qreal)), SLOT(SetVolumeModifier(qreal))); - connect(fader_, SIGNAL(finished()), SLOT(FaderTimelineFinished())); + fader_.reset(new QTimeLine(duration_msec, this)); + connect(fader_.get(), SIGNAL(valueChanged(qreal)), SLOT(SetVolumeModifier(qreal))); + connect(fader_.get(), SIGNAL(finished()), SLOT(FaderTimelineFinished())); fader_->setDirection(direction); fader_->setCurveShape(shape); - fader_->start(); + fader_->setCurrentTime(start_time); + fader_->resume(); + + fader_fudge_timer_.stop(); SetVolumeModifier(fader_->currentValue()); } void GstEnginePipeline::FaderTimelineFinished() { + fader_.reset(); + // Wait a little while longer before emitting the finished signal (and // probably distroying the pipeline) to account for delays in the audio // server/driver. @@ -379,6 +388,7 @@ void GstEnginePipeline::FaderTimelineFinished() { void GstEnginePipeline::timerEvent(QTimerEvent* e) { if (e->timerId() == fader_fudge_timer_.timerId()) { + fader_fudge_timer_.stop(); emit FaderFinished(); return; } diff --git a/src/engines/gstenginepipeline.h b/src/engines/gstenginepipeline.h index 6c2c037dd..507add6d4 100644 --- a/src/engines/gstenginepipeline.h +++ b/src/engines/gstenginepipeline.h @@ -23,6 +23,7 @@ #include #include +#include #include "engine_fwd.h" @@ -115,7 +116,7 @@ class GstEnginePipeline : public QObject { int volume_percent_; qreal volume_modifier_; - QTimeLine* fader_; + boost::scoped_ptr fader_; QBasicTimer fader_fudge_timer_; GstElement* pipeline_;