changeset 384:e5220ff48bc8

Slowly working on the editor.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 18 Oct 2012 20:10:13 +0300
parents 96ba58afdc6d
children eb5b793c8867
files edmain.cpp edmain.h edwaveform.cpp edwaveform.h
diffstat 4 files changed, 248 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/edmain.cpp	Thu Oct 18 20:08:59 2012 +0300
+++ b/edmain.cpp	Thu Oct 18 20:10:13 2012 +0300
@@ -213,17 +213,17 @@
 
 //    view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
 
-    updateMenuStates();
+    initEffectsAndResources();
     statusMsg("Application started.");
 }
 
 
 DemoEditor::~DemoEditor()
 {
-    dmPrint(1, "Shutting down.\n");
+    statusMsg("Shutting down.");
 
     settingsSave();
-//    delete view;
+    delete demoView;
     delete tl;
     historyReset();
 
@@ -246,26 +246,34 @@
 }
 
 
+void DemoEditor::updateTimelineView()
+{
+    timelineWaveform->setOffset(20000);
+    timelineWaveform->setScale(10);
+    timelineWaveform->setTime(200010);
+}
+
+
 int DemoEditor::initEffectsAndResources()
 {
     int err;
 
     // Initialize resource subsystem
-    dmPrint(1, "Initializing resources subsystem.\n");
+    statusMsg("Initializing resources subsystem.");
     if ((err = reopenResources()) != DMERR_OK)
         return err;
 
     // Load resources
-    dmPrint(1, "Loading resources, please wait...\n");
+    statusMsg("Loading resources, please wait...");
     if ((err = loadResources()) != DMERR_OK)
     {
         dmError("Error loading resources, %d: %s.\n", err, dmErrorStr(err));
         return err;
     }
 
-    dmPrint(1, "Initializing effects, etc.\n");
 
     // Final initializations
+    statusMsg("Initializing custom demo data.");
     if ((err = engine.demoInit(&engine)) != DMERR_OK)
     {
         dmError("Failure in demoInit(), %d: %s\n",
@@ -274,6 +282,7 @@
     }
 
     // Initialize effects
+    statusMsg("Initializing effects ...");
     if ((err = engineInitializeEffects(&engine)) != DMERR_OK)
     {
         dmError("Effects initialization failed, %d: %s\n",
@@ -281,6 +290,15 @@
         return err;
     }
 
+    // Etc.
+    timelineWaveform->setWaveform(
+        engine.audioRes->rdata, engine.audioRes->rdataSize,
+        engine.optAfmt.format, engine.optAfmt.channels,
+        engine.optAfmt.freq);
+
+    updateTimelineView();
+    updateMenuStates();
+    update();
     return DMERR_OK;
 }
 
--- a/edmain.h	Thu Oct 18 20:08:59 2012 +0300
+++ b/edmain.h	Thu Oct 18 20:10:13 2012 +0300
@@ -20,6 +20,8 @@
 #define CTRL_ICON_SIZE   32
 
 #include "edtlobj.h"
+#include "edview.h"
+#include "edwaveform.h"
 #include <QDebug>
 #include <QFile>
 #include <QApplication>
@@ -30,7 +32,7 @@
 #include <QSlider>
 #include <QMessageBox>
 #include <QCheckBox>
-
+#include <QScrollBar>
 
 class DemoEditor : public QMainWindow
 {
@@ -67,6 +69,11 @@
     QAction *menuActUndo, *menuActRedo, *menuActOpen, *menuActSave, *menuActSaveAs;
 //    QAction *menuActCut, *menuActCopy, *menuActPaste, *menuActDelete;
     QActionGroup *actGroupControls;
+    QScrollBar *timelineScrollBar;
+    WaveformView *timelineWaveform;
+    DemoView *demoView;
+    
+    
 
     QAction * createToolButton(QActionGroup *group, QString name, QIcon icon, QString statustip, QVariant data);
     QAction * createMenuAction(QString name, const QKeySequence &shortcut, QString tooltip);
@@ -80,6 +87,7 @@
     void closeEvent(QCloseEvent *event);
     void createMainGUI();
     void updateMenuStates();
+    void updateTimelineView();
 
     int initEffectsAndResources();
     void shutdownEffectsAndResources();
--- a/edwaveform.cpp	Thu Oct 18 20:08:59 2012 +0300
+++ b/edwaveform.cpp	Thu Oct 18 20:10:13 2012 +0300
@@ -1,38 +1,48 @@
 #include <QtGui>
+#include <SDL_audio.h>
 #include "edwaveform.h"
 
 
-WaveformView::WaveformView(QWidget *parent) : QWidget(parent)
+WaveDisplay::WaveDisplay(QWidget *parent) : QWidget(parent)
 {
-    data = NULL;
-    len = time = offs = 0;
-    scale = 1.0f;
+    data      = NULL;
+    len       = 0;
+    format    = AUDIO_S16SYS;
+    channels  = 1;
+    freq      = 1;
+    scale     = 1.0f;
+    time      = offs = 0;
+
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
 }
 
 
-void WaveformView::setWaveform(qint16 *mdata, int mlen)
+void WaveDisplay::setWaveform(void *mdata, int mlen, int mformat, int mchannels, int mfreq)
 {
-    data = mdata;
-    len = mlen;
+    data     = mdata;
+    len      = mlen;
+    format   = mformat;
+    channels = mchannels;
+    freq     = mfreq;
     update();
 }
 
 
-void WaveformView::setTime(const int mtime)
+void WaveDisplay::setTime(const int mtime)
 {
     time = mtime;
     update();
 }
 
 
-void WaveformView::setOffset(const int moffs)
+void WaveDisplay::setOffset(const int moffs)
 {
     offs = moffs;
     update();
 }
 
 
-void WaveformView::setScale(const float mscale)
+void WaveDisplay::setScale(const float mscale)
 {
     if (mscale > 0.05)
         scale = mscale;
@@ -40,40 +50,100 @@
 }
 
 
-void WaveformView::paintEvent(QPaintEvent *)
+int WaveDisplay::getTime()
+{
+    return time;
+}
+
+
+int WaveDisplay::getOffset()
+{
+    return offs;
+}
+
+
+void WaveDisplay::paintEvent(QPaintEvent *)
 {
     QColor waveColor(0, 150, 0);
-    QColor markerColor(255,255,255);
+    QColor waveCenterLine(0, 0, 0);
+    QColor markerColor(0,0,0);
+    QColor bgColor(0, 0, 0);//255, 255, 255);
 
     QPainter painter(this);
     painter.setRenderHint(QPainter::Antialiasing);
+    painter.fillRect(QRect(0, 0, width(), height()), bgColor);
 
-    painter.save();
-    painter.translate(0, height() / 2);
-    painter.scale(scale, height() / 32768.0f);
-    painter.setPen(waveColor);
-
-    int prevY = 0, prevX = 0;
-    for (int xc = 0; xc < width(); xc++)
+    if (data != NULL)
     {
-        qint16 value = data[(int) ((offs + xc) * scale)];
-        painter.drawLine(prevX, prevY, xc, value);
-        prevY = value; prevX = xc;
+        int voffs = 0;
+
+        painter.save();
+        painter.translate(0, height() / 2);
+
+        painter.setPen(waveCenterLine);
+        painter.drawLine(0, 0, width(), 0);
+
+        switch (format)
+        {
+            case AUDIO_S16SYS:
+                painter.scale(1.0f, (float) height() / 32768.0f);
+                break;
+            case AUDIO_U16SYS:
+                voffs = -32768;
+                painter.scale(1.0f, height() / 32768.0f);
+                break;
+
+            case AUDIO_S8:
+                painter.scale(1.0f, height() / 128.0f);
+                break;
+            case AUDIO_U8:
+                voffs = -128;
+                painter.scale(1.0f, height() / 128.0f);
+                break;
+        }
+
+        painter.scale(1.0f, 0.7f);
+        painter.setPen(waveColor);
+
+        int prevY = 0, prevX = 0;
+        if (format == AUDIO_S16SYS || format == AUDIO_U16SYS)
+        {
+            qint16 *buf = (qint16 *) data;
+            for (int xc = 0; xc < width(); xc++)
+            {
+                int value = buf[(int) (((offs + xc) * scale)) * channels] + voffs;
+                painter.drawLine(prevX, prevY, xc, value);
+                prevY = value;
+                prevX = xc;
+            }
+        }
+        else
+        if (format == AUDIO_S8 || format == AUDIO_U8)
+        {
+            qint8 *buf = (qint8 *) data;
+            for (int xc = 0; xc < width(); xc++)
+            {
+                int value = buf[((int) ((offs + xc) * scale)) * channels] + voffs;
+                painter.drawLine(prevX, prevY, xc, value);
+                prevY = value;
+                prevX = xc;
+            }
+        }
+        
+        painter.restore();
     }
-    painter.restore();
     
-    
-    if (time >= offs * scale && time - offs <= width() * scale)
+    if (time >= offs * scale) // && time - offs <= width() * scale)
     {
         int xc = time - offs;
-        painter.scale(scale, 1);
+        painter.scale(1.0f / scale, 1.0f);
         painter.setPen(markerColor);
         painter.drawLine(xc, 0, xc, height());
     }
 }
 
 
-void WaveformView::mousePressEvent(QMouseEvent *ev)
+void WaveDisplay::mousePressEvent(QMouseEvent *ev)
 {
 /*
     if (ev->button() == Qt::LeftButton)
@@ -85,7 +155,7 @@
 }
 
 
-void WaveformView::mouseMoveEvent(QMouseEvent *ev)
+void WaveDisplay::mouseMoveEvent(QMouseEvent *ev)
 {
 /*
     if ((ev->buttons() & Qt::LeftButton) && scribbling)
@@ -94,7 +164,7 @@
 }
 
 
-void WaveformView::mouseReleaseEvent(QMouseEvent *ev)
+void WaveDisplay::mouseReleaseEvent(QMouseEvent *ev)
 {
 /*
     if (ev->button() == Qt::LeftButton && scribbling)
@@ -104,3 +174,81 @@
     }
 */
 }
+
+
+WaveformView::WaveformView(QWidget *parent) : QWidget(parent)
+{
+    QHBoxLayout *mainLayout = new QHBoxLayout(this);
+    mainLayout->setMargin(0);
+    wave = new WaveDisplay(this);
+
+    QFrame *infoLayoutContainer = new QFrame(this);
+    infoLayoutContainer->setFrameStyle(QFrame::StyledPanel | QFrame::Plain);
+    infoLayoutContainer->setLineWidth(2);
+//    infoLayoutContainer->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Ignored);
+//    infoLayoutContainer->resize(250, 60);
+
+    QVBoxLayout *infoLayout = new QVBoxLayout(infoLayoutContainer);
+    infoLayout->setMargin(0);
+//    QVBoxLayout *infoLayout = new QVBoxLayout();
+    infoName = new QLabel("Audio");
+    infoName->setStyleSheet("QLabel { background-color: black; color: white; padding: 2px; }");
+    infoLayout->addWidget(infoName);
+
+    infoData = new QLabel();
+    infoData->setStyleSheet("QLabel { padding: 2px; }");
+    infoLayout->addWidget(infoData);
+
+    mainLayout->addWidget(infoLayoutContainer);
+//    mainLayout->addLayout(infoLayout);
+    mainLayout->addWidget(wave);
+}
+
+
+void WaveformView::setWaveform(void *mdata, int mlen, int mformat, int mchannels, int mfreq)
+{
+    QString fmt;
+    switch (mformat)
+    {
+        case AUDIO_S16SYS: fmt = "16bit (S)"; break;
+        case AUDIO_U16SYS: fmt = "16bit (U)"; break;
+        case AUDIO_S8:     fmt = "8bit (S)"; break;
+        case AUDIO_U8:     fmt = "8bit (U)"; break;
+        default:           fmt = "?"; break;
+    }
+    infoData->setText(QString("<b>%1</b>, <b>%2</b> ch, <b>%3</b> Hz").arg(fmt).arg(mchannels).arg(mfreq));
+    wave->setWaveform(mdata, mlen, mformat, mchannels, mfreq);
+    update();
+}
+
+
+void WaveformView::setName(QString name)
+{
+    infoName->setText(name);
+    update();
+}
+
+void WaveformView::setTime(const int mtime)
+{
+    wave->setTime(mtime);
+}
+
+void WaveformView::setOffset(const int moffs)
+{
+    wave->setOffset(moffs);
+}
+
+void WaveformView::setScale(const float mscale)
+{
+    wave->setScale(mscale);
+}
+
+int WaveformView::getTime()
+{
+    return wave->getTime();
+}
+
+int WaveformView::getOffset()
+{
+    return wave->getOffset();
+}
--- a/edwaveform.h	Thu Oct 18 20:08:59 2012 +0300
+++ b/edwaveform.h	Thu Oct 18 20:10:13 2012 +0300
@@ -2,19 +2,32 @@
 #define EDWAVEFORM_H
 
 #include <QWidget>
+#include <QLabel>
 #include "dmengine.h"
 
-class WaveformView : public QWidget
+class WaveDisplay : public QWidget
 {
     Q_OBJECT
 
 public:
-    WaveformView(QWidget *parent = 0);
-    void setWaveform(qint16 *mdata, int mlen);
+    WaveDisplay(QWidget *parent = 0);
 
+    void setWaveform(void *mdata, int mlen, int mformat, int mchannels, int mfreq);
     void setTime(const int mtime);
     void setOffset(const int moffs);
     void setScale(const float mscale);
+    int getTime();
+    int getOffset();
+
+    QSize minimumSizeHint() const
+    {
+        return QSize(100, 60);
+    }
+
+    QSize sizeHint() const
+    {
+        return QSize(600, 60);
+    }
 
 protected:
     void mousePressEvent(QMouseEvent *event);
@@ -25,8 +38,28 @@
 
 private:
     float scale;
-    int time, offs, len;
-    qint16 *data;
+    int time, offs, len, channels, format, freq;
+    void *data;
+};
+
+
+class WaveformView : public QWidget
+{
+    Q_OBJECT
+
+private:
+    WaveDisplay *wave;
+    QLabel *infoName, *infoData;
+
+public:
+    WaveformView(QWidget *parent = 0);
+    void setWaveform(void *mdata, int mlen, int mformat, int mchannels, int mfreq);
+    void setName(QString name);
+    void setTime(const int mtime);
+    void setOffset(const int moffs);
+    void setScale(const float mscale);
+    int getTime();
+    int getOffset();
 };
 
 #endif