]> git.sesse.net Git - kdenlive/commitdiff
waveform display
authorMarco Gittler <marco@gitma.de>
Mon, 27 Sep 2010 20:14:41 +0000 (20:14 +0000)
committerMarco Gittler <marco@gitma.de>
Mon, 27 Sep 2010 20:14:41 +0000 (20:14 +0000)
svn path=/trunk/kdenlive/; revision=4944

src/CMakeLists.txt
src/monitor.cpp
src/monitor.h
src/renderer.cpp
src/renderer.h

index 8d38fad6f5870e3b677ce4a81ba9a3fac6909fbe..2c48801b70f4af252fc53a3c9065be5db29d8022 100644 (file)
@@ -217,6 +217,7 @@ set(kdenlive_SRCS
   monitorscene.cpp
   geometrywidget.cpp
   doubleparameterwidget.cpp
+  audiosignal.cpp
 )
 
 
index f7ae4644c2bcb401c3c496b06cce147372267f2b..f61ba571a94801d07f59beebd0de59d141d2dffc 100644 (file)
@@ -26,6 +26,7 @@
 #include "monitorscene.h"
 #include "abstractclipitem.h"
 #include "kdenlivesettings.h"
+#include "audiosignal.h"
 
 #include <KDebug>
 #include <KLocale>
@@ -48,6 +49,7 @@
 Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget *parent) :
     QWidget(parent),
     render(NULL),
+       m_audiosignal(NULL),
     m_name(name),
     m_monitorManager(manager),
     m_currentClip(NULL),
@@ -152,6 +154,9 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget
     render = new Render(m_name, (int) m_monitorRefresh->winId(), -1, profile, this);
     m_monitorRefresh->setRenderer(render);
 #endif
+       m_audiosignal= new AudioSignal(this);
+       rendererBox->addWidget(m_audiosignal);
+    connect(render, SIGNAL(showAudioSignal(QByteArray)), m_audiosignal, SLOT(showAudio(QByteArray)));
 
     connect(m_ruler, SIGNAL(seekRenderer(int)), this, SLOT(slotSeek(int)));
     connect(render, SIGNAL(durationChanged(int)), this, SLOT(adjustRulerSize(int)));
index 8a2bd274226556e95c089809a3045ac5f5abb0eb..ddfe2804abfdc2571e31d9d0b2e3d454a201a598 100644 (file)
@@ -45,6 +45,7 @@ class Transition;
 class ClipItem;
 class QGraphicsView;
 class QGraphicsPixmapItem;
+class AudioSignal;
 
 class MonitorRefresh : public QWidget
 {
@@ -142,6 +143,7 @@ private:
 #ifdef Q_WS_MAC
     VideoGLWidget *m_glWidget;
 #endif
+       AudioSignal *m_audiosignal;
 
     GenTime getSnapForPos(bool previous);
 
index 600dcfad33af019b04cb9509272e52c0723828e8..80ae7c38cd97792af94b12325210b0dd0edbcd39 100644 (file)
@@ -64,7 +64,7 @@ static void consumer_frame_show(mlt_consumer, Render * self, mlt_frame frame_ptr
 #ifdef Q_WS_MAC
     self->showFrame(frame);
 #endif
-
+       self->showAudio(frame);
     self->emitFrameNumber(mlt_frame_get_position(frame_ptr));
     if (self->sendFrameForAnalysis && frame_ptr->convert_image) {
         self->emitFrameUpdated(frame);
@@ -1493,6 +1493,47 @@ void Render::showFrame(Mlt::Frame& frame)
 }
 #endif
 
+void Render::showAudio(Mlt::Frame& frame)
+{
+       mlt_audio_format audio_format=mlt_audio_pcm;
+       int freq,num_channels,samples;
+       uint8_t* data=(uint8_t*)frame.get_audio(audio_format,freq,num_channels,samples);
+       if (!data)
+               return;
+       int value=0;
+       QByteArray channels;
+
+       for (int i=0;i<num_channels;i++){
+       /*      switch (audio_format)
+               {
+                       case 0:
+                               value=( ( (uint8_t*)data) [i]   );
+                               break;
+                       case 1:
+                               value=( ( (uint16_t*)data) [i]  >> 8 );
+                               break;
+                       case 2:
+                               value=( ((uint32_t*)data) [i] >> 16 );
+                               break;
+                       case 3:
+                               value=( ((float*)data) [i]*255);
+                               break;
+                       default:
+                               value=0;
+               }
+               */
+               long val=0;
+               int num_samples=20;
+               for (int s=0;s<samples;s+=samples/num_samples){
+                       val+=(data[i+s*num_channels]- 127);
+               }
+               channels.append(val/num_samples);
+       }
+
+
+       if (samples>0)
+               emit showAudioSignal(channels);
+}
 
 /*
  * MLT playlist direct manipulation.
index 6c9c0b8b5d0190b80ed0b03f2d282e5fb99f5ddf..60b9ed9ee71e0982accb0a4bbbf5268be787c65e 100644 (file)
@@ -262,6 +262,7 @@ Q_OBJECT public:
 #ifdef Q_WS_MAC
     void showFrame(Mlt::Frame&);
 #endif
+       void showAudio(Mlt::Frame&);
     /** @brief This property is used to decide if the renderer should convert it's frames to QImage for use in other Kdenlive widgets. */
     bool sendFrameForAnalysis;
     QList <int> checkTrackSequence(int);
@@ -357,6 +358,7 @@ signals:
      *
      * Used in Mac OS X. */
     void showImageSignal(QImage);
+    void showAudioSignal(QByteArray);
     /** @brief The renderer refreshed the current frame, but no seeking was done. */
     void frameUpdated(QImage);