From 67b84755a9d4eb0825656bae3141d00382e0e7b9 Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Mon, 21 Jun 2021 15:51:24 +0200 Subject: [PATCH] BACKEND: The AudioVisualizer is responsible for its construction from a file --- src/AudioVisualizer.cc | 38 ++++++++++++++++++++++++++++++++++++++ src/AudioVisualizer.h | 3 +++ src/MainWindow.cc | 33 ++------------------------------- 3 files changed, 43 insertions(+), 31 deletions(-) diff --git a/src/AudioVisualizer.cc b/src/AudioVisualizer.cc index 8ab58701..00c50feb 100644 --- a/src/AudioVisualizer.cc +++ b/src/AudioVisualizer.cc @@ -1,4 +1,5 @@ #include "AudioVisualizer.h" +#include "AudioUtils.h" #include <QLabel> #include <QScrollArea> @@ -21,3 +22,40 @@ AudioVisualizer::printSpectrum(QImage pixmap) noexcept layout->addWidget(timer); setLayout(layout); } + +AudioVisualizer * +AudioVisualizer::fromFile(const QString &filename) +{ + if (filename.isEmpty()) + return nullptr; + + const int sample_rate = 44100; + double *data = nullptr; + int size = 0; + int rc = decodeAudioFile(filename.toStdString().c_str(), sample_rate, &data, &size); + auto data_deleter = [](double *ptr) -> void { + if (ptr != nullptr) + av_free(ptr); + }; + std::unique_ptr<double, decltype(data_deleter)> data_holder(data, data_deleter); + + if (rc != 0) { + printf("ERROR\n"); + return nullptr; + } + + auto raw_image_deleter = [](RawImageData *ptr) -> void { RawImageDataFree(ptr); }; + RawImageData *raw_image = RawImageDataNewFromData(data, size); + std::unique_ptr<RawImageData, decltype(raw_image_deleter)> raw_image_holder(raw_image, raw_image_deleter); + + auto pixs_deleter = [](void *ptr) -> void { free(ptr); }; + const int width = RawImageDataGetWidth(raw_image); + const int height = RawImageDataGetHeight(raw_image); + uchar *pixs = RawImageDataDuplicatePixels(raw_image); + QImage img(pixs, width, height / 2, width, QImage::Format_Grayscale8, pixs_deleter, pixs); + img = img.mirrored(false, true); + + AudioVisualizer *audioVisualizer = new AudioVisualizer; + audioVisualizer->printSpectrum(img); + return audioVisualizer; +} diff --git a/src/AudioVisualizer.h b/src/AudioVisualizer.h index 8a6f8b84..2e47eb5c 100644 --- a/src/AudioVisualizer.h +++ b/src/AudioVisualizer.h @@ -7,6 +7,7 @@ #include "TimingView.hpp" #include <QWidget> +#include <QString> class AudioVisualizer final : public QWidget { Q_OBJECT @@ -15,6 +16,8 @@ public: AudioVisualizer(QWidget *parent = nullptr) noexcept; ~AudioVisualizer() noexcept = default; + static AudioVisualizer *fromFile(const QString &); + public slots: void printSpectrum(QImage) noexcept; }; diff --git a/src/MainWindow.cc b/src/MainWindow.cc index 7ad9d4b5..be251dae 100644 --- a/src/MainWindow.cc +++ b/src/MainWindow.cc @@ -1,7 +1,6 @@ #define VIVY_MAINWINDOW_CC #include "MainWindow.h" -#include "AudioUtils.h" #include "DialogHelp.h" #include "VivyDocumentView.h" @@ -46,38 +45,10 @@ void MainWindow::openAudioFile() noexcept { QString filename = QFileDialog::getOpenFileName(this, "Select a file"); - if (filename.isEmpty()) + AudioVisualizer *audioVisualizer = AudioVisualizer::fromFile(filename); + if (audioVisualizer == nullptr) return; - const int sample_rate = 44100; - double *data = nullptr; - int size = 0; - int rc = decodeAudioFile(filename.toStdString().c_str(), sample_rate, &data, &size); - auto data_deleter = [](double *ptr) -> void { - if (ptr != nullptr) - av_free(ptr); - }; - std::unique_ptr<double, decltype(data_deleter)> data_holder(data, data_deleter); - - if (rc != 0) { - printf("ERROR\n"); - return; - } - - auto raw_image_deleter = [](RawImageData *ptr) -> void { RawImageDataFree(ptr); }; - RawImageData *raw_image = RawImageDataNewFromData(data, size); - std::unique_ptr<RawImageData, decltype(raw_image_deleter)> raw_image_holder(raw_image, raw_image_deleter); - - auto pixs_deleter = [](void *ptr) -> void { free(ptr); }; - const int width = RawImageDataGetWidth(raw_image); - const int height = RawImageDataGetHeight(raw_image); - uchar *pixs = RawImageDataDuplicatePixels(raw_image); - QImage img(pixs, width, height / 2, width, QImage::Format_Grayscale8, pixs_deleter, pixs); - img = img.mirrored(false, true); - - AudioVisualizer *audioVisualizer = new AudioVisualizer; - audioVisualizer->printSpectrum(img); - QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(audioVisualizer); -- GitLab