diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h index 63ef835dc2..e775bec59f 100644 --- a/libs/ardour/ardour/audio_backend.h +++ b/libs/ardour/ardour/audio_backend.h @@ -161,6 +161,9 @@ public: */ virtual bool is_realtime () const = 0; + /** Return true if the backed is JACK */ + virtual bool is_jack () const { return false; } + virtual int client_real_time_priority () { return PBD_RT_PRI_PROC; } /* Discovering devices and parameters */ diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index aea2b37aa5..531ae315a2 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -75,6 +75,7 @@ class LIBARDOUR_API AudioEngine : public PortManager, public SessionHandlePtr std::shared_ptr set_backend (const std::string&, const std::string& arg1, const std::string& arg2); std::shared_ptr current_backend() const { return _backend; } bool setup_required () const; + bool is_jack () const; ProcessThread* main_thread() const { return _main_thread; } diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index badafcd546..dd8f4253d4 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -986,6 +986,12 @@ AudioEngine::current_backend_name() const return string(); } +bool +AudioEngine::is_jack() const +{ + return _backend && _backend->is_jack(); +} + void AudioEngine::drop_backend () { diff --git a/libs/ardour/engine_slave.cc b/libs/ardour/engine_slave.cc index 81052f1102..4f948d7455 100644 --- a/libs/ardour/engine_slave.cc +++ b/libs/ardour/engine_slave.cc @@ -50,13 +50,13 @@ Engine_TransportMaster::init () bool Engine_TransportMaster::usable () const { - return AudioEngine::instance()->current_backend_name() == X_("JACK"); + return AudioEngine::instance()->is_jack(); } void Engine_TransportMaster::check_backend() { - if (AudioEngine::instance()->current_backend_name() == X_("JACK")) { + if (AudioEngine::instance()->is_jack ()) { _connected = true; } else { _connected = false; diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index 3b8c4889aa..22166d7eea 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -1027,7 +1027,7 @@ ARDOUR::get_available_sync_options () vector ret; std::shared_ptr backend = AudioEngine::instance ()->current_backend (); - if (backend && backend->name () == "JACK") { + if (backend && backend->is_jack ()) { ret.push_back (Engine); } diff --git a/libs/ardour/port_manager.cc b/libs/ardour/port_manager.cc index 0d36991872..7da3445f8f 100644 --- a/libs/ardour/port_manager.cc +++ b/libs/ardour/port_manager.cc @@ -886,7 +886,7 @@ PortManager::reestablish_ports () set_pretty_names (port_names, DataType::MIDI, false); } - if (Config->get_work_around_jack_no_copy_optimization () && AudioEngine::instance ()->current_backend_name () == X_("JACK")) { + if (Config->get_work_around_jack_no_copy_optimization () && AudioEngine::instance ()->is_jack ()) { port_engine ().register_port (X_("physical_audio_input_monitor_enable"), DataType::AUDIO, ARDOUR::PortFlags (IsInput | IsTerminal | Hidden)); port_engine ().register_port (X_("physical_midi_input_monitor_enable"), DataType::MIDI, ARDOUR::PortFlags (IsInput | IsTerminal | Hidden)); } @@ -943,7 +943,7 @@ PortManager::reconnect_ports () } } - if (Config->get_work_around_jack_no_copy_optimization () && AudioEngine::instance ()->current_backend_name () == X_("JACK")) { + if (Config->get_work_around_jack_no_copy_optimization () && AudioEngine::instance ()->is_jack ()) { std::string const audio_port = AudioEngine::instance ()->make_port_name_non_relative (X_("physical_audio_input_monitor_enable")); std::string const midi_port = AudioEngine::instance ()->make_port_name_non_relative (X_("physical_midi_input_monitor_enable")); std::vector audio_ports; @@ -1145,7 +1145,7 @@ PortManager::update_input_ports (bool clear) #endif mpw->insert (make_pair (*p, MIDIInputPort (32))); - if (Config->get_work_around_jack_no_copy_optimization () && AudioEngine::instance ()->current_backend_name () == X_("JACK")) { + if (Config->get_work_around_jack_no_copy_optimization () && AudioEngine::instance ()->is_jack ()) { physical_midi_connection_list.push_back (*p); } } @@ -1534,7 +1534,7 @@ PortManager::port_is_virtual_piano (std::string const& name) bool PortManager::port_is_physical_input_monitor_enable (std::string const& name) { - if (Config->get_work_around_jack_no_copy_optimization () && AudioEngine::instance ()->current_backend_name () == X_("JACK")) { + if (Config->get_work_around_jack_no_copy_optimization () && AudioEngine::instance ()->is_jack ()) { if (ends_with (name, X_(":physical_midi_input_monitor_enable"))) { return true; } diff --git a/libs/backends/jack/jack_api.cc b/libs/backends/jack/jack_api.cc index 6519e6276d..959e3e5838 100644 --- a/libs/backends/jack/jack_api.cc +++ b/libs/backends/jack/jack_api.cc @@ -31,7 +31,11 @@ static bool already_configured (); static bool available (); static ARDOUR::AudioBackendInfo _descriptor = { +#if ! (defined(__APPLE__) || defined(PLATFORM_WINDOWS)) + "JACK/Pipewire", +#else "JACK", +#endif instantiate, deinstantiate, backend_factory, diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index 96bff6280a..69e599d3c7 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -87,7 +87,11 @@ JACKAudioBackend::~JACKAudioBackend() string JACKAudioBackend::name() const { +#if ! (defined(__APPLE__) || defined(PLATFORM_WINDOWS)) + return X_("JACK/Pipewire"); +#else return X_("JACK"); +#endif } void* diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index 106dcb0a31..ec01613fc2 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -60,6 +60,8 @@ class JACKAudioBackend : public AudioBackend { void* private_handle() const; bool is_realtime () const; + bool is_jack () const { return true; } + bool requires_driver_selection() const; std::vector enumerate_drivers () const; int set_driver (const std::string&);