From 207154c1bafb957f7416a785072612308de4310d Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Sat, 13 Oct 2012 18:54:31 +0200 Subject: [PATCH] Show audio wave when playing audio clip instead of boring white --- src/docclipbase.cpp | 3 +++ src/renderer.cpp | 31 ++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 9b55d6b1..09494c9e 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -672,6 +672,9 @@ Mlt::Producer *DocClipBase::getCloneProducer() if (m_properties.contains("duration")) prod->set("length", m_properties.value("duration").toInt()); if (m_properties.contains("out"))prod->set("out", m_properties.value("out").toInt()); } + if (m_clipType == AUDIO) { + prod->set("_audioclip", 1); + } } return prod; } diff --git a/src/renderer.cpp b/src/renderer.cpp index 65706cbe..7572a6b9 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -1118,9 +1118,38 @@ int Render::setProducer(Mlt::Producer *producer, int position) emit stopped(); if (position == -1 && producer->get("id") == currentId) position = consumerPosition; if (position != -1) producer->seek(position); + m_fps = producer->get_fps(); int volume = KdenliveSettings::volume(); + if (producer->get_int("_audioclip") == 1) { + // This is an audio only clip, create fake multitrack to apply audiowave filter + Mlt::Tractor *tractor = new Mlt::Tractor(); + Mlt::Producer *color= new Mlt::Producer(*m_mltProfile, "color:red"); + color->set_in_and_out(0, producer->get_out()); + tractor->set_track(*producer, 0); + tractor->set_track(*color, 1); + + Mlt::Consumer xmlConsumer(*m_mltProfile, "xml:audio_hack"); + if (!xmlConsumer.is_valid()) return -1; + xmlConsumer.set("terminate_on_pause", 1); + xmlConsumer.connect(tractor->parent()); + xmlConsumer.run(); + delete tractor; + delete color; + delete producer; + QString playlist = QString::fromUtf8(xmlConsumer.get("audio_hack")); + + Mlt::Producer *result = new Mlt::Producer(*m_mltProfile, "xml-string", playlist.toUtf8().constData()); + Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, "audiowave"); + result->attach(*filter); + tractor = new Mlt::Tractor(); + tractor->set_track(*result, 0); + delete result; + delete filter; + producer = &(tractor->parent()); + m_mltConsumer->connect(*producer); + } + producer->set("meta.volume", (double)volume / 100); - m_fps = producer->get_fps(); blockSignals(false); m_mltConsumer->connect(*producer); -- 2.39.2