From 4a71e6f28fed69ce8f82e98430180fdbf2da1684 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 27 Nov 2013 13:53:58 -0500 Subject: [PATCH 1/5] add missing parts of previous commit re: libmidi++ and JACK (files not saved in emacs, sigh) --- libs/midi++2/ipmidi_port.cc | 3 --- libs/midi++2/midi++/mmc.h | 1 - libs/midi++2/midi++/port.h | 2 -- 3 files changed, 6 deletions(-) diff --git a/libs/midi++2/ipmidi_port.cc b/libs/midi++2/ipmidi_port.cc index c90a3dbe6f..c4544c237b 100644 --- a/libs/midi++2/ipmidi_port.cc +++ b/libs/midi++2/ipmidi_port.cc @@ -36,9 +36,6 @@ typedef int socklen_t; inline void closesocket(int s) { ::close(s); } #endif -#include -#include - #include "pbd/xml++.h" #include "pbd/error.h" #include "pbd/failed_constructor.h" diff --git a/libs/midi++2/midi++/mmc.h b/libs/midi++2/midi++/mmc.h index 01f8bf3b8a..0f2a69d5d7 100644 --- a/libs/midi++2/midi++/mmc.h +++ b/libs/midi++2/midi++/mmc.h @@ -20,7 +20,6 @@ #ifndef __midipp_mmc_h_h__ #define __midipp_mmc_h_h__ -#include #include "timecode/time.h" #include "pbd/signals.h" diff --git a/libs/midi++2/midi++/port.h b/libs/midi++2/midi++/port.h index 6d778beab2..4e63d41141 100644 --- a/libs/midi++2/midi++/port.h +++ b/libs/midi++2/midi++/port.h @@ -22,8 +22,6 @@ #include #include -#include - #include "pbd/xml++.h" #include "pbd/crossthread.h" #include "pbd/signals.h" From 4d0caa6ddd60e78bea19ed9e23031868d16d44f0 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 27 Nov 2013 14:08:22 -0500 Subject: [PATCH 2/5] add yet more missing parts of previous commit re: libmidi++ and JACK (files not saved in emacs, sigh) --- libs/midi++2/midi++/port.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/midi++2/midi++/port.h b/libs/midi++2/midi++/port.h index 4e63d41141..f16743337c 100644 --- a/libs/midi++2/midi++/port.h +++ b/libs/midi++2/midi++/port.h @@ -22,6 +22,10 @@ #include #include +#include /* XXX ... desirable to get rid of this but needed for + * now due to use of JackPortIsXXXX + */ + #include "pbd/xml++.h" #include "pbd/crossthread.h" #include "pbd/signals.h" From dc4a984cd63d6264ecbd24e414a097420367f684 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 27 Nov 2013 14:27:27 -0500 Subject: [PATCH 3/5] move AudioBackend::_start() into protected, and expand a bit on documenting ::start() vs ::_start() --- libs/ardour/ardour/audio_backend.h | 34 ++++++++++++++++---------- libs/backends/jack/jack_audiobackend.h | 4 ++- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h index 26ced33885..17d7cd4010 100644 --- a/libs/ardour/ardour/audio_backend.h +++ b/libs/ardour/ardour/audio_backend.h @@ -282,17 +282,7 @@ class AudioBackend : public PortEngine { virtual std::string midi_option () const = 0; /* State Control */ - - /* non-virtual method to avoid possible overrides of default - * parameters. See Scott Meyers or other books on C++ to - * understand this pattern, or possibly just this: - * - * http://stackoverflow.com/questions/12139786/good-pratice-default-arguments-for-pure-virtual-method - */ - int start (bool for_latency_measurement=false) { - return _start (for_latency_measurement); - } - + /** Start using the device named in the most recent call * to set_device(), with the parameters set by various * the most recent calls to set_sample_rate() etc. etc. @@ -308,8 +298,24 @@ class AudioBackend : public PortEngine { * any existing systemic latency settings. * * Return zero if successful, negative values otherwise. - */ - virtual int _start (bool for_latency_measurement) = 0; + * + * + * + * + * Why is this non-virtual but ::_start() is virtual ? + * Virtual methods with default parameters create possible ambiguity + * because a derived class may implement the same method with a different + * type or value of default parameter. + * + * So we make this non-virtual method to avoid possible overrides of + * default parameters. See Scott Meyers or other books on C++ to understand + * this pattern, or possibly just this: + * + * http://stackoverflow.com/questions/12139786/good-pratice-default-arguments-for-pure-virtual-method + */ + int start (bool for_latency_measurement=false) { + return _start (for_latency_measurement); + } /** Stop using the device currently in use. * @@ -481,6 +487,8 @@ class AudioBackend : public PortEngine { protected: AudioEngine& engine; + + virtual int _start (bool for_latency_measurement) = 0; }; struct AudioBackendInfo { diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index 2c77e6112b..299bb1cefd 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -89,7 +89,6 @@ class JACKAudioBackend : public AudioBackend { std::string control_app_name () const; void launch_control_app (); - int _start (bool for_latency_measurement); int stop (); int freewheel (bool); @@ -272,6 +271,9 @@ class JACKAudioBackend : public AudioBackend { */ JACKSession* _session; + + protected: + int _start (bool for_latency_measurement); }; } // namespace From 56716a1f28b2341f7fd360b39b6eae66497bc512 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 27 Nov 2013 15:24:24 -0500 Subject: [PATCH 4/5] add error check to call to PortManager::reestablish_ports --- libs/backends/jack/jack_audiobackend.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index 86e5b9d54c..332b6eec85 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -547,8 +547,11 @@ JACKAudioBackend::_start (bool for_latency_measurement) /* Now that we have buffer size and sample rate established, the engine can go ahead and do its stuff */ - - engine.reestablish_ports (); + + if (engine.reestablish_ports ()) { + error << _("Could not re-establish ports after connecting to JACK") << endmsg; + return -1; + } if (!jack_port_type_get_buffer_size) { warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg; From 611d93830a55bd7938561601acdaaecf4e3a9169 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 27 Nov 2013 15:25:10 -0500 Subject: [PATCH 5/5] add 0.5 second sleep after closing JACK connection so that next startup/connect is likely to work (allowing JACK time to shutdown). Ugh --- libs/backends/jack/jack_connection.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libs/backends/jack/jack_connection.cc b/libs/backends/jack/jack_connection.cc index b3d7fcecc4..09e6c9d6e7 100644 --- a/libs/backends/jack/jack_connection.cc +++ b/libs/backends/jack/jack_connection.cc @@ -143,7 +143,12 @@ JackConnection::close () if (_priv_jack) { int ret = jack_client_close (_priv_jack); _jack = 0; + + /* If we started JACK, it will be closing down */ + usleep (500000); + Disconnected (""); /* EMIT SIGNAL */ + return ret; }