diff options
author | Carl Hetherington <carl@carlh.net> | 2011-10-28 17:04:09 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2011-10-28 17:04:09 +0000 |
commit | 7bdcc127e3e42bd76b997b56ecd938b1127d790b (patch) | |
tree | f1e9856094ee5a54cc28957508f2b693fbcd043a /libs/ardour/midi_diskstream.cc | |
parent | f65e3f287b48fef6d4fdb8c4456c0eada4c4431c (diff) |
Use shared_ptr for Port in the AudioEngine; improves thread-safety of the audio engine's port list as a writer cannot destroy a port in one thread while the port list is being iterated in another.
git-svn-id: svn://localhost/ardour2/branches/3.0@10327 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/midi_diskstream.cc')
-rw-r--r-- | libs/ardour/midi_diskstream.cc | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index d9e7c54f2d..901aefcf17 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -74,7 +74,6 @@ MidiDiskstream::MidiDiskstream (Session &sess, const string &name, Diskstream::F : 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) @@ -94,7 +93,6 @@ MidiDiskstream::MidiDiskstream (Session& sess, const XMLNode& node) : 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) @@ -171,7 +169,7 @@ MidiDiskstream::non_realtime_input_change () } if (ni == 0) { - _source_port = 0; + _source_port.reset (); } else { _source_port = _io->midi(0); } @@ -496,7 +494,9 @@ MidiDiskstream::process (framepos_t transport_frame, pframes_t nframes, bool& ne return 0; } - if (_source_port == 0) { + boost::shared_ptr<MidiPort> sp = _source_port.lock (); + + if (sp == 0) { return 1; } @@ -527,7 +527,7 @@ MidiDiskstream::process (framepos_t transport_frame, pframes_t nframes, bool& ne 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()); @@ -1196,8 +1196,10 @@ MidiDiskstream::engage_record_enable () 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 */ @@ -1372,8 +1374,11 @@ MidiDiskstream::allocate_temporary_buffers () 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 |