audio renderer/timeline: pass through channel count of waveform visualizations
This commit is contained in:
@@ -79,3 +79,8 @@ void SampleSummer::ClampMinMax(SampleSummer::Sum &sum, T value)
|
||||
sum.max = value;
|
||||
}
|
||||
}
|
||||
|
||||
SampleSummer::Info::Info()
|
||||
{
|
||||
channels = 0;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user