}
Glib::RefPtr<Gtk::ListStore> port_list = r_it->get_value (route_cols.port_list_col);
- std::set<AudioPort *> route_ports;
- std::set<AudioPort *> intersection;
- std::map<AudioPort *, string> port_labels;
+ std::set<boost::weak_ptr<AudioPort> > route_ports;
+ std::set<boost::weak_ptr<AudioPort> > intersection;
+ std::map<boost::weak_ptr<AudioPort>, string> port_labels;
for (Gtk::ListStore::Children::const_iterator p_it = port_list->children().begin(); p_it != port_list->children().end(); ++p_it) {
route_ports.insert ((*p_it)->get_value (route_cols.port_cols.port));
- port_labels.insert (std::pair<AudioPort*, string> ((*p_it)->get_value (route_cols.port_cols.port),
- (*p_it)->get_value (route_cols.port_cols.label)));
+ port_labels.insert (make_pair ((*p_it)->get_value (route_cols.port_cols.port),
+ (*p_it)->get_value (route_cols.port_cols.label)));
}
std::set_intersection (pec->get_ports().begin(), pec->get_ports().end(),
route_ports.begin(), route_ports.end(),
- std::insert_iterator<std::set<AudioPort *> > (intersection, intersection.begin()));
+ std::insert_iterator<std::set<boost::weak_ptr<AudioPort> > > (intersection, intersection.begin()));
- intersection.erase (0); // Remove "none" selection
+ intersection.erase (boost::weak_ptr<AudioPort> ()); // Remove "none" selection
if (intersection.empty()) {
continue;
/* Set previous channels (if any) to none */
for (uint32_t chn = 1; chn < i; ++chn) {
- r_it->set_value (route_cols.get_channel (chn).port, (AudioPort *) 0);
+ r_it->set_value (route_cols.get_channel (chn).port, boost::weak_ptr<AudioPort> ());
r_it->set_value (route_cols.get_channel (chn).label, string ("(none)"));
}
}
- AudioPort * port = *intersection.begin();
- std::map<AudioPort *, string>::iterator label_it = port_labels.find (port);
+ boost::weak_ptr<AudioPort> port = *intersection.begin();
+ std::map<boost::weak_ptr<AudioPort>, string>::iterator label_it = port_labels.find (port);
string label = label_it != port_labels.end() ? label_it->second : "error";
r_it->set_value (route_cols.get_channel (i).port, port);
row = *iter;
row[route_cols.port_cols.selected] = false;
- row[route_cols.port_cols.port] = 0;
+ row[route_cols.port_cols.port] = boost::weak_ptr<AudioPort> ();
row[route_cols.port_cols.label] = "(none)";
}
for (Gtk::ListStore::Children::iterator it = route_list->children().begin(); it != route_list->children().end(); ++it) {
std::string label = it->get_value(route_cols.selected) ? "(none)" : "";
it->set_value (route_cols.get_channel (n_channels).label, label);
- it->set_value (route_cols.get_channel (n_channels).port, (AudioPort *) 0);
+ it->set_value (route_cols.get_channel (n_channels).port, boost::weak_ptr<AudioPort> ());
}
/* set column width */
void
PortExportChannelSelector::ChannelTreeView::update_config ()
{
-
if (!config) { return; }
config->clear_channels();
continue;
}
- AudioPort * port = row[route_cols.get_channel (i).port];
+ boost::weak_ptr<AudioPort> weak_port = row[route_cols.get_channel (i).port];
+ boost::shared_ptr<AudioPort> port = weak_port.lock ();
if (port) {
pec->add_port (port);
}
}
iter->set_value (route_cols.get_channel (i).label, std::string("(none)"));
- iter->set_value (route_cols.get_channel (i).port, (AudioPort *) 0);
+ iter->set_value (route_cols.get_channel (i).port, boost::weak_ptr<AudioPort> ());
Glib::RefPtr<Gtk::ListStore> port_list = iter->get_value (route_cols.port_list_col);
Gtk::ListStore::Children::iterator port_it;
for (port_it = port_list->children().begin(); port_it != port_list->children().end(); ++port_it) {
if (port_number == i) {
iter->set_value (route_cols.get_channel (i).label, (std::string) (*port_it)->get_value (route_cols.port_cols.label));
- iter->set_value (route_cols.get_channel (i).port, (AudioPort *) (*port_it)->get_value (route_cols.port_cols.port));
+ iter->set_value (route_cols.get_channel (i).port, (*port_it)->get_value (route_cols.port_cols.port));
}
++port_number;
for (port_it = port_list->children().begin(); port_it != port_list->children().end(); ++port_it) {
std::string label = port_it->get_value (route_cols.port_cols.label);
if (label == new_text) {
- iter->set_value (route_cols.get_channel (channel).port, (AudioPort *) (*port_it)[route_cols.port_cols.port]);
+ boost::weak_ptr<AudioPort> w = (*port_it)[route_cols.port_cols.port];
+ iter->set_value (route_cols.get_channel (channel).port, w);
}
}
public:
Channel (RouteCols & cols) { cols.add (port); cols.add (label); }
- Gtk::TreeModelColumn<ARDOUR::AudioPort *> port;
- Gtk::TreeModelColumn<std::string> label;
+ Gtk::TreeModelColumn<boost::weak_ptr<ARDOUR::AudioPort> > port;
+ Gtk::TreeModelColumn<std::string> label;
};
std::list<Channel> channels;
class PortCols : public Gtk::TreeModel::ColumnRecord
{
public:
- PortCols () { add (selected); add(port); add(label); }
+ PortCols () { add(selected); add(port); add(label); }
- Gtk::TreeModelColumn<bool> selected; // not used ATM
- Gtk::TreeModelColumn<ARDOUR::AudioPort *> port;
- Gtk::TreeModelColumn<std::string> label;
+ Gtk::TreeModelColumn<bool> selected; // not used ATM
+ Gtk::TreeModelColumn<boost::weak_ptr<ARDOUR::AudioPort> > port;
+ Gtk::TreeModelColumn<std::string> label;
};
PortCols port_cols;
};
for (Bundle::PortList::const_iterator i = in_ports.begin(); i != in_ports.end(); ++i) {
for (Bundle::PortList::const_iterator j = out_ports.begin(); j != out_ports.end(); ++j) {
- Port* p = _session->engine().get_port_by_name (*i);
- Port* q = _session->engine().get_port_by_name (*j);
+ boost::shared_ptr<Port> p = _session->engine().get_port_by_name (*i);
+ boost::shared_ptr<Port> q = _session->engine().get_port_by_name (*j);
if (p) {
if (s) {
for (Bundle::PortList::const_iterator i = in_ports.begin(); i != in_ports.end(); ++i) {
for (Bundle::PortList::const_iterator j = out_ports.begin(); j != out_ports.end(); ++j) {
- Port* p = _session->engine().get_port_by_name (*i);
- Port* q = _session->engine().get_port_by_name (*j);
+ boost::shared_ptr<Port> p = _session->engine().get_port_by_name (*i);
+ boost::shared_ptr<Port> q = _session->engine().get_port_by_name (*j);
if (!p && !q) {
/* two non-Ardour ports; things are slightly more involved */
for (ARDOUR::Bundle::PortList::const_iterator i = our_ports.begin(); i != our_ports.end(); ++i) {
for (ARDOUR::Bundle::PortList::const_iterator j = other_ports.begin(); j != other_ports.end(); ++j) {
- Port* f = _session->engine().get_port_by_name (*i);
+ boost::shared_ptr<Port> f = _session->engine().get_port_by_name (*i);
if (!f) {
return;
}
for (ARDOUR::Bundle::PortList::const_iterator i = our_ports.begin(); i != our_ports.end(); ++i) {
for (ARDOUR::Bundle::PortList::const_iterator j = other_ports.begin(); j != other_ports.end(); ++j) {
- Port* f = _session->engine().get_port_by_name (*i);
+ boost::shared_ptr<Port> f = _session->engine().get_port_by_name (*i);
/* since we are talking about an IO, our ports should all have an associated Port *,
so the above call should never fail */
{
uint32_t io_count;
uint32_t io_index;
- Port *port;
+ boost::shared_ptr<Port> port;
vector<string> port_connections;
uint32_t total_connection_count = 0;
}
void
-MixerStrip::port_connected_or_disconnected (Port* a, Port* b)
+MixerStrip::port_connected_or_disconnected (boost::weak_ptr<Port> wa, boost::weak_ptr<Port> wb)
{
+ boost::shared_ptr<Port> a = wa.lock ();
+ boost::shared_ptr<Port> b = wb.lock ();
+
+ if (!a || !b) {
+ return;
+ }
+
if (_route->input()->has_port (a) || _route->input()->has_port (b)) {
update_input_display ();
set_width_enum (_width, this);
static int scrollbar_height;
void update_io_button (boost::shared_ptr<ARDOUR::Route> route, Width width, bool input_button);
- void port_connected_or_disconnected (ARDOUR::Port *, ARDOUR::Port *);
+ void port_connected_or_disconnected (boost::weak_ptr<ARDOUR::Port>, boost::weak_ptr<ARDOUR::Port>);
static std::string meter_point_string (ARDOUR::MeterPoint);
};
boost::shared_ptr<IO> io = io_from_bundle (b.bundle);
if (io) {
- Port* p = io->nth (b.channel);
+ boost::shared_ptr<Port> p = io->nth (b.channel);
if (p) {
int const r = io->remove_port (p, this);
if (r == -1) {
class AudioEngine : public SessionHandlePtr
{
public:
- typedef std::set<Port*> Ports;
+ typedef std::set<boost::shared_ptr<Port> > Ports;
AudioEngine (std::string client_name, std::string session_uuid);
virtual ~AudioEngine ();
virtual const char *what() const throw() { return "could not connect to engine backend"; }
};
- Port *register_input_port (DataType, const std::string& portname);
- Port *register_output_port (DataType, const std::string& portname);
- int unregister_port (Port &);
+ boost::shared_ptr<Port> register_input_port (DataType, const std::string& portname);
+ boost::shared_ptr<Port> register_output_port (DataType, const std::string& portname);
+ int unregister_port (boost::shared_ptr<Port>);
bool port_is_physical (const std::string&) const;
void ensure_monitor_input (const std::string&, bool) const;
int connect (const std::string& source, const std::string& destination);
int disconnect (const std::string& source, const std::string& destination);
- int disconnect (Port &);
+ int disconnect (boost::shared_ptr<Port>);
const char ** get_ports (const std::string& port_name_pattern, const std::string& type_name_pattern, uint32_t flags);
void get_physical_outputs (DataType type, std::vector<std::string>&);
void get_physical_inputs (DataType type, std::vector<std::string>&);
- Port *get_port_by_name (const std::string &);
+ boost::shared_ptr<Port> get_port_by_name (const std::string &);
enum TransportState {
TransportStopped = JackTransportStopped,
* The std::string parameters are the (long) port names.
* The bool parameter is true if ports were connected, or false for disconnected.
*/
- PBD::Signal5<void, Port *, std::string, Port *, std::string, bool> PortConnectedOrDisconnected;
+ PBD::Signal5<void, boost::weak_ptr<Port>, std::string, boost::weak_ptr<Port>, std::string, bool> PortConnectedOrDisconnected;
std::string make_port_name_relative (std::string) const;
std::string make_port_name_non_relative (std::string) const;
SerializedRCUManager<Ports> ports;
- Port* register_port (DataType type, const std::string& portname, bool input);
+ boost::shared_ptr<Port> register_port (DataType type, const std::string& portname, bool input);
int process_callback (pframes_t nframes);
void* process_thread ();
class PortExportChannel : public ExportChannel
{
public:
- typedef std::set<AudioPort *> PortSet;
+ typedef std::set<boost::weak_ptr<AudioPort> > PortSet;
PortExportChannel ();
void set_max_buffer_size(framecnt_t frames);
bool operator< (ExportChannel const & other) const;
- void add_port (AudioPort * port) { ports.insert (port); }
+ void add_port (boost::weak_ptr<AudioPort> port) { ports.insert (port); }
PortSet const & get_ports () { return ports; }
private:
boost::shared_ptr<Bundle> bundle () { return _bundle; }
int add_port (std::string connection, void *src, DataType type = DataType::NIL);
- int remove_port (Port *, void *src);
- int connect (Port *our_port, std::string other_port, void *src);
- int disconnect (Port *our_port, std::string other_port, void *src);
+ int remove_port (boost::shared_ptr<Port>, void *src);
+ int connect (boost::shared_ptr<Port> our_port, std::string other_port, void *src);
+ int disconnect (boost::shared_ptr<Port> our_port, std::string other_port, void *src);
int disconnect (void *src);
bool connected_to (boost::shared_ptr<const IO>) const;
bool connected_to (const std::string&) const;
PortSet& ports() { return _ports; }
const PortSet& ports() const { return _ports; }
- bool has_port (Port *) const;
+ bool has_port (boost::shared_ptr<Port>) const;
- Port *nth (uint32_t n) const {
+ boost::shared_ptr<Port> nth (uint32_t n) const {
if (n < _ports.num_ports()) {
return _ports.port(n);
} else {
- return 0;
+ return boost::shared_ptr<Port> ();
}
}
- Port* port_by_name (const std::string& str) const;
+ boost::shared_ptr<Port> port_by_name (const std::string& str) const;
- AudioPort* audio(uint32_t n) const;
- MidiPort* midi(uint32_t n) const;
+ boost::shared_ptr<AudioPort> audio(uint32_t n) const;
+ boost::shared_ptr<MidiPort> midi(uint32_t n) const;
const ChanCount& n_ports () const { return _ports.count(); }
MidiRingBuffer<framepos_t>* _playback_buf;
MidiRingBuffer<framepos_t>* _capture_buf;
- MidiPort* _source_port;
+ boost::weak_ptr<MidiPort> _source_port;
boost::shared_ptr<SMFSource> _write_source;
NoteMode _note_mode;
volatile gint _frames_written_to_ringbuffer;
size_t num_ports() const;
size_t num_ports(DataType type) const { return _ports[type].size(); }
- void add(Port* port);
- bool remove(Port* port);
+ void add (boost::shared_ptr<Port> port);
+ bool remove (boost::shared_ptr<Port> port);
/** nth port */
- Port* port(size_t index) const;
+ boost::shared_ptr<Port> port(size_t index) const;
/** nth port of type @a t, or nth port if t = NIL */
- Port* port(DataType t, size_t index) const;
+ boost::shared_ptr<Port> port(DataType t, size_t index) const;
- AudioPort* nth_audio_port(size_t n) const;
+ boost::shared_ptr<AudioPort> nth_audio_port(size_t n) const;
- MidiPort* nth_midi_port(size_t n) const;
+ boost::shared_ptr<MidiPort> nth_midi_port(size_t n) const;
- bool contains(const Port* port) const;
+ bool contains (boost::shared_ptr<const Port> port) const;
/** Remove all ports from the PortSet. Ports are not deregistered with
* the engine, it's the caller's responsibility to not leak here!
template<typename PS, typename P>
class iterator_base {
public:
- P& operator*() { return *_set.port(_type, _index); }
- P* operator->() { return _set.port(_type, _index); }
+ boost::shared_ptr<P> operator*() { return _set.port(_type, _index); }
+ boost::shared_ptr<P> operator->() { return _set.port(_type, _index); }
iterator_base<PS,P>& operator++() { ++_index; return *this; } // yes, prefix only
bool operator==(const iterator_base<PS,P>& other) { return (_index == other._index); }
bool operator!=(const iterator_base<PS,P>& other) { return (_index != other._index); }
class audio_iterator {
public:
- AudioPort& operator*() { return *_set.nth_audio_port(_index); }
- AudioPort* operator->() { return _set.nth_audio_port(_index); }
+ boost::shared_ptr<AudioPort> operator*() { return _set.nth_audio_port(_index); }
+ boost::shared_ptr<AudioPort> operator->() { return _set.nth_audio_port(_index); }
audio_iterator& operator++() { ++_index; return *this; } // yes, prefix only
bool operator==(const audio_iterator& other) { return (_index == other._index); }
bool operator!=(const audio_iterator& other) { return (_index != other._index); }
audio_iterator audio_end() { return audio_iterator(*this, _count.n_audio()); }
private:
- typedef std::vector<Port*> PortVec;
+ typedef std::vector<boost::shared_ptr<Port> > PortVec;
// Vector of vectors, indexed by DataType::to_index()
std::vector<PortVec> _ports;
for recording, and use rec_offset
*/
- AudioPort* const ap = _io->audio (n);
+ boost::shared_ptr<AudioPort> const ap = _io->audio (n);
assert(ap);
assert(rec_nframes <= (framecnt_t) ap->get_audio_buffer(nframes).capacity());
goto out;
}
- AudioPort* const ap = _io->audio (n);
+ boost::shared_ptr<AudioPort> const ap = _io->audio (n);
assert(ap);
Sample* buf = ap->get_audio_buffer(nframes).data (rec_offset);
jack_port_t* jack_port_a = jack_port_by_id (_priv_jack, id_a);
jack_port_t* jack_port_b = jack_port_by_id (_priv_jack, id_b);
- Port* port_a = 0;
- Port* port_b = 0;
+ boost::shared_ptr<Port> port_a;
+ boost::shared_ptr<Port> port_b;
boost::shared_ptr<Ports> pr = ae->ports.reader ();
Ports::iterator i = pr->begin ();
for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
- Port *port = (*i);
bool x;
- if (port->last_monitor() != (x = port->monitoring_input ())) {
- port->set_last_monitor (x);
+ if ((*i)->last_monitor() != (x = (*i)->monitoring_input ())) {
+ (*i)->set_last_monitor (x);
/* XXX I think this is dangerous, due to
a likely mutex in the signal handlers ...
*/
- port->MonitorInputChanged (x); /* EMIT SIGNAL */
+ (*i)->MonitorInputChanged (x); /* EMIT SIGNAL */
}
}
last_monitor_check = next_processed_frames;
for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
- Port *port = (*i);
-
- if (port->sends_output()) {
- port->get_buffer(nframes).silence(nframes);
+ if ((*i)->sends_output()) {
+ (*i)->get_buffer(nframes).silence(nframes);
}
}
}
throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
}
-Port*
+boost::shared_ptr<Port>
AudioEngine::register_port (DataType dtype, const string& portname, bool input)
{
- Port* newport;
+ boost::shared_ptr<Port> newport;
try {
if (dtype == DataType::AUDIO) {
- newport = new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput));
+ newport.reset (new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput)));
} else if (dtype == DataType::MIDI) {
- newport = new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput));
+ newport.reset (new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput)));
} else {
throw PortRegistrationFailure("unable to create port (unknown type)");
}
}
}
-Port *
+boost::shared_ptr<Port>
AudioEngine::register_input_port (DataType type, const string& portname)
{
return register_port (type, portname, true);
}
-Port *
+boost::shared_ptr<Port>
AudioEngine::register_output_port (DataType type, const string& portname)
{
return register_port (type, portname, false);
}
int
-AudioEngine::unregister_port (Port& port)
+AudioEngine::unregister_port (boost::shared_ptr<Port> port)
{
/* caller must hold process lock */
{
RCUWriter<Ports> writer (ports);
boost::shared_ptr<Ports> ps = writer.get_copy ();
-
- for (Ports::iterator i = ps->begin(); i != ps->end(); ++i) {
- if ((*i) == &port) {
- delete *i;
- ps->erase (i);
- break;
- }
- }
+ ps->erase (port);
/* writer goes out of scope, forces update */
}
+ ports.flush ();
+
return 0;
}
string d = make_port_name_non_relative (destination);
- Port* src = get_port_by_name (s);
- Port* dst = get_port_by_name (d);
+ boost::shared_ptr<Port> src = get_port_by_name (s);
+ boost::shared_ptr<Port> dst = get_port_by_name (d);
if (src) {
ret = src->connect (d);
string s = make_port_name_non_relative (source);
string d = make_port_name_non_relative (destination);
- Port* src = get_port_by_name (s);
- Port* dst = get_port_by_name (d);
+ boost::shared_ptr<Port> src = get_port_by_name (s);
+ boost::shared_ptr<Port> dst = get_port_by_name (d);
if (src) {
ret = src->disconnect (d);
}
int
-AudioEngine::disconnect (Port& port)
+AudioEngine::disconnect (boost::shared_ptr<Port> port)
{
GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
}
}
- return port.disconnect_all ();
+ return port->disconnect_all ();
}
ARDOUR::framecnt_t
}
/** @param name Full or short name of port
- * @return Corresponding Port* or 0. This object remains the property of the AudioEngine
- * so must not be deleted.
+ * @return Corresponding Port or 0.
*/
-Port*
+
+boost::shared_ptr<Port>
AudioEngine::get_port_by_name (const string& portname)
{
if (!_running) {
fatal << _("get_port_by_name() called before engine was started") << endmsg;
/*NOTREACHED*/
} else {
- return 0;
+ boost::shared_ptr<Port> ();
}
}
if (!port_is_mine (portname)) {
/* not an ardour port */
- return 0;
+ return boost::shared_ptr<Port> ();
}
std::string const rel = make_port_name_relative (portname);
}
}
- return 0;
+ return boost::shared_ptr<Port> ();
}
const char **
/* process lock MUST be held by caller
*/
- vector<Port*> to_be_deleted;
-
{
RCUWriter<Ports> writer (ports);
boost::shared_ptr<Ports> ps = writer.get_copy ();
- for (Ports::iterator i = ps->begin(); i != ps->end(); ++i) {
- to_be_deleted.push_back (*i);
- }
ps->clear ();
}
ports.flush ();
- /* now do the actual deletion, given that "ports" is now empty, thus
- preventing anyone else from getting a handle on a Port
- */
-
- for (vector<Port*>::iterator p = to_be_deleted.begin(); p != to_be_deleted.end(); ++p) {
- delete *p;
- }
-
port_remove_in_progress = false;
}
for (uint32_t j = 0; j < A.size(); ++j) {
for (uint32_t k = 0; k < B.size(); ++k) {
- Port* p = engine.get_port_by_name (A[j]);
- Port* q = engine.get_port_by_name (B[k]);
+ boost::shared_ptr<Port> p = engine.get_port_by_name (A[j]);
+ boost::shared_ptr<Port> q = engine.get_port_by_name (B[k]);
if (!p && !q) {
return false;
PortSet& ports (_output->ports());
for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) {
- (*i).flush_buffers (nframes, time);
+ i->flush_buffers (nframes, time);
}
}
PortSet& ports (_output->ports());
for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) {
- (*i).transport_stopped ();
+ i->transport_stopped ();
}
}
}
PortSet& ports (_output->ports());
for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) {
- (*i).realtime_locate ();
+ i->realtime_locate ();
}
}
}
assert(frames <= buffer_size);
if (ports.size() == 1) {
- data = (*ports.begin())->get_audio_buffer(frames).data();
+ boost::shared_ptr<AudioPort> p = ports.begin()->lock ();
+ data = p->get_audio_buffer(frames).data();
return;
}
memset (buffer.get(), 0, frames * sizeof (Sample));
for (PortSet::const_iterator it = ports.begin(); it != ports.end(); ++it) {
- if (*it != 0) {
- Sample* port_buffer = (*it)->get_audio_buffer(frames).data();
+ boost::shared_ptr<AudioPort> p = it->lock ();
+ if (p) {
+ Sample* port_buffer = p->get_audio_buffer(frames).data();
for (uint32_t i = 0; i < frames; ++i) {
buffer[i] += (float) port_buffer[i];
{
XMLNode * port_node;
for (PortSet::const_iterator it = ports.begin(); it != ports.end(); ++it) {
- if ((port_node = node->add_child ("Port"))) {
- port_node->add_property ("name", (*it)->name());
+ boost::shared_ptr<Port> p = it->lock ();
+ if (p && (port_node = node->add_child ("Port"))) {
+ port_node->add_property ("name", p->name());
}
}
}
for (XMLNodeList::iterator it = xml_ports.begin(); it != xml_ports.end(); ++it) {
if ((prop = (*it)->property ("name"))) {
std::string const & name = prop->value();
- AudioPort * port = dynamic_cast<AudioPort *> (session.engine().get_port_by_name (name));
+ boost::shared_ptr<AudioPort> port = boost::dynamic_pointer_cast<AudioPort> (session.engine().get_port_by_name (name));
if (port) {
ports.insert (port);
} else {
int
-IO::disconnect (Port* our_port, string other_port, void* src)
+IO::disconnect (boost::shared_ptr<Port> our_port, string other_port, void* src)
{
if (other_port.length() == 0 || our_port == 0) {
return 0;
}
int
-IO::connect (Port* our_port, string other_port, void* src)
+IO::connect (boost::shared_ptr<Port> our_port, string other_port, void* src)
{
if (other_port.length() == 0 || our_port == 0) {
return 0;
}
int
-IO::remove_port (Port* port, void* src)
+IO::remove_port (boost::shared_ptr<Port> port, void* src)
{
ChanCount before = _ports.count ();
ChanCount after = before;
change.type = IOChange::Type (change.type | IOChange::ConnectionsChanged);
}
- _session.engine().unregister_port (*port);
+ _session.engine().unregister_port (port);
check_bundles_connected ();
}
}
int
IO::add_port (string destination, void* src, DataType type)
{
- Port* our_port;
+ boost::shared_ptr<Port> our_port;
if (type == DataType::NIL) {
type = _default_type;
{
assert (!AudioEngine::instance()->process_lock().trylock());
- Port* port = 0;
+ boost::shared_ptr<Port> port;
changed = false;
assert(port);
_ports.remove(port);
- _session.engine().unregister_port (*port);
+ _session.engine().unregister_port (port);
changed = true;
}
continue;
}
- Port* p = port_by_name (prop->value());
+ boost::shared_ptr<Port> p = port_by_name (prop->value());
if (p) {
for (XMLNodeConstIterator c = (*i)->children().begin(); c != (*i)->children().end(); ++c) {
}
-AudioPort*
+boost::shared_ptr<AudioPort>
IO::audio(uint32_t n) const
{
return _ports.nth_audio_port (n);
}
-MidiPort*
+boost::shared_ptr<MidiPort>
IO::midi(uint32_t n) const
{
return _ports.nth_midi_port (n);
}
}
-Port*
+boost::shared_ptr<Port>
IO::port_by_name (const std::string& str) const
{
/* to be called only from ::set_state() - no locking */
for (PortSet::const_iterator i = _ports.begin(); i != _ports.end(); ++i) {
- const Port& p(*i);
-
- if (p.name() == str) {
- return const_cast<Port*>(&p);
+ if (i->name() == str) {
+ return boost::const_pointer_cast<Port> (*i);
}
}
- return 0;
+ return boost::shared_ptr<Port> ();
}
bool
}
bool
-IO::has_port (Port* p) const
+IO::has_port (boost::shared_ptr<Port> p) const
{
Glib::Mutex::Lock lm (io_lock);
return _ports.contains (p);
: Diskstream(sess, name, flag)
, _playback_buf(0)
, _capture_buf(0)
- , _source_port(0)
, _note_mode(Sustained)
, _frames_written_to_ringbuffer(0)
, _frames_read_from_ringbuffer(0)
: Diskstream(sess, node)
, _playback_buf(0)
, _capture_buf(0)
- , _source_port(0)
, _note_mode(Sustained)
, _frames_written_to_ringbuffer(0)
, _frames_read_from_ringbuffer(0)
}
if (ni == 0) {
- _source_port = 0;
+ _source_port.reset ();
} else {
_source_port = _io->midi(0);
}
return 0;
}
- if (_source_port == 0) {
+ boost::shared_ptr<MidiPort> sp = _source_port.lock ();
+
+ if (sp == 0) {
return 1;
}
if (nominally_recording || rec_nframes) {
// Pump entire port buffer into the ring buffer (FIXME: split cycles?)
- MidiBuffer& buf = _source_port->get_midi_buffer(nframes);
+ MidiBuffer& buf = sp->get_midi_buffer(nframes);
for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
const Evoral::MIDIEvent<MidiBuffer::TimeType> ev(*i, false);
assert(ev.buffer());
g_atomic_int_set (&_record_enabled, 1);
- if (_source_port && Config->get_monitoring_model() == HardwareMonitoring) {
- _source_port->request_monitor_input (!(_session.config.get_auto_input() && rolling));
+ boost::shared_ptr<MidiPort> sp = _source_port.lock ();
+
+ if (sp && Config->get_monitoring_model() == HardwareMonitoring) {
+ sp->request_monitor_input (!(_session.config.get_auto_input() && rolling));
}
RecordEnableChanged (); /* EMIT SIGNAL */
void
MidiDiskstream::monitor_input (bool yn)
{
- if (_source_port)
- _source_port->ensure_monitor_input (yn);
+ boost::shared_ptr<MidiPort> sp = _source_port.lock ();
+
+ if (sp) {
+ sp->ensure_monitor_input (yn);
+ }
}
void
PortSet& ports (_input->ports());
for (PortSet::iterator p = ports.begin(DataType::MIDI); p != ports.end(DataType::MIDI); ++p) {
- MidiPort* mp = dynamic_cast<MidiPort*> (&*p);
+ boost::shared_ptr<MidiPort> mp = boost::dynamic_pointer_cast<MidiPort> (*p);
if (yn != mp->input_active()) {
mp->set_input_active (yn);
}
latency compensation.
*/
- Port* remote_port = AudioEngine::instance()->get_port_by_name (*c);
+ boost::shared_ptr<Port> remote_port = AudioEngine::instance()->get_port_by_name (*c);
if (remote_port) {
lr = remote_port->private_latency_range ((playback ? JackPlaybackLatency : JackCaptureLatency));
DEBUG_TRACE (DEBUG::Latency, string_compose (
_ports.push_back( PortVec() );
}
-static bool sort_ports_by_name (Port* a, Port* b)
+static bool sort_ports_by_name (boost::shared_ptr<Port> a, boost::shared_ptr<Port> b)
{
string aname (a->name());
string bname (b->name());
}
void
-PortSet::add(Port* port)
+PortSet::add (boost::shared_ptr<Port> port)
{
PortVec& v = _ports[port->type()];
}
bool
-PortSet::remove(Port* port)
+PortSet::remove (boost::shared_ptr<Port> port)
{
for (std::vector<PortVec>::iterator l = _ports.begin(); l != _ports.end(); ++l) {
PortVec::iterator i = find(l->begin(), l->end(), port);
}
bool
-PortSet::contains(const Port* port) const
+PortSet::contains (boost::shared_ptr<const Port> port) const
{
for (std::vector<PortVec>::const_iterator l = _ports.begin(); l != _ports.end(); ++l)
- if (find((*l).begin(), (*l).end(), port) != (*l).end())
+ if (find (l->begin(), l->end(), port) != l->end())
return true;
return false;
}
-Port*
+boost::shared_ptr<Port>
PortSet::port(size_t n) const
{
// This is awesome. Awesomely slow.
size_t size_so_far = 0;
for (std::vector<PortVec>::const_iterator l = _ports.begin(); l != _ports.end(); ++l) {
- if (n < size_so_far + (*l).size())
+ if (n < size_so_far + l->size()) {
return (*l)[n - size_so_far];
- else
- size_so_far += (*l).size();
+ } else {
+ size_so_far += l->size();
+ }
}
- return NULL; // n out of range
+ return boost::shared_ptr<Port> (); // n out of range
}
-Port*
+boost::shared_ptr<Port>
PortSet::port(DataType type, size_t n) const
{
if (type == DataType::NIL) {
}
}
-AudioPort*
+boost::shared_ptr<AudioPort>
PortSet::nth_audio_port(size_t n) const
{
- return dynamic_cast<AudioPort*>(port(DataType::AUDIO, n));
+ return boost::dynamic_pointer_cast<AudioPort> (port (DataType::AUDIO, n));
}
-MidiPort*
+boost::shared_ptr<MidiPort>
PortSet::nth_midi_port(size_t n) const
{
- return dynamic_cast<MidiPort*>(port(DataType::MIDI, n));
+ return boost::dynamic_pointer_cast<MidiPort> (port (DataType::MIDI, n));
}
} // namepace ARDOUR
uint32_t limit = _master_out->n_outputs().n_total();
for (uint32_t n = 0; n < limit; ++n) {
- Port* p = _master_out->output()->nth (n);
+ boost::shared_ptr<Port> p = _master_out->output()->nth (n);
string connect_to;
if (outputs[p->type()].size() > n) {
connect_to = outputs[p->type()][n];
if (_master_out) {
for (uint32_t n = 0; n < limit; ++n) {
- AudioPort* p = _monitor_out->input()->ports().nth_audio_port (n);
- AudioPort* o = _master_out->output()->ports().nth_audio_port (n);
+ boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
+ boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
if (o) {
string connect_to = o->name();
for (uint32_t n = 0; n < limit; ++n) {
- Port* p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
+ boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
string connect_to;
if (outputs[DataType::AUDIO].size() > (n % mod)) {
connect_to = outputs[DataType::AUDIO][n % mod];