Silence input-meters when port-buffer is n/a.
This commit is contained in:
parent
f361211891
commit
83618c4667
@ -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);
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user