From 6ea52e4123172144e204f78bd77a9f9e4ee8ef09 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 5 Apr 2020 19:59:14 +1000 Subject: [PATCH] audio renderer/timeline: pass through channel count of waveform visualizations --- app/audio/sumsamples.cpp | 5 ++++ app/audio/sumsamples.h | 6 ++++ app/render/backend/audiorenderworker.cpp | 16 ++++++++-- .../view/timelineviewblockitem.cpp | 29 +++++++++++++------ 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/app/audio/sumsamples.cpp b/app/audio/sumsamples.cpp index 1ed6cb498..92c60efc0 100644 --- a/app/audio/sumsamples.cpp +++ b/app/audio/sumsamples.cpp @@ -79,3 +79,8 @@ void SampleSummer::ClampMinMax(SampleSummer::Sum &sum, T value) sum.max = value; } } + +SampleSummer::Info::Info() +{ + channels = 0; +} diff --git a/app/audio/sumsamples.h b/app/audio/sumsamples.h index 38bb29546..0985909c4 100644 --- a/app/audio/sumsamples.h +++ b/app/audio/sumsamples.h @@ -24,6 +24,12 @@ public: static QVector ReSumSamples(const SampleSummer::Sum* samples, int nb_samples, int nb_channels); + struct Info { + Info(); + + int channels; + }; + private: template static QVector SumSamplesInternal(const T* samples, int nb_samples, int nb_channels); diff --git a/app/render/backend/audiorenderworker.cpp b/app/render/backend/audiorenderworker.cpp index e183d0640..024872afc 100644 --- a/app/render/backend/audiorenderworker.cpp +++ b/app/render/backend/audiorenderworker.cpp @@ -80,9 +80,10 @@ NodeValueTable AudioRenderWorker::RenderBlock(const TrackOutput *track, const Ti // Save waveform to file Block* src_block = static_cast(copy_map_->value(b)); QDir local_appdata_dir(Config::Current()["DiskCachePath"].toString()); - QDir waveform_loc = local_appdata_dir.filePath("waveform"); + QDir waveform_loc = local_appdata_dir.filePath(QStringLiteral("waveform")); waveform_loc.mkpath("."); - QFile wave_file(waveform_loc.filePath(QString::number(reinterpret_cast(src_block)))); + QString wave_fn(waveform_loc.filePath(QString::number(reinterpret_cast(src_block)))); + QFile wave_file(wave_fn); if (wave_file.open(QFile::ReadWrite)) { // We use S32 as a size-compatible substitute for SampleSummer::Sum which is 4 bytes in size @@ -110,6 +111,17 @@ NodeValueTable AudioRenderWorker::RenderBlock(const TrackOutput *track, const Ti wave_file.close(); + // Write metadata about this waveform file + QFile wave_metadata(wave_fn.append(QStringLiteral(".meta"))); + if (wave_metadata.open(QFile::WriteOnly)) { + SampleSummer::Info info; + info.channels = audio_params_.channel_count(); + + wave_metadata.write(reinterpret_cast(&info), sizeof(SampleSummer::Info)); + + wave_metadata.close(); + } + if (src_block->type() == Block::kClip) { emit static_cast(src_block)->PreviewUpdated(); } diff --git a/app/widget/timelinewidget/view/timelineviewblockitem.cpp b/app/widget/timelinewidget/view/timelineviewblockitem.cpp index 3d7e56ecc..823a388d6 100644 --- a/app/widget/timelinewidget/view/timelineviewblockitem.cpp +++ b/app/widget/timelinewidget/view/timelineviewblockitem.cpp @@ -87,21 +87,32 @@ void TimelineViewBlockItem::paint(QPainter *painter, const QStyleOptionGraphicsI } // Draw waveform if one is available - QFile wave_file(QDir(QDir(Config::Current()["DiskCachePath"].toString()).filePath("waveform")).filePath(QString::number(reinterpret_cast(block_)))); + QString wave_fn = QDir(QDir(Config::Current()["DiskCachePath"].toString()).filePath("waveform")).filePath(QString::number(reinterpret_cast(block_))); + QFile wave_file(wave_fn); if (wave_file.open(QFile::ReadOnly)){ painter->setPen(QColor(64, 64, 64)); QByteArray w = wave_file.readAll(); - // FIXME: Hardcoded channel count - AudioWaveformView::DrawWaveform(painter, - rect().toRect(), - this->GetScale(), - reinterpret_cast(w.constData()), - w.size() / sizeof(SampleSummer::Sum), - 2); - wave_file.close(); + + // Read metadata + SampleSummer::Info info; + QFile wave_meta(wave_fn.append(QStringLiteral(".meta"))); + if (wave_meta.open(QFile::ReadOnly)) { + wave_meta.read(reinterpret_cast(&info), sizeof(SampleSummer::Info)); + wave_meta.close(); + } + + // Prevent divide by zero + if (info.channels) { + AudioWaveformView::DrawWaveform(painter, + rect().toRect(), + this->GetScale(), + reinterpret_cast(w.constData()), + w.size() / sizeof(SampleSummer::Sum), + info.channels); + } } painter->setPen(Qt::white);