Silence input-meters when port-buffer is n/a.

This commit is contained in:
Robin Gareus 2021-03-20 23:09:36 +01:00
parent f361211891
commit 83618c4667
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
3 changed files with 24 additions and 0 deletions

View File

@ -36,6 +36,7 @@ class LIBARDOUR_API CircularSampleBuffer
public:
CircularSampleBuffer (samplecnt_t size);
void silence (samplecnt_t);
void write (Sample const*, samplecnt_t);
bool read (Sample& s_min, Sample& s_max, samplecnt_t n_samples);

View File

@ -37,6 +37,26 @@ CircularSampleBuffer::write (Sample const* buf, samplecnt_t n_samples)
_rb.write (buf, n_samples);
}
void
CircularSampleBuffer::silence (samplecnt_t n_samples)
{
guint ws = _rb.write_space ();
if (ws < n_samples) {
/* overwrite old data (consider a spinlock wrt ::read) */
_rb.increment_read_idx (n_samples - ws);
}
PBD::RingBuffer<Sample>::rw_vector vec;
_rb.get_write_vector (&vec);
if (vec.len[0] >= n_samples) {
memset (vec.buf[0], 0, sizeof (Sample) * n_samples);
} else {
assert (vec.len[0] > 0 && vec.len[0] + vec.len[1] >= n_samples);
memset (vec.buf[0], 0, sizeof (Sample) * vec.len[0]);
memset (vec.buf[1], 0, sizeof (Sample) * (n_samples - vec.len[0]));
}
_rb.increment_write_idx (n_samples);
}
bool
CircularSampleBuffer::read (Sample& s_min, Sample& s_max, samplecnt_t spp)
{

View File

@ -1773,6 +1773,9 @@ PortManager::run_input_meters (pframes_t n_samples, samplecnt_t rate)
Sample* buf = (Sample*) _backend->get_buffer (ph, n_samples);
if (!buf) {
/* can this happen? */
ai->second.meter->level = 0;
ai->second.scope->silence (n_samples);
continue;
}