Skip to content
Extraits de code Groupes Projets
Vérifiée Valider 67b84755 rédigé par Kubat's avatar Kubat
Parcourir les fichiers

BACKEND: The AudioVisualizer is responsible for its construction from a file

parent a0c2dce3
Branches
Aucune étiquette associée trouvée
1 requête de fusion!3Add documents
#include "AudioVisualizer.h" #include "AudioVisualizer.h"
#include "AudioUtils.h"
#include <QLabel> #include <QLabel>
#include <QScrollArea> #include <QScrollArea>
...@@ -21,3 +22,40 @@ AudioVisualizer::printSpectrum(QImage pixmap) noexcept ...@@ -21,3 +22,40 @@ AudioVisualizer::printSpectrum(QImage pixmap) noexcept
layout->addWidget(timer); layout->addWidget(timer);
setLayout(layout); 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;
}
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "TimingView.hpp" #include "TimingView.hpp"
#include <QWidget> #include <QWidget>
#include <QString>
class AudioVisualizer final : public QWidget { class AudioVisualizer final : public QWidget {
Q_OBJECT Q_OBJECT
...@@ -15,6 +16,8 @@ public: ...@@ -15,6 +16,8 @@ public:
AudioVisualizer(QWidget *parent = nullptr) noexcept; AudioVisualizer(QWidget *parent = nullptr) noexcept;
~AudioVisualizer() noexcept = default; ~AudioVisualizer() noexcept = default;
static AudioVisualizer *fromFile(const QString &);
public slots: public slots:
void printSpectrum(QImage) noexcept; void printSpectrum(QImage) noexcept;
}; };
......
#define VIVY_MAINWINDOW_CC #define VIVY_MAINWINDOW_CC
#include "MainWindow.h" #include "MainWindow.h"
#include "AudioUtils.h"
#include "DialogHelp.h" #include "DialogHelp.h"
#include "VivyDocumentView.h" #include "VivyDocumentView.h"
...@@ -46,38 +45,10 @@ void ...@@ -46,38 +45,10 @@ void
MainWindow::openAudioFile() noexcept MainWindow::openAudioFile() noexcept
{ {
QString filename = QFileDialog::getOpenFileName(this, "Select a file"); QString filename = QFileDialog::getOpenFileName(this, "Select a file");
if (filename.isEmpty()) AudioVisualizer *audioVisualizer = AudioVisualizer::fromFile(filename);
if (audioVisualizer == nullptr)
return; 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; QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(audioVisualizer); layout->addWidget(audioVisualizer);
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter