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:
|
public:
|
||||||
CircularSampleBuffer (samplecnt_t size);
|
CircularSampleBuffer (samplecnt_t size);
|
||||||
|
|
||||||
|
void silence (samplecnt_t);
|
||||||
void write (Sample const*, samplecnt_t);
|
void write (Sample const*, samplecnt_t);
|
||||||
bool read (Sample& s_min, Sample& s_max, samplecnt_t n_samples);
|
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);
|
_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
|
bool
|
||||||
CircularSampleBuffer::read (Sample& s_min, Sample& s_max, samplecnt_t spp)
|
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);
|
Sample* buf = (Sample*) _backend->get_buffer (ph, n_samples);
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
|
/* can this happen? */
|
||||||
|
ai->second.meter->level = 0;
|
||||||
|
ai->second.scope->silence (n_samples);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user