X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession_events.cc;h=5fc8cd75353561f3e90aa002304f21fc8d1eee96;hb=22dc575e4cbc35a5d486d6f448332fb721865d57;hp=7e0b6fbef59c12baa2e24a6d0d485782f3b4ff48;hpb=27e00ec4e706ac1620a43c1fc1f27e25df546695;p=ardour.git diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc index 7e0b6fbef5..5fc8cd7535 100644 --- a/libs/ardour/session_events.cc +++ b/libs/ardour/session_events.cc @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include @@ -24,16 +23,16 @@ #include #include -#include +#include #include #include -#include +#include #include "i18n.h" using namespace ARDOUR; -//using namespace sigc; +using namespace PBD; MultiAllocSingleReleasePool Session::Event::pool ("event", sizeof (Session::Event), 512); @@ -42,6 +41,7 @@ static const char* event_names[] = { "SetDiskstreamSpeed", "Locate", "LocateRoll", + "LocateRollLocate", "SetLoop", "PunchIn", "PunchOut", @@ -59,21 +59,21 @@ static const char* event_names[] = { }; void -Session::add_event (jack_nframes_t frame, Event::Type type, jack_nframes_t target_frame) +Session::add_event (nframes_t frame, Event::Type type, nframes_t target_frame) { Event* ev = new Event (type, Event::Add, frame, target_frame, 0); queue_event (ev); } void -Session::remove_event (jack_nframes_t frame, Event::Type type) +Session::remove_event (nframes_t frame, Event::Type type) { Event* ev = new Event (type, Event::Remove, frame, 0, 0); queue_event (ev); } void -Session::replace_event (Event::Type type, jack_nframes_t frame, jack_nframes_t target) +Session::replace_event (Event::Type type, nframes_t frame, nframes_t target) { Event* ev = new Event (type, Event::Replace, frame, target, 0); queue_event (ev); @@ -305,16 +305,29 @@ Session::process_event (Event* ev) */ if (non_realtime_work_pending()) { - immediate_events.insert (immediate_events.end(), ev); - _remove_event (ev); - return; + + /* except locates, which we have the capability to handle */ + + if (ev->type != Event::Locate) { + immediate_events.insert (immediate_events.end(), ev); + _remove_event (ev); + return; + } } //printf("Processing event: %s\n", event_names[ev->type]); switch (ev->type) { case Event::SetLoop: - set_auto_loop (ev->yes_or_no); + set_play_loop (ev->yes_or_no); + break; + + case Event::AutoLoop: + if (play_loop) { + start_locate (ev->target_frame, true, false, Config->get_seamless_loop()); + } + remove = false; + del = false; break; case Event::Locate: @@ -339,13 +352,21 @@ Session::process_event (Event* ev) _send_smpte_update = true; break; + case Event::LocateRollLocate: + // locate is handled by ::request_roll_at_and_return() + _requested_return_frame = ev->target_frame; + cerr << "Set RRF " << ev->target_frame << endl; + request_locate (ev->target2_frame, true); + break; + + case Event::SetTransportSpeed: set_transport_speed (ev->speed, ev->yes_or_no); break; case Event::PunchIn: // cerr << "PunchIN at " << transport_frame() << endl; - if (punch_in && record_status() == Enabled) { + if (Config->get_punch_in() && record_status() == Enabled) { enable_record (); } remove = false; @@ -354,7 +375,7 @@ Session::process_event (Event* ev) case Event::PunchOut: // cerr << "PunchOUT at " << transport_frame() << endl; - if (punch_out) { + if (Config->get_punch_out()) { step_back_from_record (); } remove = false; @@ -384,28 +405,22 @@ Session::process_event (Event* ev) del = false; break; - case Event::AutoLoop: - if (auto_loop) { - start_locate (ev->target_frame, true, false, seamless_loop); - } - remove = false; - del = false; - break; - case Event::Overwrite: - overwrite_some_buffers (static_cast(ev->ptr)); + overwrite_some_buffers (static_cast(ev->ptr)); break; case Event::SetDiskstreamSpeed: - set_diskstream_speed (static_cast (ev->ptr), ev->speed); + set_diskstream_speed (static_cast (ev->ptr), ev->speed); break; case Event::SetSlaveSource: - set_slave_source (ev->slave, ev->target_frame); + set_slave_source (ev->slave); break; case Event::Audition: - set_audition (static_cast (ev->ptr)); + set_audition (ev->region); + // drop reference to region + ev->region.reset (); break; case Event::InputConfigurationChange: