X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession_events.cc;h=58702c133b9aedf37f7e9baed4307d614850b0ef;hb=c033e6f87525b6e0e405b672cf288cf1627bca87;hp=e918e0383f56897e10c5634ab1e2be0965668e7e;hpb=912da52a539981193941d8739fa6f103b5e406db;p=ardour.git diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc index e918e0383f..58702c133b 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 @@ -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,14 +305,27 @@ 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; + } } 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: @@ -323,6 +336,7 @@ Session::process_event (Event* ev) // cerr << "soft locate to " << ev->target_frame << endl; start_locate (ev->target_frame, false, true, false); } + _send_smpte_update = true; break; case Event::LocateRoll: @@ -333,15 +347,24 @@ Session::process_event (Event* ev) // cerr << "soft locate to+roll " << ev->target_frame << endl; start_locate (ev->target_frame, true, true, false); } + _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); + set_transport_speed (ev->speed, ev->yes_or_no, ev->second_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; @@ -350,7 +373,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; @@ -359,7 +382,7 @@ Session::process_event (Event* ev) case Event::StopOnce: if (!non_realtime_work_pending()) { - stop_transport (ev->yes_or_no); + set_transport_speed (0.0, ev->yes_or_no, ev->second_yes_or_no); _clear_event_type (Event::StopOnce); } remove = false; @@ -380,14 +403,6 @@ 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)); break; @@ -397,11 +412,13 @@ Session::process_event (Event* ev) 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: @@ -409,13 +426,8 @@ Session::process_event (Event* ev) schedule_butler_transport_work (); break; - case Event::SetAudioRange: - current_audio_range = ev->audio_range; - setup_auto_play (); - break; - - case Event::SetPlayRange: - set_play_range (ev->yes_or_no); + case Event::SetPlayAudioRange: + set_play_range (ev->audio_range, ev->yes_or_no, (ev->speed == 1.0f)); break; default: