forego memory sample buffer and only write samples that need writing

Rather than writing the entire sequence audio to disk every change, now we
just write the parts we need to write.
This commit is contained in:
itsmattkc
2019-11-20 10:32:46 +09:00
parent 6693fc75a3
commit 2599c1e8a4
4 changed files with 35 additions and 25 deletions
+32 -17
View File
@@ -19,6 +19,19 @@ QIODevice *AudioBackend::GetAudioPullDevice()
return &pull_device_;
}
void AudioBackend::InvalidateCache(const rational &start_range, const rational &end_range)
{
/*
// Truncate to length if necessary
int max_length_in_bytes = params().time_to_bytes(viewer_node()->Length());
if (pcm_data_.size() > max_length_in_bytes) {
pcm_data_.resize(max_length_in_bytes);
}
*/
AudioRenderBackend::InvalidateCache(start_range, end_range);
}
bool AudioBackend::InitInternal()
{
// Initiate one thread per CPU core
@@ -34,7 +47,6 @@ bool AudioBackend::InitInternal()
void AudioBackend::CloseInternal()
{
// This backend doesn't init anything yet
}
bool AudioBackend::CompileInternal()
@@ -63,23 +75,26 @@ void AudioBackend::ThreadCompletedCache(NodeDependency dep)
int length = params().time_to_bytes(dep.range().length());
int out_point = offset + length;
if (pcm_data_.size() < out_point) {
pcm_data_.resize(out_point);
}
// Replace data with this data
int copy_length = qMin(length, cached_samples.size());
memcpy(pcm_data_.data() + offset, cached_samples.data(), static_cast<size_t>(copy_length));
if (copy_length < length) {
// Fill in remainder with silence
memset(pcm_data_.data() + offset + copy_length, 0, static_cast<size_t>(length - copy_length));
}
QFile f(CachePathName());
if (f.open(QFile::WriteOnly)) {
f.write(pcm_data_);
if (f.open(QFile::WriteOnly | QFile::Append)) {
if (f.size() < out_point) {
f.resize(out_point);
}
f.seek(offset);
// Replace data with this data
int copy_length = qMin(length, cached_samples.size());
f.write(cached_samples.data(), copy_length);
if (copy_length < length) {
// Fill in remainder with silence
QByteArray empty_space(length - copy_length, 0);
f.write(empty_space);
}
f.close();
}
+3
View File
@@ -15,6 +15,9 @@ public:
virtual QIODevice* GetAudioPullDevice() override;
public slots:
virtual void InvalidateCache(const rational &start_range, const rational &end_range) override;
protected:
virtual bool InitInternal() override;
@@ -28,12 +28,6 @@ void AudioRenderBackend::InvalidateCache(const rational &start_range, const rati
rational start_range_adj = qMax(rational(0), start_range);
rational end_range_adj = qMin(viewer_node()->Length(), end_range);
// Truncate to length if necessary
int max_length_in_bytes = params().time_to_bytes(viewer_node()->Length());
if (pcm_data_.size() > max_length_in_bytes) {
pcm_data_.resize(max_length_in_bytes);
}
// Add the range to the list
cache_queue_.append(TimeRange(start_range_adj, end_range_adj));
-2
View File
@@ -39,8 +39,6 @@ protected:
QString CachePathName();
QByteArray pcm_data_;
private:
void ValidateRanges();