SetSlaveSource,
Audition,
InputConfigurationChange,
- SetAudioRange,
- SetPlayRange,
+ SetPlayAudioRange,
/* only one of each of these events
can be queued at any one time
/* ranges */
- void set_audio_range (list<AudioRange>&);
- void set_music_range (list<MusicRange>&);
-
- void request_play_range (bool yn, bool leave_rolling = false);
+ void request_play_range (list<AudioRange>&, bool yn, bool leave_rolling = false);
bool get_play_range () const { return _play_range; }
/* favorite dirs */
list<AudioRange> current_audio_range;
bool _play_range;
- void set_play_range (bool yn, bool leave_rolling);
- void setup_auto_play ();
+ void set_play_range (list<AudioRange>&, bool yn, bool leave_rolling);
+ void setup_auto_play (list<AudioRange>&);
/* main outs */
uint32_t main_outs;
REGISTER_CLASS_ENUM (Session::Event, SetSlaveSource);
REGISTER_CLASS_ENUM (Session::Event, Audition);
REGISTER_CLASS_ENUM (Session::Event, InputConfigurationChange);
- REGISTER_CLASS_ENUM (Session::Event, SetAudioRange);
- REGISTER_CLASS_ENUM (Session::Event, SetPlayRange);
+ REGISTER_CLASS_ENUM (Session::Event, SetPlayAudioRange);
REGISTER_CLASS_ENUM (Session::Event, StopOnce);
REGISTER_CLASS_ENUM (Session::Event, AutoLoop);
REGISTER (_Session_Event_Type);
}
void
-Session::request_play_range (bool yn, bool leave_rolling)
+Session::request_play_range (list<AudioRange>& range, bool yn, bool leave_rolling)
{
- Event* ev = new Event (Event::SetPlayRange, Event::Add, Event::Immediate, 0, (leave_rolling ? 1.0 : 0.0), yn);
+ Event* ev = new Event (Event::SetPlayAudioRange, Event::Add, Event::Immediate, 0, (leave_rolling ? 1.0 : 0.0), yn);
+ ev->audio_range = range;
queue_event (ev);
}
if (loc) {
- set_play_range (false, true);
+ list<AudioRange> empty;
+ set_play_range (empty, false, true);
if (Config->get_seamless_loop()) {
// set all diskstreams to use internal looping
}
void
-Session::set_audio_range (list<AudioRange>& range)
-{
- Event *ev = new Event (Event::SetAudioRange, Event::Add, Event::Immediate, 0, 0.0f);
- ev->audio_range = range;
- queue_event (ev);
-}
-
-void
-Session::set_play_range (bool yn, bool leave_rolling)
+Session::set_play_range (list<AudioRange>& range, bool yn, bool leave_rolling)
{
/* 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 ();
+ setup_auto_play (range);
if (!_play_range && !leave_rolling) {
/* stop transport */
{
AudioRange ar (start, end, 0);
list<AudioRange> lar;
+
lar.push_back (ar);
- set_audio_range (lar);
- request_play_range (true, true);
+ request_play_range (lar, true, true);
}
void
-Session::setup_auto_play ()
+Session::setup_auto_play (list<AudioRange>& range)
{
/* Called from event-processing context */
return;
}
- list<AudioRange>::size_type sz = current_audio_range.size();
+ list<AudioRange>::size_type sz = range.size();
if (sz > 1) {
- list<AudioRange>::iterator i = current_audio_range.begin();
+ list<AudioRange>::iterator i = range.begin();
list<AudioRange>::iterator next;
- while (i != current_audio_range.end()) {
+ while (i != range.end()) {
next = i;
++next;
requested_frame = 0;
}
- if (next == current_audio_range.end()) {
+ if (next == range.end()) {
ev = new Event (Event::RangeStop, Event::Add, requested_frame, 0, 0.0f);
} else {
ev = new Event (Event::RangeLocate, Event::Add, requested_frame, (*next).start, 0.0f);
} else if (sz == 1) {
- ev = new Event (Event::RangeStop, Event::Add, current_audio_range.front().end, 0, 0.0f);
+ ev = new Event (Event::RangeStop, Event::Add, range.front().end, 0, 0.0f);
merge_event (ev);
}
+ /* save range so we can do auto-return etc. */
+
+ current_audio_range = range;
+
/* now start rolling at the right place */
- ev = new Event (Event::LocateRoll, Event::Add, Event::Immediate, current_audio_range.front().start, 0.0f, false);
+ ev = new Event (Event::LocateRoll, Event::Add, Event::Immediate, range.front().start, 0.0f, false);
merge_event (ev);
}