From 954edb7bd842708c2cb67e9712d6b1a656ef38a8 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 21 Mar 2021 00:06:44 +0100 Subject: [PATCH] Work around jack input monitoring This works around JACK not allowing to directly access physical input buffers by creating an explicit connection. Ardour access input-buffers directly without connection for input meters and AFL. This work in general since data on those ports are always read unconditionally at the start of each process cycle. jack_port_get_buffer (jack_port_by_name (c, "system:capture_1"), n); However with jack this fails if the given port is not connected. Due to an internal jack optimization collecting input data is skipped for ports that have no connections. --- libs/ardour/ardour/rc_configuration_vars.h | 6 ++++++ libs/ardour/port_manager.cc | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index d8d4f3e9b8..646ef54479 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -47,6 +47,12 @@ CONFIG_VARIABLE (AutoConnectOption, output_auto_connect, "output-auto-connect", CONFIG_VARIABLE (AutoConnectOption, input_auto_connect, "input-auto-connect", AutoConnectPhysical) CONFIG_VARIABLE (bool, strict_io, "strict-io", true) +/* Connect all physical inputs to a dummy port, this makes raw input data available. + * `jack_port_get_buffer (jack_port_by_name (c, "system:capture_1") , n_samples);` + * nees to work for input-monitoring (recorder page). + */ +CONFIG_VARIABLE (bool, work_around_jack_no_copy_optimization, "work-around-jack-no-copy-optimization", true) + /* Naming */ CONFIG_VARIABLE (TracksAutoNamingRule, tracks_auto_naming, "tracks-auto-naming", UseDefaultNames) diff --git a/libs/ardour/port_manager.cc b/libs/ardour/port_manager.cc index aad3486480..523bd00b12 100644 --- a/libs/ardour/port_manager.cc +++ b/libs/ardour/port_manager.cc @@ -737,6 +737,16 @@ 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")) { + PortEngine::PortHandle ph = port_engine().register_port (X_("physical_input_monitor_enable"), DataType::AUDIO, ARDOUR::PortFlags (IsInput|IsTerminal|Hidden)); + std::vector audio_ports; + get_physical_inputs (DataType::AUDIO, audio_ports); + for (std::vector::iterator p = audio_ports.begin(); p != audio_ports.end(); ++p) { + port_engine().connect (ph, *p); + } + } + update_input_ports (true); return 0; }