Skip to content

Commit bed7c3d

Browse files
committed
Fix keyframes waveform updates
1 parent 7978978 commit bed7c3d

File tree

5 files changed

+30
-25
lines changed

5 files changed

+30
-25
lines changed

src/models/audiolevelstask.cpp

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013-2025 Meltytech, LLC
2+
* Copyright (c) 2013-2026 Meltytech, LLC
33
*
44
* This program is free software: you can redistribute it and/or modify
55
* it under the terms of the GNU General Public License as published by
@@ -45,6 +45,7 @@ static void deleteQVariantList(QVariantList *list)
4545
AudioLevelsTask::AudioLevelsTask(Mlt::Producer &producer, QObject *object, const QModelIndex &index)
4646
: QRunnable()
4747
, m_object(object)
48+
, m_qmlProducer(object)
4849
, m_isCanceled(false)
4950
, m_isForce(false)
5051
{
@@ -79,7 +80,11 @@ void AudioLevelsTask::start(Mlt::Producer &producer,
7980
if (*t == *task) {
8081
// If so, then just add ourselves to be notified upon completion.
8182
delete task;
82-
task = 0;
83+
task = nullptr;
84+
if (index.isValid())
85+
t->m_object = object;
86+
else
87+
t->m_qmlProducer = object;
8388
t->m_producers << ProducerAndIndex(new Mlt::Producer(producer), index);
8489
break;
8590
}
@@ -169,6 +174,22 @@ QString AudioLevelsTask::cacheKey()
169174
return key;
170175
}
171176

177+
void AudioLevelsTask::notifyQObjects(const QPersistentModelIndex &index)
178+
{
179+
if (index.isValid() && m_object) {
180+
// LOG_DEBUG() << "calling audioLevelsReady" << m_object << index;
181+
if (-1 != m_object->metaObject()->indexOfMethod("audioLevelsReady(QPersistentModelIndex)"))
182+
QMetaObject::invokeMethod(m_object,
183+
"audioLevelsReady",
184+
Q_ARG(const QPersistentModelIndex &, index));
185+
} else if (m_qmlProducer) {
186+
// LOG_DEBUG() << "calling audioLevelsChanged" << m_qmlProducer;
187+
if (-1 != m_qmlProducer->metaObject()->indexOfSignal("audioLevelsChanged()")) {
188+
QMetaObject::invokeMethod(m_qmlProducer, "audioLevelsChanged");
189+
}
190+
}
191+
}
192+
172193
void AudioLevelsTask::run()
173194
{
174195
// 2 channels interleaved of uchar values
@@ -223,12 +244,7 @@ void AudioLevelsTask::run()
223244
0,
224245
(mlt_destructor) deleteQVariantList);
225246
p.first->unlock();
226-
if (-1
227-
!= m_object->metaObject()->indexOfMethod(
228-
"audioLevelsReady(QPersistentModelIndex)"))
229-
QMetaObject::invokeMethod(m_object,
230-
"audioLevelsReady",
231-
Q_ARG(const QPersistentModelIndex &, p.second));
247+
notifyQObjects(p.second);
232248
}
233249
}
234250
}
@@ -298,11 +314,7 @@ void AudioLevelsTask::run()
298314
p.first->lock();
299315
p.first->set(kAudioLevelsProperty, levelsCopy, 0, (mlt_destructor) deleteQVariantList);
300316
p.first->unlock();
301-
if (-1
302-
!= m_object->metaObject()->indexOfMethod("audioLevelsReady(QPersistentModelIndex)"))
303-
QMetaObject::invokeMethod(m_object,
304-
"audioLevelsReady",
305-
Q_ARG(const QPersistentModelIndex &, p.second));
317+
notifyQObjects(p.second);
306318
}
307319
}
308320
}

src/models/audiolevelstask.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
/*
2-
* Copyright (c) 2013-2018 Meltytech, LLC
3-
* Author: Dan Dennedy <dan@dennedy.org>
2+
* Copyright (c) 2013-2026 Meltytech, LLC
43
*
54
* This program is free software: you can redistribute it and/or modify
65
* it under the terms of the GNU General Public License as published by
@@ -19,8 +18,6 @@
1918
#ifndef AUDIOLEVELSTASK_H
2019
#define AUDIOLEVELSTASK_H
2120

22-
#include "multitrackmodel.h"
23-
2421
#include <MltProducer.h>
2522
#include <MltProfile.h>
2623
#include <QList>
@@ -45,8 +42,10 @@ class AudioLevelsTask : public QRunnable
4542
private:
4643
Mlt::Producer *tempProducer();
4744
QString cacheKey();
45+
void notifyQObjects(const QPersistentModelIndex &index);
4846

4947
QObject *m_object;
48+
QObject *m_qmlProducer;
5049
typedef QPair<Mlt::Producer *, QPersistentModelIndex> ProducerAndIndex;
5150
QList<ProducerAndIndex> m_producers;
5251
QScopedPointer<Mlt::Producer> m_tempProducer;

src/qml/views/keyframes/KeyframeClip.qml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ Rectangle {
5959
waveformRepeater.model = Math.ceil(waveform.innerWidth / waveform.maxWidth);
6060
for (let i = 0; i < waveformRepeater.count; i++) {
6161
var item = waveformRepeater.itemAt(i);
62-
item.producer = producer;
62+
if (item.producer !== producer)
63+
item.producer = producer;
6364
item.update();
6465
}
6566
}

src/qmltypes/qmlproducer.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -177,12 +177,6 @@ void QmlProducer::launchGlaxnimate(const QString &filename) const
177177
}
178178
}
179179

180-
void QmlProducer::audioLevelsReady(const QPersistentModelIndex &index)
181-
{
182-
Q_UNUSED(index)
183-
emit audioLevelsChanged();
184-
}
185-
186180
void QmlProducer::remakeAudioLevels()
187181
{
188182
AudioLevelsTask::start(m_producer, this, QModelIndex(), true);

src/qmltypes/qmlproducer.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ class QmlProducer : public QObject
7171
void seek(int position);
7272
Mlt::Producer &producer() { return m_producer; }
7373
Q_INVOKABLE Mlt::Producer *getMltProducer() { return &m_producer; }
74-
Q_INVOKABLE void audioLevelsReady(const QPersistentModelIndex &index);
7574
Q_INVOKABLE void remakeAudioLevels();
7675
double displayAspectRatio();
7776
Q_INVOKABLE QString get(QString name, int position = -1);

0 commit comments

Comments
 (0)