refactor SessionEvent and DiskIO so that we pass around boost::shared_ptr<Track> rather than Route

(this the raw pointers used inside SessionEvent)
This commit is contained in:
Paul Davis
2019-10-17 15:44:57 -06:00
parent 5b92ef4353
commit 2cf9ad8f8c
11 changed files with 47 additions and 37 deletions

View File

@@ -43,8 +43,7 @@ class AudioPlaylist;
class Location;
class MidiPlaylist;
class Playlist;
class Route;
class Route;
class Track;
class Session;
template<typename T> class MidiRingBuffer;
@@ -64,8 +63,8 @@ public:
DiskIOProcessor (Session&, const std::string& name, Flag f);
virtual ~DiskIOProcessor ();
void set_route (boost::shared_ptr<Route>);
void drop_route ();
void set_track (boost::shared_ptr<Track>);
void drop_track ();
static void set_buffering_parameters (BufferingPreset bp);
@@ -122,7 +121,7 @@ protected:
bool in_set_state;
samplepos_t playback_sample;
bool _need_butler;
boost::shared_ptr<Route> _route;
boost::shared_ptr<Track> _track;
void init ();

View File

@@ -32,6 +32,7 @@ namespace ARDOUR
class Playlist;
class AudioPlaylist;
class MidiPlaylist;
template<typename T> class MidiRingBuffer;
class LIBARDOUR_API DiskReader : public DiskIOProcessor

View File

@@ -130,6 +130,7 @@ public:
MonitorState get_auto_monitoring_state () const;
MidiBuffer const& immediate_event_buffer () const { return _immediate_event_buffer; }
MidiRingBuffer<samplepos_t>& immediate_events () { return _immediate_events; }
void set_input_active (bool);
bool input_active () const;

View File

@@ -456,7 +456,7 @@ public:
void allow_auto_play (bool yn);
void request_transport_speed (double speed, bool as_default = true, TransportRequestSource origin = TRS_UI);
void request_transport_speed_nonzero (double, bool as_default = true, TransportRequestSource origin = TRS_UI);
void request_overwrite_buffer (boost::shared_ptr<Route>);
void request_overwrite_buffer (boost::shared_ptr<Track>);
void adjust_playback_buffering();
void adjust_capture_buffering();
@@ -1685,7 +1685,7 @@ private:
void set_play_loop (bool yn, double speed);
void unset_play_loop ();
void overwrite_some_buffers (Track *);
void overwrite_some_buffers (boost::shared_ptr<Route>);
void flush_all_inserts ();
int micro_locate (samplecnt_t distance);

View File

@@ -37,6 +37,7 @@ namespace ARDOUR {
class TransportMaster;
class Region;
class Track;
class LIBARDOUR_API SessionEvent {
public:
@@ -80,12 +81,12 @@ public:
double speed;
union {
void* ptr;
bool yes_or_no;
samplepos_t target2_sample;
Route* route;
};
boost::shared_ptr<Track> track;
union {
bool second_yes_or_no;
double control_value;
@@ -113,8 +114,8 @@ public:
SessionEvent (Type t, Action a, samplepos_t when, samplepos_t where, double spd, bool yn = false, bool yn2 = false, bool yn3 = false);
void set_ptr (void* p) {
ptr = p;
void set_track (boost::shared_ptr<Track> t) {
track = t;
}
bool before (const SessionEvent& other) const {

View File

@@ -35,6 +35,7 @@
#include "ardour/rc_configuration.h"
#include "ardour/session.h"
#include "ardour/session_playlists.h"
#include "ardour/track.h"
#include "pbd/i18n.h"
@@ -343,18 +344,18 @@ DiskIOProcessor::ChannelInfo::~ChannelInfo ()
}
void
DiskIOProcessor::drop_route ()
DiskIOProcessor::drop_track ()
{
_route.reset ();
_track.reset ();
}
void
DiskIOProcessor::set_route (boost::shared_ptr<Route> r)
DiskIOProcessor::set_track (boost::shared_ptr<Track> t)
{
_route = r;
_track = t;
if (_route) {
_route->DropReferences.connect_same_thread (*this, boost::bind (&DiskIOProcessor::drop_route, this));
if (_track) {
_track->DropReferences.connect_same_thread (*this, boost::bind (&DiskIOProcessor::drop_track, this));
}
}

View File

@@ -213,7 +213,7 @@ void
DiskReader::playlist_modified ()
{
if (!overwrite_queued) {
_session.request_overwrite_buffer (_route);
_session.request_overwrite_buffer (_track);
overwrite_queued = true;
}
}
@@ -237,7 +237,7 @@ DiskReader::use_playlist (DataType dt, boost::shared_ptr<Playlist> playlist)
*/
if (!overwrite_queued && (prior_playlist || _session.loading())) {
_session.request_overwrite_buffer (_route);
_session.request_overwrite_buffer (_track);
overwrite_queued = true;
}
@@ -252,7 +252,7 @@ DiskReader::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
boost::shared_ptr<ChannelList> c = channels.reader();
ChannelList::iterator chan;
sampleoffset_t disk_samples_to_consume;
MonitorState ms = _route->monitoring_state ();
MonitorState ms = _track->monitoring_state ();
if (_active) {
if (!_pending_active) {
@@ -467,6 +467,12 @@ DiskReader::set_pending_overwrite ()
for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
(*chan)->rbuf->read_flush ();
}
boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (_track);
if (mt) {
resolve_tracker (mt->immediate_events(), _session.audible_sample());
}
g_atomic_int_set (&_pending_overwrite, 1);
}
@@ -976,7 +982,7 @@ DiskReader::playlist_ranges_moved (list< Evoral::RangeMove<samplepos_t> > const
return;
}
if (!_route || Config->get_automation_follows_regions () == false) {
if (!_track || Config->get_automation_follows_regions () == false) {
return;
}
@@ -990,7 +996,7 @@ DiskReader::playlist_ranges_moved (list< Evoral::RangeMove<samplepos_t> > const
}
/* move panner automation */
boost::shared_ptr<Pannable> pannable = _route->pannable();
boost::shared_ptr<Pannable> pannable = _track->pannable();
Evoral::ControlSet::Controls& c (pannable->controls());
for (Evoral::ControlSet::Controls::iterator ci = c.begin(); ci != c.end(); ++ci) {
@@ -1010,7 +1016,7 @@ DiskReader::playlist_ranges_moved (list< Evoral::RangeMove<samplepos_t> > const
}
}
/* move processor automation */
_route->foreach_processor (boost::bind (&DiskReader::move_processor_automation, this, _1, movements_samples));
_track->foreach_processor (boost::bind (&DiskReader::move_processor_automation, this, _1, movements_samples));
}
void

View File

@@ -519,7 +519,7 @@ DiskWriter::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
// Pump entire port buffer into the ring buffer (TODO: split cycles?)
MidiBuffer& buf = bufs.get_midi (0);
boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack>(_route);
boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack>(_track);
MidiChannelFilter* filter = mt ? &mt->capture_filter() : 0;
assert (buf.size() == 0 || _midi_buf);
@@ -1294,9 +1294,9 @@ DiskWriter::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abo
_last_capture_sources.insert (_last_capture_sources.end(), midi_srcs.begin(), midi_srcs.end());
if (_route) {
_route->use_captured_sources (audio_srcs, capture_info);
_route->use_captured_sources (midi_srcs, capture_info);
if (_track) {
_track->use_captured_sources (audio_srcs, capture_info);
_track->use_captured_sources (midi_srcs, capture_info);
}
mark_write_completed = true;

View File

@@ -74,28 +74,29 @@ Session::schedule_capture_buffering_adjustment ()
}
void
Session::request_overwrite_buffer (boost::shared_ptr<Route> r)
Session::request_overwrite_buffer (boost::shared_ptr<Track> t)
{
boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (r);
if (!t) {
return;
}
SessionEvent *ev = new SessionEvent (SessionEvent::Overwrite, SessionEvent::Add, SessionEvent::Immediate, 0, 0, 0.0);
ev->set_ptr (t.get());
ev->set_track (t);
queue_event (ev);
}
/** Process thread. */
void
Session::overwrite_some_buffers (Track* t)
Session::overwrite_some_buffers (boost::shared_ptr<Route> r)
{
if (actively_recording()) {
return;
}
if (t) {
if (r) {
boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (r);
assert (t);
t->set_pending_overwrite ();
} else {

View File

@@ -927,7 +927,7 @@ Session::process_event (SessionEvent* ev)
break;
case SessionEvent::Overwrite:
overwrite_some_buffers (static_cast<Track*>(ev->ptr));
overwrite_some_buffers (ev->track);
break;
case SessionEvent::Audition:

View File

@@ -73,12 +73,12 @@ Track::~Track ()
DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
if (_disk_reader) {
_disk_reader->set_route (boost::shared_ptr<Route>());
_disk_reader->set_track (boost::shared_ptr<Track>());
_disk_reader.reset ();
}
if (_disk_writer) {
_disk_writer->set_route (boost::shared_ptr<Route>());
_disk_writer->set_track (boost::shared_ptr<Track>());
_disk_writer.reset ();
}
}
@@ -98,12 +98,12 @@ Track::init ()
_disk_reader.reset (new DiskReader (_session, name(), dflags));
_disk_reader->set_block_size (_session.get_block_size ());
_disk_reader->set_route (boost::dynamic_pointer_cast<Route> (shared_from_this()));
_disk_reader->set_track (boost::dynamic_pointer_cast<Track> (shared_from_this()));
_disk_reader->set_owner (this);
_disk_writer.reset (new DiskWriter (_session, name(), dflags));
_disk_writer->set_block_size (_session.get_block_size ());
_disk_writer->set_route (boost::dynamic_pointer_cast<Route> (shared_from_this()));
_disk_writer->set_track (boost::dynamic_pointer_cast<Track> (shared_from_this()));
_disk_writer->set_owner (this);
set_align_choice_from_io ();