/*
- Copyright (C) 2009 Paul Davis
+ Copyright (C) 2009 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
*/
+#ifdef WAF_BUILD
+#include "libardour-config.h"
+#endif
+
#include "ardour/port.h"
#include "ardour/audioengine.h"
-#include "ardour/i18n.h"
#include "pbd/failed_constructor.h"
#include "pbd/error.h"
#include "pbd/compose.h"
#include <stdexcept>
+#include "i18n.h"
+
using namespace std;
using namespace ARDOUR;
AudioEngine* Port::_engine = 0;
+nframes_t Port::_port_offset = 0;
+nframes_t Port::_buffer_size = 0;
/** @param n Port short name */
Port::Port (std::string const & n, DataType t, Flags f)
/* Unfortunately we have to pass the DataType into this constructor so that we can
create the right kind of JACK port; aside from this we'll use the virtual function type ()
- to establish type.
+ to establish type.
*/
assert (_name.find_first_of (':') == std::string::npos);
-
+
if ((_jack_port = jack_port_register (_engine->jack (), _name.c_str (), t.to_jack_type (), _flags, 0)) == 0) {
throw failed_constructor ();
}
c.push_back (jc[i]);
++n;
}
+ free (jc);
}
-
+
return n;
}
std::string const this_shrt = _engine->make_port_name_non_relative (_name);
int r = 0;
-
+
if (sends_output ()) {
r = jack_connect (_engine->jack (), this_shrt.c_str (), other_shrt.c_str ());
} else {
r = jack_connect (_engine->jack (), other_shrt.c_str (), this_shrt.c_str());
}
-
+
if (r == 0) {
_connections.insert (other);
}
std::string const this_shrt = _engine->make_port_name_non_relative (_name);
int r = 0;
-
+
if (sends_output ()) {
r = jack_disconnect (_engine->jack (), this_shrt.c_str (), other_shrt.c_str ());
} else {
r = jack_disconnect (_engine->jack (), other_shrt.c_str (), this_shrt.c_str ());
}
-
+
if (r == 0) {
_connections.erase (other);
}
-
+
return r;
}
void
Port::recompute_total_latency () const
{
-#ifdef HAVE_JACK_RECOMPUTE_LATENCY
- jack_recompute_total_latency (_engine->jack (), _jack_port);
-#endif
+#ifdef HAVE_JACK_RECOMPUTE_LATENCY
+ jack_client_t* jack = _engine->jack();
+
+ if (!jack) {
+ return;
+ }
+
+ jack_recompute_total_latency (jack, _jack_port);
+#endif
}
nframes_t
Port::total_latency () const
{
- return jack_port_get_total_latency (_engine->jack (), _jack_port);
+ jack_client_t* jack = _engine->jack();
+
+ if (!jack) {
+ return 0;
+ }
+
+ return jack_port_get_total_latency (jack, _jack_port);
}
int
Port::reestablish ()
{
- _jack_port = jack_port_register (_engine->jack(), _name.c_str(), type().to_jack_type(), _flags, 0);
+ jack_client_t* jack = _engine->jack();
+
+ if (!jack) {
+ return -1;
+ }
+
+ cerr << "RE-REGISTER: " << _name.c_str() << endl;
+ _jack_port = jack_port_register (jack, _name.c_str(), type().to_jack_type(), _flags, 0);
if (_jack_port == 0) {
PBD::error << string_compose (_("could not reregister %1"), _name) << endmsg;
return 0;
}
-/** @param n Short name */
+/** @param n Short port name (no JACK client name) */
int
Port::set_name (std::string const & n)
{
- assert (_name.find_first_of (':') == std::string::npos);
+ if (n == _name) {
+ return 0;
+ }
int const r = jack_port_set_name (_jack_port, n.c_str());
+
if (r == 0) {
_name = n;
}
{
jack_port_set_latency (_jack_port, n);
}
+