From 04e0f555ce2f36bfa0e0a174a69f49ca85e5c492 Mon Sep 17 00:00:00 2001 From: Elliu <goyard.louis@gmail.com> Date: Sat, 19 Jun 2021 23:58:25 +0200 Subject: [PATCH] Beginning to look into adding and drag&dropping timing bars --- CMakeLists.txt | 4 ++++ audioVisualizer.cpp | 24 ++++++++++++++++++++++++ audioVisualizer.h | 26 ++++++++++++++++++++++++++ mainwindow.cpp | 15 ++++++++++++++- mainwindow.h | 2 ++ timer.cpp | 39 +++++++++++++++++++++++++++++++++++++++ timer.h | 43 +++++++++++++++++++++++++++++++++++++++++++ timingBar.cpp | 10 ++++++++++ timingBar.h | 23 +++++++++++++++++++++++ 9 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 audioVisualizer.cpp create mode 100644 audioVisualizer.h create mode 100644 timer.cpp create mode 100644 timer.h create mode 100644 timingBar.cpp create mode 100644 timingBar.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f1f09b4..ddb0ecc1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,10 @@ set(PROJECT_SOURCES main.cpp mainwindow.cpp mainwindow.h + audioVisualizer.h + audioVisualizer.cpp + timer.h + timer.cpp ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) diff --git a/audioVisualizer.cpp b/audioVisualizer.cpp new file mode 100644 index 00000000..13651406 --- /dev/null +++ b/audioVisualizer.cpp @@ -0,0 +1,24 @@ +#include "audioVisualizer.h" + +AudioVisualizer::AudioVisualizer(QWidget *parent) + : QWidget(parent) +{ +} + +AudioVisualizer::~AudioVisualizer() +{ +} + +void AudioVisualizer::printSpectrum(QString filename) +{ + QImage image(filename); + QPixmap pixmap = QPixmap::fromImage(image); + //timer->setPixmap(pixmap); + Timer *timer = new Timer(pixmap); + + QVBoxLayout* layout = new QVBoxLayout; + layout->addWidget(timer); + + setLayout(layout); +} + diff --git a/audioVisualizer.h b/audioVisualizer.h new file mode 100644 index 00000000..b38148f9 --- /dev/null +++ b/audioVisualizer.h @@ -0,0 +1,26 @@ +#ifndef AUDIOVISUALIZER_H +#define AUDIOVISUALIZER_H + +#include <QWidget> +#include <QLabel> +#include <QScrollArea> +#include <QVBoxLayout> +#include <QScrollBar> +#include <QMessageBox> +#include <QGraphicsPixmapItem> +#include "timer.h" + +class AudioVisualizer : public QWidget +{ + Q_OBJECT + +public: + AudioVisualizer(QWidget *parent = nullptr); + ~AudioVisualizer(); + + +public slots: + void printSpectrum(QString filename); +}; + +#endif diff --git a/mainwindow.cpp b/mainwindow.cpp index 067fadfe..b5732f22 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -3,6 +3,7 @@ #include <string.h> #include <stdio.h> #include <CImg.h> +#include <QStandardPaths> extern "C" { #include <libavutil/opt.h> @@ -197,8 +198,20 @@ void MainWindow::openAudioFile(){ } cimg_library::CImg<int16_t> img(pixs, width, height / 2); - img.mirror("y").save_png("out.png"); + QString savedFile = (QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + QString("/spectrum.png")); + img.mirror("y").save_png(savedFile.toStdString().c_str()); av_rdft_end(ctx); av_free(data); + + AudioVisualizer* audioVisualizer = new AudioVisualizer; + audioVisualizer->printSpectrum(savedFile); + + QVBoxLayout* layout = new QVBoxLayout; + layout->addWidget(audioVisualizer); + + QWidget* window = new QWidget; + window->setLayout(layout); + + setCentralWidget(window); } diff --git a/mainwindow.h b/mainwindow.h index 5b4b3de8..8898ef1e 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -6,6 +6,8 @@ #include <QStatusBar> #include <QFileDialog> #include <QMessageBox> +#include <QVBoxLayout> +#include "audioVisualizer.h" class MainWindow : public QMainWindow { diff --git a/timer.cpp b/timer.cpp new file mode 100644 index 00000000..b08d92a9 --- /dev/null +++ b/timer.cpp @@ -0,0 +1,39 @@ +#include "timer.h" + +Timer::Timer(QPixmap pixmap, QWidget *parent) + : QGraphicsView(parent), + img(pixmap) +{ + bg = scene->addPixmap(img)/*->setAcceptedMouseButtons(Qt::NoButton)*/; + //scene->setBackgroundBrush(img); + setFixedHeight(pixmap.height()); + setMaximumHeight(img.height() + horizontalScrollBar()->height() - TO_ADD_TO_IMAGE_HEIGHT); + setScene(scene); +} + +Timer::~Timer() +{ +} + + +void Timer::mousePressEvent(QMouseEvent* event){ + QPoint pos = event->pos(); + pos.rx() += horizontalScrollBar()->value(); + QGraphicsItem* got; + if ((got = scene->itemAt(pos, QTransform())) != nullptr && got != bg){ + got->hide(); + return; + } + int x = event->pos().x() + horizontalScrollBar()->value(); + scene->addLine(QLine(x, 0, x, img.height() - TO_ADD_TO_IMAGE_HEIGHT), startColour)->setFlags(QGraphicsItem::ItemIsMovable/* | QGraphicsItem::ItemSendsGeometryChanges*/); +} + +/* +void Timer::paintEvent(QPaintEvent *event){ + fprintf(stderr, "IN PAINT EVENT\n"); + painter.setPen(Qt::NoPen); + QVectorIterator<QLine> it(lines); + while (it.hasNext()) + painter.drawLine(it.next()); +} + */ diff --git a/timer.h b/timer.h new file mode 100644 index 00000000..a8141b14 --- /dev/null +++ b/timer.h @@ -0,0 +1,43 @@ +#ifndef __TIMER_H +#define __TIMER_H + +#include <QWidget> +#include <QLabel> +#include <QScrollArea> +#include <QVBoxLayout> +#include <QScrollBar> +#include <QMessageBox> +#include <QMouseEvent> +#include <QPainter> +#include <QColor> +#include <QGraphicsView> +#include <QVector> +#include <QGraphicsLineItem> + +#define TO_ADD_TO_IMAGE_HEIGHT 2 + +class Timer : public QGraphicsView +{ + Q_OBJECT + +public: + Timer(QPixmap pixmap, QWidget *parent = nullptr); + ~Timer(); + + QPainter painter; + QGraphicsScene* scene = new QGraphicsScene; + QColor startColour = QColor(127, 0, 127); + QColor endColour = QColor(0, 127, 0); + QPixmap img; + QGraphicsPixmapItem* bg; + + QVector<QLine> lines; + +protected: + void mousePressEvent(QMouseEvent* event); + //void paintEvent(QPaintEvent *); + +public slots: +}; + +#endif diff --git a/timingBar.cpp b/timingBar.cpp new file mode 100644 index 00000000..9f74220a --- /dev/null +++ b/timingBar.cpp @@ -0,0 +1,10 @@ +#include "timingBar.h" + +TimingBar::TimingBar(QWidget *parent) + : QLabel(parent) +{ +} + +TimingBar::~TimingBar() +{ +} diff --git a/timingBar.h b/timingBar.h new file mode 100644 index 00000000..b5c9ebf7 --- /dev/null +++ b/timingBar.h @@ -0,0 +1,23 @@ +#ifndef TIMING_BAR_H +#define TIMING_BAR_H + +#include <QWidget> +#include <QLabel> +#include <QScrollArea> +#include <QVBoxLayout> +#include <QScrollBar> +#include <QMessageBox> +#include <QMouseEvent> + +class TimingBar : public QLabel +{ + Q_OBJECT + +public: + TimingBar(QWidget *parent = nullptr); + ~TimingBar(); + +public slots: +}; + +#endif -- GitLab