m_isLoopMode(false),
m_isSplitView(false),
m_blackClip(NULL),
- m_winid(winid)
+ m_winid(winid),
+ m_paused(true)
{
qRegisterMetaType<stringMap> ("stringMap");
analyseAudio = KdenliveSettings::monitor_audio();
void Render::seek(GenTime time)
{
+ if (!m_mltProducer)
+ return;
int pos = time.frames(m_fps);
seek(pos);
}
void Render::seek(int time)
{
- if (!m_mltProducer)
- return;
+ resetZoneMode();
if (requestedSeekPosition == SEEK_INACTIVE) {
requestedSeekPosition = time;
m_mltProducer->seek(time);
//m_mltConsumer->purge();
- if (m_mltProducer->get_speed() == 0) {
+ if (m_paused) {
refresh();
}
}
}
m_mltProducer = producer;
m_mltProducer->set_speed(0);
- if (monitorIsActive) startConsumer();
+ if (monitorIsActive) {
+ startConsumer();
+ }
emit durationChanged(m_mltProducer->get_playtime());
position = m_mltProducer->position();
emit rendererPosition(position);
requestedSeekPosition = SEEK_INACTIVE;
if (!m_mltProducer || !m_mltConsumer)
return;
- if (m_mltProducer->get_speed() == 0.0) return;
- if (m_isZoneMode) resetZoneMode();
- m_mltConsumer->set("refresh", 0);
+ m_paused = true;
m_mltProducer->set_speed(0.0);
- m_mltConsumer->purge();
+ m_mltConsumer->set("refresh", 0);
+ if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
+ m_mltProducer->seek(m_mltConsumer->position());
}
void Render::switchPlay(bool play)
if (!m_mltProducer || !m_mltConsumer)
return;
if (m_isZoneMode) resetZoneMode();
- if (play && m_mltProducer->get_speed() == 0.0) {
+ if (play && m_paused) {
if (m_name == Kdenlive::clipMonitor && m_mltConsumer->position() == m_mltProducer->get_out()) m_mltProducer->seek(0);
+ m_paused = false;
if (m_mltConsumer->is_stopped()) {
m_mltConsumer->start();
}
m_mltProducer->set_speed(1.0);
m_mltConsumer->set("refresh", 1);
} else if (!play) {
+ m_paused = true;
m_mltProducer->set_speed(0.0);
m_mltConsumer->set("refresh", 0);
+ if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
m_mltProducer->seek(m_mltConsumer->position());
- if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
- if (m_isZoneMode) resetZoneMode();
-
- //emitConsumerStopped();
- /*m_mltConsumer->set("refresh", 0);
- m_mltConsumer->stop();
- m_mltConsumer->purge();
- m_mltProducer->set_speed(0.0);
- //m_framePosition = m_mltProducer->position();
- m_mltProducer->seek(m_framePosition);
- emit rendererPosition(m_framePosition);*/
}
}
void Render::play(double speed)
{
requestedSeekPosition = SEEK_INACTIVE;
- if (!m_mltProducer || m_mltProducer->get_speed() == speed)
- return;
+ if (!m_mltProducer) return;
+ double current_speed = m_mltProducer->get_speed();
+ if (current_speed == speed) return;
+ if (m_isZoneMode) resetZoneMode();
// if (speed == 0.0) m_mltProducer->set("out", m_mltProducer->get_length() - 1);
m_mltProducer->set_speed(speed);
+ if (m_mltConsumer->is_stopped() && speed != 0) {
+ m_mltConsumer->start();
+ }
+ m_paused = speed == 0;
+ if (current_speed == 0 && speed != 0) m_mltConsumer->set("refresh", 1);
}
void Render::play(const GenTime & startTime)
requestedSeekPosition = SEEK_INACTIVE;
if (!m_mltProducer || !m_mltConsumer)
return;
+ m_paused = false;
m_mltProducer->seek((int)(startTime.frames(m_fps)));
m_mltProducer->set_speed(1.0);
m_mltConsumer->set("refresh", 1);
{
requestedSeekPosition = SEEK_INACTIVE;
if (!m_mltProducer || !m_mltConsumer)
- return;
- if (!m_isZoneMode) m_originalOut = m_mltProducer->get_playtime() - 1;
+ return;
m_mltProducer->set("out", (int)(stopTime.frames(m_fps)));
m_mltProducer->seek((int)(startTime.frames(m_fps)));
+ m_paused = false;
m_mltProducer->set_speed(1.0);
m_mltConsumer->set("refresh", 1);
if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
void Render::resetZoneMode()
{
- if (!m_mltProducer || (!m_isZoneMode && !m_isLoopMode)) return;
- m_mltProducer->set("out", m_originalOut);
+ if (!m_isZoneMode && !m_isLoopMode) return;
+ m_mltProducer->set("out", m_mltProducer->get_length());
//m_mltProducer->set("eof", "pause");
m_isZoneMode = false;
m_isLoopMode = false;
void Render::seekToFrame(int pos)
{
+ if (!m_mltProducer)
+ return;
resetZoneMode();
seek(pos);
}
void Render::seekToFrameDiff(int diff)
{
+ if (!m_mltProducer)
+ return;
resetZoneMode();
if (requestedSeekPosition == SEEK_INACTIVE)
seek(m_mltProducer->position() + diff);
void Render::refreshIfActive()
{
- if (!m_mltConsumer->is_stopped() && m_mltProducer && m_mltProducer->get_speed() == 0) m_refreshTimer.start();
+ if (!m_mltConsumer->is_stopped() && m_mltProducer && m_paused) m_refreshTimer.start();
}
void Render::doRefresh()
{
- if (m_mltProducer && m_mltProducer->get_speed() == 0) m_refreshTimer.start();
+ if (m_mltProducer && m_paused) m_refreshTimer.start();
}
void Render::refresh()
return;
if (m_mltConsumer) {
if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
+ m_paused = false;
//m_mltConsumer->purge();
m_mltConsumer->set("refresh", 1);
}
}
}
+bool Render::isPlaying() const
+{
+ if (!m_mltConsumer || m_mltConsumer->is_stopped()) return false;
+ return !m_paused;
+}
+
double Render::playSpeed() const
{
if (m_mltProducer) return m_mltProducer->get_speed();
emit rendererPosition(currentPos);
if (requestedSeekPosition != SEEK_INACTIVE) {
m_mltProducer->seek(requestedSeekPosition);
- if (m_mltProducer->get_speed() == 0) {
+ if (m_paused) {
refresh();
}
requestedSeekPosition = SEEK_INACTIVE;
// This is used to know when the playing stopped
if (m_mltProducer) {
double pos = m_mltProducer->position();
+ m_paused = true;
if (m_isLoopMode) play(m_loopStart);
//else if (m_isZoneMode) resetZoneMode();
emit rendererStopped((int) pos);
{
if (requestedSeekPosition != SEEK_INACTIVE) {
m_mltProducer->seek(requestedSeekPosition);
- if (m_mltProducer->get_speed() == 0) {
+ if (m_paused) {
refresh();
}
}
int trackNb = tractor->count();
int duration = 0;
int trackDuration;
+ if (m_isZoneMode) resetZoneMode();
if (trackNb == 1) {
Mlt::Producer trackProducer(tractor->track(0));
duration = trackProducer.get_playtime() - 1;
int Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod, bool overwrite, bool push)
{
+ m_refreshTimer.stop();
if (m_mltProducer == NULL) {
kDebug() << "PLAYLIST NOT INITIALISED //////";
return -1;
bool Render::mltRemoveClip(int track, GenTime position)
{
+ m_refreshTimer.stop();
Mlt::Service service(m_mltProducer->parent().get_service());
if (service.type() != tractor_type) {
kWarning() << "// TRACTOR PROBLEM";