diff options
author | Robin Gareus <robin@gareus.org> | 2017-08-07 23:23:39 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-08-07 23:23:39 +0200 |
commit | 26dc287c008607c43008a38448744bf7ae783687 (patch) | |
tree | 7c6d6a60cdd32cf3f38ce78bba4921283ce67d88 | |
parent | 7235d9751bd705a233a666f0e9abc31adc9f4a27 (diff) |
Fix non-buffered PA backend. Wait for backend to become active
This hopefully fixes an issue with port-registration (new session)
being skipped because PortAudioBackend::available() still false
until the first callback.
-rw-r--r-- | libs/backends/portaudio/portaudio_backend.cc | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/libs/backends/portaudio/portaudio_backend.cc b/libs/backends/portaudio/portaudio_backend.cc index b9ef48fd4f..5bb8ecb08d 100644 --- a/libs/backends/portaudio/portaudio_backend.cc +++ b/libs/backends/portaudio/portaudio_backend.cc @@ -581,6 +581,8 @@ PortAudioBackend::_start (bool for_latency_measurement) } /* reset internal state */ + assert (_run == false); + _run = false; _dsp_load = 0; _freewheeling = false; _freewheel = false; @@ -658,7 +660,6 @@ PortAudioBackend::_start (bool for_latency_measurement) if (register_system_midi_ports () != 0) { DEBUG_PORTS("Failed to register system midi ports.\n") - _run = false; return PortRegistrationError; } @@ -666,7 +667,6 @@ PortAudioBackend::_start (bool for_latency_measurement) if (register_system_audio_ports()) { DEBUG_PORTS("Failed to register system audio ports.\n"); - _run = false; return PortRegistrationError; } @@ -675,7 +675,6 @@ PortAudioBackend::_start (bool for_latency_measurement) if (engine.reestablish_ports ()) { DEBUG_PORTS("Could not re-establish ports.\n"); - _run = false; return PortReconnectError; } @@ -699,6 +698,16 @@ PortAudioBackend::_start (bool for_latency_measurement) stop(); return ProcessThreadStartError; } + + /* wait for backend to become active */ + int timeout = 5000; + while (!_active && --timeout > 0) { Glib::usleep (1000); } + + if (timeout == 0 || !_active) { + PBD::error << _("PortAudio:: failed to start device.") << endmsg; + stop (); + return ProcessThreadStartError; + } } return NoError; |