clean up that godawful programming style in the last transport commit, and fix dynamic range playback

git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6031 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2009-11-07 23:48:19 +00:00
parent c033e6f875
commit 5574b46de4
7 changed files with 58 additions and 60 deletions

View file

@ -1484,8 +1484,7 @@ ARDOUR_UI::transport_roll ()
return;
}
} else if (session->get_play_range ()) {
list<AudioRange> empty;
session->request_play_range (empty, false, true);
session->request_play_range (0, true);
}
if (!rolling) {
@ -1536,8 +1535,7 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode)
session->request_play_loop (false, true);
} else if (session->get_play_range ()) {
affect_transport = false;
list<AudioRange> empty;
session->request_play_range (empty, false, true);
session->request_play_range (0, true);
}
}

View file

@ -4657,6 +4657,11 @@ Editor::end_selection_op (ArdourCanvas::Item* item, GdkEvent* event)
}
}
/* XXX what if its a music time selection? */
if (session->get_play_range() && session->transport_rolling()) {
session->request_play_range (&selection->time, true);
}
stop_canvas_autoscroll ();
}

View file

@ -2428,7 +2428,7 @@ Editor::play_selection ()
return;
}
session->request_play_range (selection->time, true);
session->request_play_range (&selection->time, true);
}
void

View file

@ -926,14 +926,13 @@ class Session : public PBD::StatefulDestructible
/* ranges */
void request_play_range (list<AudioRange>&, bool yn, bool leave_rolling = false);
void request_play_range (list<AudioRange>*, bool leave_rolling = false);
bool get_play_range () const { return _play_range; }
/* favorite dirs */
typedef vector<string> FavoriteDirs;
static int read_favorite_dirs (FavoriteDirs&);
static int write_favorite_dirs (FavoriteDirs&);
/* file suffixes */
@ -1734,8 +1733,8 @@ class Session : public PBD::StatefulDestructible
list<AudioRange> current_audio_range;
bool _play_range;
void set_play_range (list<AudioRange>&, bool yn, bool leave_rolling);
void setup_auto_play (list<AudioRange>&);
void set_play_range (list<AudioRange>&, bool leave_rolling);
void unset_play_range ();
/* main outs */
uint32_t main_outs;

View file

@ -427,7 +427,7 @@ Session::process_event (Event* ev)
break;
case Event::SetPlayAudioRange:
set_play_range (ev->audio_range, ev->yes_or_no, (ev->speed == 1.0f));
set_play_range (ev->audio_range, (ev->speed == 1.0f));
break;
default:

View file

@ -140,10 +140,14 @@ Session::request_play_loop (bool yn, bool leave_rolling)
}
void
Session::request_play_range (list<AudioRange>& range, bool yn, bool leave_rolling)
Session::request_play_range (list<AudioRange>* range, bool leave_rolling)
{
Event* ev = new Event (Event::SetPlayAudioRange, Event::Add, Event::Immediate, 0, (leave_rolling ? 1.0 : 0.0), yn);
ev->audio_range = range;
Event* ev = new Event (Event::SetPlayAudioRange, Event::Add, Event::Immediate, 0, (leave_rolling ? 1.0 : 0.0));
if (range) {
ev->audio_range = *range;
} else {
ev->audio_range.clear ();
}
queue_event (ev);
}
@ -617,8 +621,7 @@ Session::set_play_loop (bool yn)
if (loc) {
list<AudioRange> empty;
set_play_range (empty, false, true);
unset_play_range ();
if (Config->get_seamless_loop()) {
// set all diskstreams to use internal looping
@ -1186,56 +1189,38 @@ Session::set_diskstream_speed (Diskstream* stream, float speed)
}
void
Session::set_play_range (list<AudioRange>& range, bool yn, bool leave_rolling)
Session::unset_play_range ()
{
/* Called from event-processing context */
if (yn) {
if (range.empty()) {
/* make it a no-op */
return;
}
/* cancel loop play */
unset_play_loop ();
}
_play_range = yn;
setup_auto_play (range);
if (!_play_range && !leave_rolling) {
/* stop transport */
Event* ev = new Event (Event::SetTransportSpeed, Event::Add, Event::Immediate, 0, 0.0f, false);
merge_event (ev);
}
TransportStateChange ();
}
void
Session::request_bounded_roll (nframes_t start, nframes_t end)
{
AudioRange ar (start, end, 0);
list<AudioRange> lar;
lar.push_back (ar);
request_play_range (lar, true, true);
}
void
Session::setup_auto_play (list<AudioRange>& range)
{
/* Called from event-processing context */
Event* ev;
_play_range = false;
_clear_event_type (Event::RangeStop);
_clear_event_type (Event::RangeLocate);
}
if (!_play_range) {
void
Session::set_play_range (list<AudioRange>& range, bool leave_rolling)
{
Event* ev;
/* Called from event-processing context */
unset_play_range ();
if (range.empty()) {
/* _play_range set to false in unset_play_range()
*/
if (!leave_rolling) {
/* stop transport */
Event* ev = new Event (Event::SetTransportSpeed, Event::Add, Event::Immediate, 0, 0.0f, false);
merge_event (ev);
}
return;
}
_play_range = true;
/* cancel loop play */
unset_play_loop ();
list<AudioRange>::size_type sz = range.size();
if (sz > 1) {
@ -1285,6 +1270,18 @@ Session::setup_auto_play (list<AudioRange>& range)
ev = new Event (Event::LocateRoll, Event::Add, Event::Immediate, range.front().start, 0.0f, false);
merge_event (ev);
TransportStateChange ();
}
void
Session::request_bounded_roll (nframes_t start, nframes_t end)
{
AudioRange ar (start, end, 0);
list<AudioRange> lar;
lar.push_back (ar);
request_play_range (&lar, true);
}
void

View file

@ -122,8 +122,7 @@ BasicUI::transport_play (bool from_last_start)
}
if (session->get_play_range ()) {
list<AudioRange> empty;
session->request_play_range (empty, false);
session->request_play_range (0);
}
if (from_last_start && rolling) {