]> git.sesse.net Git - kdenlive/blobdiff - src/lib/audio/audioEnvelope.cpp
use only kDebug/qDebug, no cout
[kdenlive] / src / lib / audio / audioEnvelope.cpp
index a7c02a2fe619022b7fd57a02680c3a536d586b38..55cc3622e7aa05f032e4c988ea98c0948805e7a4 100644 (file)
 #include "audioEnvelope.h"
 
 #include "audioStreamInfo.h"
+#include <QDebug>
 #include <QImage>
 #include <QTime>
 #include <cmath>
-#include <iostream>
 
-AudioEnvelope::AudioEnvelope(Mlt::Producer *producer, int offset, int length) :
+AudioEnvelope::AudioEnvelope(const QString &url, Mlt::Producer *producer, int offset, int length) :
     m_envelope(NULL),
-    m_producer(producer),
     m_offset(offset),
     m_length(length),
     m_envelopeSize(producer->get_length()),
+    m_envelopeMax(0),
+    m_envelopeMean(0),
+    m_envelopeStdDev(0),
     m_envelopeStdDevCalculated(false),
     m_envelopeIsNormalized(false)
 {
+    // make a copy of the producer to avoid audio playback issues
+    QString path = QString::fromUtf8(producer->get("resource"));
+    if (path == QLatin1String("<playlist>") || path == QLatin1String("<tractor>") || path ==QLatin1String( "<producer>"))
+       path = url;
+    m_producer = new Mlt::Producer(*(producer->profile()), path.toUtf8().constData());
+    if (!m_producer || !m_producer->is_valid()) {
+       qDebug()<<"// Cannot create envelope for producer: "<<path;
+    }
     m_info = new AudioInfo(m_producer);
 
     Q_ASSERT(m_offset >= 0);
@@ -40,6 +50,7 @@ AudioEnvelope::~AudioEnvelope()
         delete[] m_envelope;
     }
     delete m_info;
+    delete m_producer;
 }
 
 
@@ -67,7 +78,7 @@ void AudioEnvelope::loadEnvelope()
 {
     Q_ASSERT(m_envelope == NULL);
 
-    std::cout << "Loading envelope ..." << std::endl;
+    qDebug() << "Loading envelope ...";
 
     int samplingRate = m_info->info(0)->samplingRate();
     mlt_audio_format format_s16 = mlt_audio_s16;
@@ -86,7 +97,7 @@ void AudioEnvelope::loadEnvelope()
     int count = 0;
     m_producer->seek(m_offset);
     m_producer->set_speed(1.0); // This is necessary, otherwise we don't get any new frames in the 2nd run.
-    for (int i = 0; i < m_envelopeSize; i++) {
+    for (int i = 0; i < m_envelopeSize; ++i) {
 
         frame = m_producer->get_frame(i);
         position = mlt_frame_get_position(frame->get_frame());
@@ -105,7 +116,7 @@ void AudioEnvelope::loadEnvelope()
             m_envelopeMax = sum;
         }
 
-//        std::cout << position << "|" << m_producer->get_playtime()
+//        qDebug() << position << "|" << m_producer->get_playtime()
 //                  << "-" << m_producer->get_in() << "+" << m_producer->get_out() << " ";
 
         delete frame;
@@ -116,14 +127,14 @@ void AudioEnvelope::loadEnvelope()
         }
     }
     m_envelopeMean /= m_envelopeSize;
-    std::cout << "Calculating the envelope (" << m_envelopeSize << " frames) took "
-              << t.elapsed() << " ms." << std::endl;
+    qDebug() << "Calculating the envelope (" << m_envelopeSize << " frames) took "
+              << t.elapsed() << " ms.";
 }
 
 int64_t AudioEnvelope::loadStdDev()
 {
     if (m_envelopeStdDevCalculated) {
-        std::cout << "Standard deviation already calculated, not re-calculating." << std::endl;
+        qDebug() << "Standard deviation already calculated, not re-calculating.";
     } else {
 
         if (m_envelope == NULL) {
@@ -131,7 +142,7 @@ int64_t AudioEnvelope::loadStdDev()
         }
 
         m_envelopeStdDev = 0;
-        for (int i = 0; i < m_envelopeSize; i++) {
+        for (int i = 0; i < m_envelopeSize; ++i) {
             m_envelopeStdDev += sqrt((m_envelope[i]-m_envelopeMean)*(m_envelope[i]-m_envelopeMean)/m_envelopeSize);
         }
         m_envelopeStdDevCalculated = true;
@@ -150,7 +161,7 @@ void AudioEnvelope::normalizeEnvelope(bool clampTo0)
 
         m_envelopeMax = 0;
         int64_t newMean = 0;
-        for (int i = 0; i < m_envelopeSize; i++) {
+        for (int i = 0; i < m_envelopeSize; ++i) {
 
             m_envelope[i] -= m_envelopeMean;
 
@@ -179,6 +190,10 @@ QImage AudioEnvelope::drawEnvelope()
 
     QImage img(m_envelopeSize, 400, QImage::Format_ARGB32);
     img.fill(qRgb(255,255,255));
+
+    if (m_envelopeMax == 0)
+        return img;
+
     double fy;
     for (int x = 0; x < img.width(); x++) {
         fy = m_envelope[x]/double(m_envelopeMax) * img.height();
@@ -192,15 +207,14 @@ QImage AudioEnvelope::drawEnvelope()
 void AudioEnvelope::dumpInfo() const
 {
     if (m_envelope == NULL) {
-        std::cout << "Envelope not generated, no information available." << std::endl;
+        qDebug() << "Envelope not generated, no information available.";
     } else {
-        std::cout << "Envelope info" << std::endl
-                  << "* size = " << m_envelopeSize << std::endl
-                  << "* max = " << m_envelopeMax << std::endl
-                  << "* µ = " << m_envelopeMean << std::endl
-                     ;
+        qDebug() << "Envelope info"
+                 << "\n* size = " << m_envelopeSize
+                 << "\n* max = " << m_envelopeMax
+                 << "\n* µ = " << m_envelopeMean;
         if (m_envelopeStdDevCalculated) {
-            std::cout << "* s = " << m_envelopeStdDev << std::endl;
+            qDebug() << "* s = " << m_envelopeStdDev;
         }
     }
 }