audio renderer/timeline: pass through channel count of waveform visualizations

This commit is contained in:
itsmattkc
2020-04-05 19:59:14 +10:00
parent 56178648bd
commit 6ea52e4123
4 changed files with 45 additions and 11 deletions
+5
View File
@@ -79,3 +79,8 @@ void SampleSummer::ClampMinMax(SampleSummer::Sum &sum, T value)
sum.max = value;
}
}
SampleSummer::Info::Info()
{
channels = 0;
}
+6
View File
@@ -24,6 +24,12 @@ public:
static QVector<Sum> ReSumSamples(const SampleSummer::Sum* samples, int nb_samples, int nb_channels);
struct Info {
Info();
int channels;
};
private:
template <typename T>
static QVector<Sum> SumSamplesInternal(const T* samples, int nb_samples, int nb_channels);
+14 -2
View File
@@ -80,9 +80,10 @@ NodeValueTable AudioRenderWorker::RenderBlock(const TrackOutput *track, const Ti
// Save waveform to file
Block* src_block = static_cast<Block*>(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<quintptr>(src_block))));
QString wave_fn(waveform_loc.filePath(QString::number(reinterpret_cast<quintptr>(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<char*>(&info), sizeof(SampleSummer::Info));
wave_metadata.close();
}
if (src_block->type() == Block::kClip) {
emit static_cast<ClipBlock*>(src_block)->PreviewUpdated();
}
@@ -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<quintptr>(block_))));
QString wave_fn = QDir(QDir(Config::Current()["DiskCachePath"].toString()).filePath("waveform")).filePath(QString::number(reinterpret_cast<quintptr>(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<const SampleSummer::Sum*>(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<char*>(&info), sizeof(SampleSummer::Info));
wave_meta.close();
}
// Prevent divide by zero
if (info.channels) {
AudioWaveformView::DrawWaveform(painter,
rect().toRect(),
this->GetScale(),
reinterpret_cast<const SampleSummer::Sum*>(w.constData()),
w.size() / sizeof(SampleSummer::Sum),
info.channels);
}
}
painter->setPen(Qt::white);