fix latency report, take buffersize changes into account.
This commit is contained in:
parent
ce3adfd3d4
commit
659a8a26ae
@ -232,7 +232,7 @@ AlsaAudioBackend::can_change_sample_rate_when_running () const
|
||||
bool
|
||||
AlsaAudioBackend::can_change_buffer_size_when_running () const
|
||||
{
|
||||
return false;
|
||||
return false; // why not? :)
|
||||
}
|
||||
|
||||
int
|
||||
@ -257,6 +257,9 @@ AlsaAudioBackend::set_buffer_size (uint32_t bs)
|
||||
if (bs <= 0 || bs >= _max_buffer_size) {
|
||||
return -1;
|
||||
}
|
||||
if (_run) {
|
||||
return -1;
|
||||
}
|
||||
_samples_per_period = bs;
|
||||
engine.buffer_size_change (bs);
|
||||
return 0;
|
||||
@ -965,7 +968,7 @@ AlsaAudioBackend::register_system_audio_ports()
|
||||
const int a_out = _n_outputs > 0 ? _n_outputs : 2;
|
||||
|
||||
/* audio ports */
|
||||
lr.min = lr.max = _samples_per_period + (_measure_latency ? 0 : _systemic_audio_input_latency);
|
||||
lr.min = lr.max = (_measure_latency ? 0 : _systemic_audio_input_latency);
|
||||
for (int i = 1; i <= a_ins; ++i) {
|
||||
char tmp[64];
|
||||
snprintf(tmp, sizeof(tmp), "system:capture_%d", i);
|
||||
@ -975,7 +978,7 @@ AlsaAudioBackend::register_system_audio_ports()
|
||||
_system_inputs.push_back(static_cast<AlsaPort*>(p));
|
||||
}
|
||||
|
||||
lr.min = lr.max = _samples_per_period + (_measure_latency ? 0 : _systemic_audio_output_latency);
|
||||
lr.min = lr.max = (_measure_latency ? 0 : _systemic_audio_output_latency);
|
||||
for (int i = 1; i <= a_out; ++i) {
|
||||
char tmp[64];
|
||||
snprintf(tmp, sizeof(tmp), "system:playback_%d", i);
|
||||
@ -1036,7 +1039,7 @@ AlsaAudioBackend::register_system_midi_ports()
|
||||
delete mout;
|
||||
}
|
||||
LatencyRange lr;
|
||||
lr.min = lr.max = _samples_per_period + (_measure_latency ? 0 : nfo->systemic_output_latency);
|
||||
lr.min = lr.max = (_measure_latency ? 0 : nfo->systemic_output_latency);
|
||||
set_latency_range (p, false, lr);
|
||||
static_cast<AlsaMidiPort*>(p)->set_n_periods(2);
|
||||
_system_midi_out.push_back(static_cast<AlsaPort*>(p));
|
||||
@ -1074,7 +1077,7 @@ AlsaAudioBackend::register_system_midi_ports()
|
||||
continue;
|
||||
}
|
||||
LatencyRange lr;
|
||||
lr.min = lr.max = _samples_per_period + (_measure_latency ? 0 : nfo->systemic_input_latency);
|
||||
lr.min = lr.max = (_measure_latency ? 0 : nfo->systemic_input_latency);
|
||||
set_latency_range (p, false, lr);
|
||||
_system_midi_in.push_back(static_cast<AlsaPort*>(p));
|
||||
_rmidi_in.push_back (midin);
|
||||
@ -1317,14 +1320,28 @@ AlsaAudioBackend::set_latency_range (PortEngine::PortHandle port, bool for_playb
|
||||
LatencyRange
|
||||
AlsaAudioBackend::get_latency_range (PortEngine::PortHandle port, bool for_playback)
|
||||
{
|
||||
LatencyRange r;
|
||||
if (!valid_port (port)) {
|
||||
PBD::error << _("AlsaPort::get_latency_range (): invalid port.") << endmsg;
|
||||
LatencyRange r;
|
||||
r.min = 0;
|
||||
r.max = 0;
|
||||
return r;
|
||||
}
|
||||
return static_cast<AlsaPort*>(port)->latency_range (for_playback);
|
||||
AlsaPort *p = static_cast<AlsaPort*>(port);
|
||||
assert(p);
|
||||
|
||||
r = p->latency_range (for_playback);
|
||||
if (p->is_physical() && p->is_terminal()) {
|
||||
if (p->is_input() && for_playback) {
|
||||
r.min += _samples_per_period;
|
||||
r.max += _samples_per_period;
|
||||
}
|
||||
if (p->is_output() && !for_playback) {
|
||||
r.min += _samples_per_period;
|
||||
r.max += _samples_per_period;
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Discovering physical ports */
|
||||
|
@ -89,7 +89,7 @@ class AlsaPort {
|
||||
|
||||
virtual void* get_buffer (pframes_t nframes) = 0;
|
||||
|
||||
const LatencyRange& latency_range (bool for_playback) const
|
||||
const LatencyRange latency_range (bool for_playback) const
|
||||
{
|
||||
return for_playback ? _playback_latency_range : _capture_latency_range;
|
||||
}
|
||||
|
@ -895,7 +895,7 @@ CoreAudioBackend::register_system_audio_ports()
|
||||
#endif
|
||||
|
||||
/* audio ports */
|
||||
lr.min = lr.max = _samples_per_period + coreaudio_reported_input_latency + (_measure_latency ? 0 : _systemic_audio_input_latency);
|
||||
lr.min = lr.max = coreaudio_reported_input_latency + (_measure_latency ? 0 : _systemic_audio_input_latency);
|
||||
for (int i = 0; i < a_ins; ++i) {
|
||||
char tmp[64];
|
||||
snprintf(tmp, sizeof(tmp), "system:capture_%s", _pcmio->cached_port_name(i, true).c_str());
|
||||
@ -905,7 +905,7 @@ CoreAudioBackend::register_system_audio_ports()
|
||||
_system_inputs.push_back(static_cast<CoreBackendPort*>(p));
|
||||
}
|
||||
|
||||
lr.min = lr.max = _samples_per_period + coreaudio_reported_output_latency + (_measure_latency ? 0 : _systemic_audio_output_latency);
|
||||
lr.min = lr.max = coreaudio_reported_output_latency + (_measure_latency ? 0 : _systemic_audio_output_latency);
|
||||
for (int i = 0; i < a_out; ++i) {
|
||||
char tmp[64];
|
||||
snprintf(tmp, sizeof(tmp), "system:playback_%s", _pcmio->cached_port_name(i, false).c_str());
|
||||
@ -1247,14 +1247,27 @@ CoreAudioBackend::set_latency_range (PortEngine::PortHandle port, bool for_playb
|
||||
LatencyRange
|
||||
CoreAudioBackend::get_latency_range (PortEngine::PortHandle port, bool for_playback)
|
||||
{
|
||||
LatencyRange r;
|
||||
if (!valid_port (port)) {
|
||||
PBD::error << _("CoreBackendPort::get_latency_range (): invalid port.") << endmsg;
|
||||
LatencyRange r;
|
||||
r.min = 0;
|
||||
r.max = 0;
|
||||
return r;
|
||||
}
|
||||
return static_cast<CoreBackendPort*>(port)->latency_range (for_playback);
|
||||
CoreBackendPort* p = static_cast<CoreBackendPort*>(port);
|
||||
assert(p);
|
||||
|
||||
r = p->latency_range (for_playback);
|
||||
if (p->is_physical() && p->is_terminal() && p->type() == DataType::AUDIO) {
|
||||
if (p->is_input() && for_playback) {
|
||||
r.min += _samples_per_period;
|
||||
r.max += _samples_per_period;
|
||||
}
|
||||
if (p->is_output() && !for_playback) {
|
||||
r.min += _samples_per_period;
|
||||
r.max += _samples_per_period;
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Discovering physical ports */
|
||||
|
@ -87,7 +87,7 @@ class CoreBackendPort {
|
||||
|
||||
virtual void* get_buffer (pframes_t nframes) = 0;
|
||||
|
||||
const LatencyRange& latency_range (bool for_playback) const
|
||||
const LatencyRange latency_range (bool for_playback) const
|
||||
{
|
||||
return for_playback ? _playback_latency_range : _capture_latency_range;
|
||||
}
|
||||
|
@ -206,10 +206,8 @@ DummyAudioBackend::set_buffer_size (uint32_t bs)
|
||||
* with 'Loopback' there is exactly once cycle latency,
|
||||
* divide it between In + Out;
|
||||
*/
|
||||
const size_t l_in = _samples_per_period * .25;
|
||||
const size_t l_out = _samples_per_period - l_in;
|
||||
LatencyRange lr;
|
||||
lr.min = lr.max = l_in + _systemic_input_latency;
|
||||
lr.min = lr.max = _systemic_input_latency;
|
||||
for (std::vector<DummyAudioPort*>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it) {
|
||||
set_latency_range (*it, false, lr);
|
||||
}
|
||||
@ -217,7 +215,7 @@ DummyAudioBackend::set_buffer_size (uint32_t bs)
|
||||
set_latency_range (*it, false, lr);
|
||||
}
|
||||
|
||||
lr.min = lr.max = l_out + _systemic_output_latency;
|
||||
lr.min = lr.max = _systemic_output_latency;
|
||||
for (std::vector<DummyAudioPort*>::const_iterator it = _system_outputs.begin (); it != _system_outputs.end (); ++it) {
|
||||
set_latency_range (*it, true, lr);
|
||||
}
|
||||
@ -765,12 +763,9 @@ DummyAudioBackend::register_system_ports()
|
||||
const int m_ins = _n_midi_inputs == UINT_MAX ? 0 : _n_midi_inputs;
|
||||
const int m_out = _n_midi_outputs == UINT_MAX ? a_ins : _n_midi_outputs;
|
||||
|
||||
/* with 'Loopback' there is exactly once cycle latency, divide it between In + Out; */
|
||||
const size_t l_in = _samples_per_period * .25;
|
||||
const size_t l_out = _samples_per_period - l_in;
|
||||
|
||||
/* audio ports */
|
||||
lr.min = lr.max = l_in + _systemic_input_latency;
|
||||
lr.min = lr.max = _systemic_input_latency;
|
||||
for (int i = 1; i <= a_ins; ++i) {
|
||||
char tmp[64];
|
||||
snprintf(tmp, sizeof(tmp), "system:capture_%d", i);
|
||||
@ -781,7 +776,7 @@ DummyAudioBackend::register_system_ports()
|
||||
static_cast<DummyAudioPort*>(p)->setup_generator (gt, _samplerate);
|
||||
}
|
||||
|
||||
lr.min = lr.max = l_out + _systemic_output_latency;
|
||||
lr.min = lr.max = _systemic_output_latency;
|
||||
for (int i = 1; i <= a_out; ++i) {
|
||||
char tmp[64];
|
||||
snprintf(tmp, sizeof(tmp), "system:playback_%d", i);
|
||||
@ -792,7 +787,7 @@ DummyAudioBackend::register_system_ports()
|
||||
}
|
||||
|
||||
/* midi ports */
|
||||
lr.min = lr.max = l_in + _systemic_input_latency;
|
||||
lr.min = lr.max = _systemic_input_latency;
|
||||
for (int i = 0; i < m_ins; ++i) {
|
||||
char tmp[64];
|
||||
snprintf(tmp, sizeof(tmp), "system:midi_capture_%d", i+1);
|
||||
@ -805,7 +800,7 @@ DummyAudioBackend::register_system_ports()
|
||||
}
|
||||
}
|
||||
|
||||
lr.min = lr.max = l_out + _systemic_output_latency;
|
||||
lr.min = lr.max = _systemic_output_latency;
|
||||
for (int i = 1; i <= m_out; ++i) {
|
||||
char tmp[64];
|
||||
snprintf(tmp, sizeof(tmp), "system:midi_playback_%d", i);
|
||||
@ -1049,14 +1044,32 @@ DummyAudioBackend::set_latency_range (PortEngine::PortHandle port, bool for_play
|
||||
LatencyRange
|
||||
DummyAudioBackend::get_latency_range (PortEngine::PortHandle port, bool for_playback)
|
||||
{
|
||||
LatencyRange r;
|
||||
if (!valid_port (port)) {
|
||||
PBD::error << _("DummyPort::get_latency_range (): invalid port.") << endmsg;
|
||||
LatencyRange r;
|
||||
r.min = 0;
|
||||
r.max = 0;
|
||||
return r;
|
||||
}
|
||||
return static_cast<DummyPort*>(port)->latency_range (for_playback);
|
||||
DummyPort *p = static_cast<DummyPort*>(port);
|
||||
assert(p);
|
||||
|
||||
r = p->latency_range (for_playback);
|
||||
if (p->is_physical() && p->is_terminal()) {
|
||||
if (p->is_input() && for_playback) {
|
||||
const size_t l_in = _samples_per_period * .25;
|
||||
r.min += _samples_per_period;
|
||||
r.max += _samples_per_period;
|
||||
}
|
||||
if (p->is_output() && !for_playback) {
|
||||
/* with 'Loopback' there is exactly once cycle latency, divide it between In + Out; */
|
||||
const size_t l_in = _samples_per_period * .25;
|
||||
const size_t l_out = _samples_per_period - l_in;
|
||||
r.min += _samples_per_period;
|
||||
r.max += _samples_per_period;
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Discovering physical ports */
|
||||
|
@ -93,7 +93,7 @@ class DummyPort {
|
||||
virtual void* get_buffer (pframes_t nframes) = 0;
|
||||
void next_period () { _gen_cycle = false; }
|
||||
|
||||
const LatencyRange& latency_range (bool for_playback) const
|
||||
const LatencyRange latency_range (bool for_playback) const
|
||||
{
|
||||
return for_playback ? _playback_latency_range : _capture_latency_range;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user