Mercurial > hg > dmlib
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