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:
@@ -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 ();
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ namespace ARDOUR
|
||||
class Playlist;
|
||||
class AudioPlaylist;
|
||||
class MidiPlaylist;
|
||||
|
||||
template<typename T> class MidiRingBuffer;
|
||||
|
||||
class LIBARDOUR_API DiskReader : public DiskIOProcessor
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
Reference in New Issue
Block a user