From 34138ffebb9cacdce1d28545c082cd6e1dbc829c Mon Sep 17 00:00:00 2001 From: Elliu <elliu@hashi.re> Date: Sun, 3 Sep 2023 18:29:51 +0200 Subject: [PATCH] First quick take at improving spectrum visibility Will need to connect properties and factors to sliders to test what is best easily --- src/UI/DocumentViews/AudioVisualizer.cc | 39 +++++++++++++++++++------ src/UI/DocumentViews/AudioVisualizer.hh | 4 --- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/UI/DocumentViews/AudioVisualizer.cc b/src/UI/DocumentViews/AudioVisualizer.cc index cad48f10..49a5d450 100644 --- a/src/UI/DocumentViews/AudioVisualizer.cc +++ b/src/UI/DocumentViews/AudioVisualizer.cc @@ -2,7 +2,7 @@ using namespace Vivy; -#define MAXPIXVALUE 7 // Some magix AV magic stuff +#define PIXMULTIPLIER 4 // Some magic AV magic stuff AudioVisualizer::AudioVisualizer(AudioContext::StreamPtr stream, VivyDocumentView &rootView, QWidget *parent) @@ -19,10 +19,11 @@ AudioVisualizer::AudioVisualizer(AudioContext::StreamPtr stream, VivyDocumentVie if (decodedData == nullptr) throw std::logic_error("the passed stream is not decoded"); - const size_t size = audioStream->getDecodedDataSize(); - const size_t height = audioStream->getDecodedChunkSize(); - const size_t decalage = audioStream->getDecodedDecalage(); - const size_t width = (size - height) / decalage; + const size_t size = audioStream->getDecodedDataSize(); + const size_t height = audioStream->getDecodedChunkSize(); + const size_t halfHeight = size_t(height/2); + const size_t decalage = audioStream->getDecodedDecalage(); + const size_t width = (size - height) / decalage; uchar *pixels = new uchar[static_cast<size_t>(width * height / 2 + (size - height) / decalage)](); @@ -56,13 +57,31 @@ AudioVisualizer::AudioVisualizer(AudioContext::StreamPtr stream, VivyDocumentVie const float re = chunkData[j * 2 + 1]; const float mag = sqrtf(im * im + re * re); const size_t index = static_cast<size_t>(j * static_cast<ulong>(width) + x); - pixels[index] = static_cast<unsigned char>((mag)*MAXPIXVALUE); + pixels[index] = static_cast<unsigned char>(mag); } } - QImage img = QImage(pixels, static_cast<int>(width), static_cast<int>(height / 2), - static_cast<int>(width), QImage::Format_Grayscale8, pixelsDeleter, pixels) - .mirrored(false, true); + QImage img = QImage(int(width), int(halfHeight), QImage::Format_RGB888); + parallel_for (int y = 0; y < int(halfHeight); y++){ + int tempLine = y * int(width); + parallel_for (int x = 0; x < int(width); x++){ + uint pixValue = pixels[tempLine + x]; + // TODO: See if we could make this a function provided by the user if wanted, to adapt to different spectrums + uint pixValueAdjusted = uint(PIXMULTIPLIER * double(std::pow(pixValue/255.0, 0.3)) * 255); + + uchar r,g,b; + b = uchar(std::min<uint>(255, pixValueAdjusted)); + if (Q_UNLIKELY(b == 255)){ + g = std::max<uchar>(0, uchar(std::min<uint>(255, pixValueAdjusted - 255))); + r = std::max<uchar>(0, uchar(std::min<uint>(255, pixValueAdjusted - 510))); + } else { + g = r = 0; + } + img.setPixel(x, y, qRgb(r, g, b)); + } + } + img = img.mirrored(false, true); + printSpectrum(img, audioStream); } @@ -88,3 +107,5 @@ AudioVisualizer::printSpectrum(QImage pixmap, AudioContext::StreamPtr stream) no connect(&rootVivyDocumentView, &VivyDocumentView::assSubDocumentChanged, timingScene, &TimingScene::rebuildScene); } + +#undef PIXMULTIPLIER diff --git a/src/UI/DocumentViews/AudioVisualizer.hh b/src/UI/DocumentViews/AudioVisualizer.hh index e9b74ef5..a2e50a20 100644 --- a/src/UI/DocumentViews/AudioVisualizer.hh +++ b/src/UI/DocumentViews/AudioVisualizer.hh @@ -29,10 +29,6 @@ private: if (ptr) av_rdft_end(ptr); }; - static constexpr inline auto pixelsDeleter = [](void *ptr) noexcept -> void { - if (ptr) - delete[](reinterpret_cast<uchar *>(ptr)); - }; using FFTSamplePtr = std::unique_ptr<FFTSample[], decltype(fftSampleDeleter)>; using RDFTContextPtr = std::unique_ptr<RDFTContext, decltype(rdftContextDeleter)>; -- GitLab