bool Port::_connecting_blocked = false;
pframes_t Port::_global_port_buffer_offset = 0;
pframes_t Port::_cycle_nframes = 0;
+double Port::_speed_ratio = 1.0;
std::string Port::state_node_name = X_("Port");
+const uint32_t Port::_resampler_quality = 12;
/* a handy define to shorten what would otherwise be a needlessly verbose
* repeated phrase
: _port_buffer_offset (0)
, _name (n)
, _flags (f)
- , _last_monitor (false)
+ , _last_monitor (false)
{
_private_playback_latency.min = 0;
_private_playback_latency.max = 0;
assert (_name.find_first_of (':') == std::string::npos);
- if ((_port_handle = port_engine.register_port (_name, t, _flags)) == 0) {
+ if (!port_engine.available ()) {
+ DEBUG_TRACE (DEBUG::Ports, string_compose ("port-engine n/a postpone registering %1\n", name()));
+ _port_handle = 0; // created during ::reestablish() later
+ } else if ((_port_handle = port_engine.register_port (_name, t, _flags)) == 0) {
cerr << "Failed to register port \"" << _name << "\", reason is unknown from here\n";
throw failed_constructor ();
}
+ DEBUG_TRACE (DEBUG::Ports, string_compose ("registed port %1 handle %2\n", name(), _port_handle));
PortDrop.connect_same_thread (drop_connection, boost::bind (&Port::drop, this));
PortSignalDrop.connect_same_thread (drop_connection, boost::bind (&Port::signal_drop, this));
}
void
-Port::set_public_latency_range (LatencyRange& range, bool playback) const
+Port::set_public_latency_range (LatencyRange const& range, bool playback) const
{
/* this sets the visible latency that the rest of the port system
sees. because we do latency compensation, all (most) of our visible
(playback ? "PLAYBACK" : "CAPTURE")));;
if (_port_handle) {
- port_engine.set_latency_range (_port_handle, playback, range);
+ LatencyRange r (range);
+ if (externally_connected ()) {
+#if 0
+ r.min *= _speed_ratio;
+ r.max *= _speed_ratio;
+#endif
+ r.min += (_resampler_quality - 1);
+ r.max += (_resampler_quality - 1);
+ }
+ port_engine.set_latency_range (_port_handle, playback, r);
}
}
if (_port_handle) {
r = port_engine.get_latency_range (_port_handle, sends_output() ? true : false);
+ if (externally_connected ()) {
+#if 0
+ r.min /= _speed_ratio;
+ r.max /= _speed_ratio;
+#endif
+ r.min += (_resampler_quality - 1);
+ r.max += (_resampler_quality - 1);
+ }
DEBUG_TRACE (DEBUG::Latency, string_compose (
"GET PORT %1: %4 PUBLIC latency range %2 .. %3\n",
if (remote_port) {
lr = port_engine.get_latency_range (remote_port, playback);
+ if (externally_connected ()) {
+#if 0
+ lr.min /= _speed_ratio;
+ lr.max /= _speed_ratio;
+#endif
+ lr.min += (_resampler_quality - 1);
+ lr.max += (_resampler_quality - 1);
+ }
DEBUG_TRACE (DEBUG::Latency, string_compose (
"\t%1 <-> %2 : latter has latency range %3 .. %4\n",
return -1;
}
+ DEBUG_TRACE (DEBUG::Ports, string_compose ("Port::reestablish %1 handle %2\n", name(), _port_handle));
+
reset ();
port_manager->PortConnectedOrDisconnected.connect_same_thread (engine_connection,
return port_engine.physically_connected (_port_handle);
}
+bool
+Port::externally_connected () const
+{
+ if (!_port_handle) {
+ return false;
+ }
+
+ // TODO: When used with JACK, check if this port
+ // is connected to any non-ardour ports.
+
+ return port_engine.physically_connected (_port_handle);
+}
+
XMLNode&
Port::get_state () const
{
return 0;
}
+
+/*static*/ void
+Port::set_speed_ratio (double s) {
+ /* see VMResampler::set_rratio() for min/max range */
+ _speed_ratio = std::min (16.0, std::max (0.5, s));
+}
+
+/*static*/ void
+Port::set_cycle_samplecnt (pframes_t n) {
+ _cycle_nframes = floor (n * _speed_ratio);
+}