]> git.sesse.net Git - kdenlive/blobdiff - src/lib/audio/audioEnvelope.cpp
Fix audio playback issues after using audio align.
[kdenlive] / src / lib / audio / audioEnvelope.cpp
index 5f1bbc5d776239c33d2f3f6e0d882f03d01e010a..379d2d2196a2ee7e1eaae0acd80db44730ef0628 100644 (file)
 #include <cmath>
 #include <iostream>
 
-AudioEnvelope::AudioEnvelope(Mlt::Producer *producer) :
+AudioEnvelope::AudioEnvelope(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_envelopeStdDevCalculated(false),
     m_envelopeIsNormalized(false)
 {
+    // make a copy of the producer to avoid audio playback issues
+    m_producer = new Mlt::Producer(*(producer->profile()), producer->get("resource"));
     m_info = new AudioInfo(m_producer);
+
+    Q_ASSERT(m_offset >= 0);
+    if (m_length > 0) {
+        Q_ASSERT(m_length+m_offset <= m_envelopeSize);
+        m_envelopeSize = m_length;
+    }
 }
 
 AudioEnvelope::~AudioEnvelope()
 {
     if (m_envelope != NULL) {
-        delete m_envelope;
+        delete[] m_envelope;
     }
     delete m_info;
+    delete m_producer;
 }
 
 
@@ -47,6 +57,10 @@ int AudioEnvelope::envelopeSize() const
 {
     return m_envelopeSize;
 }
+int64_t AudioEnvelope::maxValue() const
+{
+    return m_envelopeMax;
+}
 
 
 
@@ -71,6 +85,9 @@ void AudioEnvelope::loadEnvelope()
 
     QTime t;
     t.start();
+    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++) {
 
         frame = m_producer->get_frame(i);
@@ -89,6 +106,16 @@ void AudioEnvelope::loadEnvelope()
         if (sum > m_envelopeMax) {
             m_envelopeMax = sum;
         }
+
+//        std::cout << position << "|" << m_producer->get_playtime()
+//                  << "-" << m_producer->get_in() << "+" << m_producer->get_out() << " ";
+
+        delete frame;
+
+        count++;
+        if (m_length > 0 && count > m_length) {
+            break;
+        }
     }
     m_envelopeMean /= m_envelopeSize;
     std::cout << "Calculating the envelope (" << m_envelopeSize << " frames) took "