summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-08-07 23:23:39 +0200
committerRobin Gareus <robin@gareus.org>2017-08-07 23:23:39 +0200
commit26dc287c008607c43008a38448744bf7ae783687 (patch)
tree7c6d6a60cdd32cf3f38ce78bba4921283ce67d88 /libs
parent7235d9751bd705a233a666f0e9abc31adc9f4a27 (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.
Diffstat (limited to 'libs')
-rw-r--r--libs/backends/portaudio/portaudio_backend.cc15
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;