From 86c3b70c54fdeca4a3a0b681e33ce8dcb146d3a9 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 14 May 2024 12:25:58 -0600 Subject: [PATCH] add some utility functions to Buffers and BufferSets to allow some kinds of debugging easily --- libs/ardour/ardour/audio_buffer.h | 2 ++ libs/ardour/ardour/buffer.h | 3 +++ libs/ardour/ardour/buffer_set.h | 3 +++ libs/ardour/ardour/midi_buffer.h | 1 + libs/ardour/audio_buffer.cc | 11 +++++++++++ libs/ardour/buffer_set.cc | 13 +++++++++++++ 6 files changed, 33 insertions(+) diff --git a/libs/ardour/ardour/audio_buffer.h b/libs/ardour/ardour/audio_buffer.h index 5eba406669..bec4bdd7cc 100644 --- a/libs/ardour/ardour/audio_buffer.h +++ b/libs/ardour/ardour/audio_buffer.h @@ -42,6 +42,8 @@ public: */ void silence (samplecnt_t len, samplecnt_t offset = 0); + bool silent_data() const; + /** Copy samples from src array starting at src_offset into self starting at dst_offset * @param src array to read from * @param len number of samples to copy diff --git a/libs/ardour/ardour/buffer.h b/libs/ardour/ardour/buffer.h index 8f0cf7e815..e262ecf821 100644 --- a/libs/ardour/ardour/buffer.h +++ b/libs/ardour/ardour/buffer.h @@ -69,6 +69,9 @@ public: /** Clear (eg zero, or empty) buffer */ virtual void silence (samplecnt_t len, samplecnt_t offset = 0) = 0; + /* return true if all data is silent (or for MIDI-like, non-existent */ + virtual bool silent_data () const = 0; + /** Clear the entire buffer */ virtual void clear() { silence(_capacity, 0); } diff --git a/libs/ardour/ardour/buffer_set.h b/libs/ardour/ardour/buffer_set.h index f05804f15e..38891f4a47 100644 --- a/libs/ardour/ardour/buffer_set.h +++ b/libs/ardour/ardour/buffer_set.h @@ -82,6 +82,9 @@ public: void ensure_buffers(DataType type, size_t num_buffers, size_t buffer_capacity); void ensure_buffers(const ChanCount& chns, size_t buffer_capacity); + /* Returns true if Buffer::silent_data() is true for all buffers */ + bool silent_data() const; + const ChanCount& available() const { return _available; } ChanCount& available() { return _available; } diff --git a/libs/ardour/ardour/midi_buffer.h b/libs/ardour/ardour/midi_buffer.h index 4ea57e6b67..6538ec37f1 100644 --- a/libs/ardour/ardour/midi_buffer.h +++ b/libs/ardour/ardour/midi_buffer.h @@ -59,6 +59,7 @@ public: void resize(size_t); size_t size() const { return _size; } bool empty() const { return _size == 0; } + bool silent_data () const { return _size == 0; } bool insert_event(const Evoral::Event& event); bool merge_in_place(const MidiBuffer &other); diff --git a/libs/ardour/audio_buffer.cc b/libs/ardour/audio_buffer.cc index 982c8947c1..0d51bbf850 100644 --- a/libs/ardour/audio_buffer.cc +++ b/libs/ardour/audio_buffer.cc @@ -81,6 +81,17 @@ AudioBuffer::check_silence (pframes_t nframes, pframes_t& n) const return true; } +bool +AudioBuffer::silent_data () const +{ + for (pframes_t n = 0; n < _capacity; ++n) { + if (_data[n]) { + return false; + } + } + return true; +} + void AudioBuffer::silence (samplecnt_t len, samplecnt_t offset) { diff --git a/libs/ardour/buffer_set.cc b/libs/ardour/buffer_set.cc index d46c7c5264..bf847b6333 100644 --- a/libs/ardour/buffer_set.cc +++ b/libs/ardour/buffer_set.cc @@ -229,6 +229,19 @@ BufferSet::ensure_buffers(const ChanCount& chns, size_t buffer_capacity) } } +bool +BufferSet::silent_data () const +{ + for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { + for (BufferSet::const_iterator i = begin (*t); i != end (*t); ++i) { + if (!i->silent_data ()) { + return false; + } + } + } + return true; +} + /** Get the capacity (size) of the available buffers of the given type. * * All buffers of a certain type always have the same capacity.