Fix non-update of _transport_frame
[ardour.git] / libs / ardour / session_process.cc
1 /*
2     Copyright (C) 1999-2002 Paul Davis 
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include <cmath>
21 #include <cerrno>
22 #include <algorithm>
23 #include <unistd.h>
24
25 #include "pbd/error.h"
26
27 #include <glibmm/thread.h>
28
29 #include "ardour/ardour.h"
30 #include "ardour/session.h"
31 #include "ardour/timestamps.h"
32 #include "ardour/audio_diskstream.h"
33 #include "ardour/audioengine.h"
34 #include "ardour/slave.h"
35 #include "ardour/auditioner.h"
36 #include "ardour/cycles.h"
37 #include "ardour/cycle_timer.h"
38
39 #include "midi++/manager.h"
40
41 #include "i18n.h"
42
43 using namespace ARDOUR;
44 using namespace PBD;
45 using namespace std;
46
47 /** Called by the audio engine when there is work to be done with JACK.
48  * @param nframes Number of frames to process.
49  */
50 void
51 Session::process (nframes_t nframes)
52 {
53         // This is no more the appropriate place to call cycle
54         // start. cycle_start needs to be called at the Route::roll()
55         // where the signals which we want to mixdown have been calculated.
56         //
57         MIDI::Manager::instance()->cycle_start(nframes);
58
59         _silent = false;
60
61         if (processing_blocked()) {
62                 _silent = true;
63                 return;
64         }
65
66         if (non_realtime_work_pending()) {
67                 if (!transport_work_requested ()) {
68                         post_transport ();
69                 } 
70         } 
71
72         (this->*process_function) (nframes);
73         
74         // the ticker is for sending time information like MidiClock
75         nframes_t transport_frames = transport_frame();
76         BBT_Time  transport_bbt;
77         bbt_time(transport_frames, transport_bbt);
78         SMPTE::Time transport_smpte;
79         smpte_time(transport_frames, transport_smpte);
80         tick (transport_frames, transport_bbt, transport_smpte); /* EMIT SIGNAL */
81         
82         SendFeedback (); /* EMIT SIGNAL */
83         
84         MIDI::Manager::instance()->cycle_end();
85 }
86
87 void
88 Session::prepare_diskstreams ()
89 {
90         boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
91         for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
92                 (*i)->prepare ();
93         }
94 }
95
96 int
97 Session::fail_roll (nframes_t nframes)
98 {
99         return no_roll (nframes);
100 }
101
102 int
103 Session::no_roll (nframes_t nframes)
104 {
105         nframes_t end_frame = _transport_frame + nframes; // FIXME: varispeed + no_roll ??
106         int ret = 0;
107         bool declick = get_transport_declick_required();
108         boost::shared_ptr<RouteList> r = routes.reader ();
109
110         if (_click_io) {
111                 _click_io->silence (nframes);
112         }
113
114         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
115                 
116                 if ((*i)->is_hidden()) {
117                         continue;
118                 }
119                 
120                 (*i)->set_pending_declick (declick);
121                 
122                 if ((*i)->no_roll (nframes, _transport_frame, end_frame, non_realtime_work_pending(), 
123                                    actively_recording(), declick)) {
124                         error << string_compose(_("Session: error in no roll for %1"), (*i)->name()) << endmsg;
125                         ret = -1;
126                         break;
127                 }
128         }
129
130         return ret;
131 }
132
133 int
134 Session::process_routes (nframes_t nframes)
135 {
136         bool record_active;
137         int  declick = get_transport_declick_required();
138         bool rec_monitors = get_rec_monitors_input();
139         boost::shared_ptr<RouteList> r = routes.reader ();
140
141         if (transport_sub_state & StopPendingCapture) {
142                 /* force a declick out */
143                 declick = -1;
144         }
145
146         record_active = actively_recording(); // || (get_record_enabled() && get_punch_in());
147
148         const nframes_t start_frame = _transport_frame;
149         const nframes_t end_frame = _transport_frame + (nframes_t)floor(nframes * _transport_speed);
150
151         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
152
153                 int ret;
154
155                 if ((*i)->is_hidden()) {
156                         continue;
157                 }
158
159                 (*i)->set_pending_declick (declick);
160
161                 if ((ret = (*i)->roll (nframes, start_frame, end_frame, declick, record_active, rec_monitors)) < 0) {
162
163                         /* we have to do this here. Route::roll() for an AudioTrack will have called AudioDiskstream::process(),
164                            and the DS will expect AudioDiskstream::commit() to be called. but we're aborting from that
165                            call path, so make sure we release any outstanding locks here before we return failure.
166                         */
167
168                         boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
169                         for (DiskstreamList::iterator ids = dsl->begin(); ids != dsl->end(); ++ids) {
170                                 (*ids)->recover ();
171                         }
172
173                         stop_transport ();
174                         return -1;
175                 } 
176         }
177
178         return 0;
179 }
180
181 int
182 Session::silent_process_routes (nframes_t nframes)
183 {
184         bool record_active = actively_recording();
185         int  declick = get_transport_declick_required();
186         bool rec_monitors = get_rec_monitors_input();
187         boost::shared_ptr<RouteList> r = routes.reader ();
188
189         if (transport_sub_state & StopPendingCapture) {
190                 /* force a declick out */
191                 declick = -1;
192         }
193         
194         const nframes_t start_frame = _transport_frame;
195         const nframes_t end_frame = _transport_frame + lrintf(nframes * _transport_speed);
196
197         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
198
199                 int ret;
200
201                 if ((*i)->is_hidden()) {
202                         continue;
203                 }
204
205                 if ((ret = (*i)->silent_roll (nframes, start_frame, end_frame, record_active, rec_monitors)) < 0) {
206                         
207                         /* we have to do this here. Route::roll() for an AudioTrack will have called AudioDiskstream::process(),
208                            and the DS will expect AudioDiskstream::commit() to be called. but we're aborting from that
209                            call path, so make sure we release any outstanding locks here before we return failure.
210                         */
211
212                         boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
213                         for (DiskstreamList::iterator ids = dsl->begin(); ids != dsl->end(); ++ids) {
214                                 (*ids)->recover ();
215                         }
216
217                         stop_transport ();
218                         return -1;
219                 } 
220         }
221
222         return 0;
223 }
224
225 void
226 Session::commit_diskstreams (nframes_t nframes, bool &needs_butler)
227 {
228         int dret;
229         float pworst = 1.0f;
230         float cworst = 1.0f;
231
232         boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
233         for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
234
235                 if ((*i)->hidden()) {
236                         continue;
237                 }
238                 
239                 /* force all diskstreams not handled by a Route to call do their stuff.
240                    Note: the diskstreams that were handled by a route will just return zero
241                    from this call, because they know they were processed. So in fact, this
242                    also runs commit() for every diskstream.
243                  */
244
245                 if ((dret = (*i)->process (_transport_frame, nframes, actively_recording(), get_rec_monitors_input())) == 0) {
246                         if ((*i)->commit (nframes)) {
247                                 needs_butler = true;
248                         }
249
250                 } else if (dret < 0) {
251                         (*i)->recover();
252                 }
253                 
254                 pworst = min (pworst, (*i)->playback_buffer_load());
255                 cworst = min (cworst, (*i)->capture_buffer_load());
256         }
257
258         uint32_t pmin = g_atomic_int_get (&_playback_load);
259         uint32_t pminold = g_atomic_int_get (&_playback_load_min);
260         uint32_t cmin = g_atomic_int_get (&_capture_load);
261         uint32_t cminold = g_atomic_int_get (&_capture_load_min);
262
263         g_atomic_int_set (&_playback_load, (uint32_t) floor (pworst * 100.0f));
264         g_atomic_int_set (&_capture_load, (uint32_t) floor (cworst * 100.0f));
265         g_atomic_int_set (&_playback_load_min, min (pmin, pminold));
266         g_atomic_int_set (&_capture_load_min, min (cmin, cminold));
267
268         if (actively_recording()) {
269                 set_dirty();
270         }
271 }
272
273 /** Process callback used when the auditioner is not active */
274 void
275 Session::process_with_events (nframes_t nframes)
276 {
277         Event*         ev;
278         nframes_t      this_nframes;
279         nframes_t      end_frame;
280         bool           session_needs_butler = false;
281         nframes_t      stop_limit;
282         long           frames_moved;
283         
284         /* make sure the auditioner is silent */
285
286         if (auditioner) {
287                 auditioner->silence (nframes);
288         }
289
290         /* handle any pending events */
291
292         while (pending_events.read (&ev, 1) == 1) {
293                 merge_event (ev);
294         }
295
296         /* if we are not in the middle of a state change,
297            and there are immediate events queued up,
298            process them. 
299         */
300
301         while (!non_realtime_work_pending() && !immediate_events.empty()) {
302                 Event *ev = immediate_events.front ();
303                 immediate_events.pop_front ();
304                 process_event (ev);
305         }
306
307         /* Events caused a transport change, send an MTC Full Frame (SMPTE) message.
308          * This is sent whether rolling or not, to give slaves an idea of ardour time
309          * on locates (and allow slow slaves to position and prepare for rolling)
310          */
311         if (_send_smpte_update) {
312                 send_full_time_code(nframes);
313         }
314
315         if (!process_can_proceed()) {
316                 _silent = true;
317                 return;
318         }
319
320         if (events.empty() || next_event == events.end()) {
321                 process_without_events (nframes);
322                 return;
323         }
324
325         /// TODO: Figure out what happens to phi and phase, if transport speed momentarily becomes
326         /// 1.0 eg. during the adjustments of a slave. If that is a bug, then AudioDiskstream::process
327         /// is very likely broken too
328         if (_transport_speed == 1.0) {
329                 frames_moved = (long) nframes;
330         } else {                
331                 frames_moved = (long) AudioDiskstream::
332                         calculate_varispeed_playback_distance(nframes, phase, phi, target_phi); 
333         }
334
335         end_frame = _transport_frame + (nframes_t)frames_moved;
336
337         {
338                 Event* this_event;
339                 Events::iterator the_next_one;
340                 
341                 if (!process_can_proceed()) {
342                         _silent = true;
343                         return;
344                 }
345                 
346                 if (!_exporting && _slave) {
347                         if (!follow_slave (nframes)) {
348                                 return;
349                         }
350                 } 
351
352                 if (_transport_speed == 0) {
353                         no_roll (nframes);
354                         return;
355                 }
356         
357                 if (!_exporting) {
358                         send_midi_time_code_for_cycle (nframes);
359                 }
360
361                 if (actively_recording()) {
362                         stop_limit = max_frames;
363                 } else {
364
365                         if (Config->get_stop_at_session_end()) {
366                                 stop_limit = current_end_frame();
367                         } else {
368                                 stop_limit = max_frames;
369                         }
370                 }
371
372                 if (maybe_stop (stop_limit)) {
373                         no_roll (nframes);
374                         return;
375                 } 
376
377                 this_event = *next_event;
378                 the_next_one = next_event;
379                 ++the_next_one;
380
381                 /* yes folks, here it is, the actual loop where we really truly
382                    process some audio 
383                 */
384
385                 while (nframes) {
386
387                         this_nframes = nframes; /* real (jack) time relative */
388                         frames_moved = (long) floor (_transport_speed * nframes); /* transport relative */
389
390                         /* running an event, position transport precisely to its time */
391                         if (this_event && this_event->action_frame <= end_frame && this_event->action_frame >= _transport_frame) {
392                                 /* this isn't quite right for reverse play */
393                                 frames_moved = (long) (this_event->action_frame - _transport_frame);
394                                 this_nframes = (nframes_t) abs( floor(frames_moved / _transport_speed) );
395                         } 
396
397                         if (this_nframes) {
398                                 
399                                 click (_transport_frame, this_nframes);
400                                 
401                                 /* now process frames between now and the first event in this block */
402                                 prepare_diskstreams ();
403
404                                 if (process_routes (this_nframes)) {
405                                         fail_roll (nframes);
406                                         return;
407                                 }
408                                 
409                                 commit_diskstreams (this_nframes, session_needs_butler);
410
411                                 nframes -= this_nframes;
412                                 
413                                 if (frames_moved < 0) {
414                                         decrement_transport_position (-frames_moved);
415                                 } else {
416                                         increment_transport_position (frames_moved);
417                                 }
418
419                                 maybe_stop (stop_limit);
420                                 check_declick_out ();
421                         }
422
423                         _engine.split_cycle (this_nframes);
424                         
425                         /* now handle this event and all others scheduled for the same time */
426                         
427                         while (this_event && this_event->action_frame == _transport_frame) {
428                                 process_event (this_event);
429
430                                 if (the_next_one == events.end()) {
431                                         this_event = 0;
432                                 } else {
433                                         this_event = *the_next_one;
434                                         ++the_next_one;
435                                 }
436                         } 
437
438                         /* if an event left our state changing, do the right thing */
439
440                         if (nframes && non_realtime_work_pending()) {
441                                 no_roll (nframes);
442                                 break;
443                         }
444
445                         /* this is necessary to handle the case of seamless looping */
446                         end_frame = _transport_frame + (nframes_t) floor (nframes * _transport_speed);
447                         
448                 }
449
450                 set_next_event ();
451
452         } /* implicit release of route lock */
453
454         if (session_needs_butler)
455                 summon_butler ();
456 }
457
458 void
459 Session::reset_slave_state ()
460 {
461         average_slave_delta = 1800;
462         delta_accumulator_cnt = 0;
463         have_first_delta_accumulator = false;
464         slave_state = Stopped;
465 }
466
467 bool
468 Session::transport_locked () const
469 {
470         Slave* sl = _slave;
471
472         if (!locate_pending() && ((Config->get_slave_source() == None) || (sl && sl->ok() && sl->locked()))) {
473                 return true;
474         }
475
476         return false;
477 }
478
479 bool
480 Session::follow_slave (nframes_t nframes)
481 {
482         double slave_speed;
483         nframes_t slave_transport_frame;
484         nframes_t this_delta;
485         int dir;
486         bool starting;
487
488         if (!_slave->ok()) {
489                 stop_transport ();
490                 Config->set_slave_source (None);
491                 goto noroll;
492         }
493         
494         _slave->speed_and_position (slave_speed, slave_transport_frame);
495
496         if (!_slave->locked()) {
497                 goto noroll;
498         }
499
500         if (slave_transport_frame > _transport_frame) {
501                 this_delta = slave_transport_frame - _transport_frame;
502                 dir = 1;
503         } else {
504                 this_delta = _transport_frame - slave_transport_frame;
505                 dir = -1;
506         }
507
508         if ((starting = _slave->starting())) {
509                 slave_speed = 0.0f;
510         }
511
512         if (_slave->is_always_synced() || config.get_timecode_source_is_synced()) {
513
514                 /* if the TC source is synced, then we assume that its 
515                    speed is binary: 0.0 or 1.0
516                 */
517
518                 if (slave_speed != 0.0f) {
519                         slave_speed = 1.0f;
520                 } 
521
522         } else {
523
524                 /* TC source is able to drift relative to us (slave)
525                    so we need to keep track of the drift and adjust
526                    our speed to remain locked.
527                 */
528
529                 calculate_moving_average_of_slave_delta(dir, this_delta);
530         }
531         
532         track_slave_state(slave_speed, slave_transport_frame, this_delta, starting);
533
534         if (slave_state == Running && !_slave->is_always_synced() && !config.get_timecode_source_is_synced()) {
535
536                 if (_transport_speed != 0.0f) {
537                         
538                         /* 
539                            note that average_dir is +1 or -1 
540                         */
541                         
542                         float delta;
543
544                         #ifdef USE_MOVING_AVERAGE_OF_SLAVE
545                                 if (average_slave_delta == 0) {
546                                         delta = this_delta;
547                                         delta *= dir;
548                                 } else {
549                                         delta = average_slave_delta;
550                                         delta *= average_dir;
551                                 }
552                         #else
553                                 delta = this_delta;
554                                 delta *= dir;
555                         #endif
556
557                         float adjusted_speed = slave_speed + (delta /  float(_current_frame_rate));
558                         
559                         if (_slave->give_slave_full_control_over_transport_speed()) {
560                                 request_transport_speed(slave_speed);
561                         } else {
562                                 request_transport_speed(adjusted_speed);
563                                 #ifdef DEBUG_SLAVES
564                                 cerr << "adjust using " << delta
565                                          << " towards " << adjusted_speed
566                                          << " ratio = " << adjusted_speed / slave_speed
567                                          << " current = " << _transport_speed
568                                          << " slave @ " << slave_speed
569                                          << endl;
570                                 #endif
571                         }
572                         
573                         if (abs(average_slave_delta) > (long) _slave->resolution()) {
574                                 cerr << "average slave delta greater than slave resolution, going to silent motion\n";
575                                 goto silent_motion;
576                         }
577                 }
578         } 
579         
580         #ifdef DEBUG_SLAVES
581         if (slave_speed != 0.0)
582         cerr << "delta = " << (int) (dir * this_delta)
583                  << " speed = " << slave_speed 
584                  << " ts = " << _transport_speed 
585                  << " M@ "<< slave_transport_frame << " S@ " << _transport_frame 
586                  << " avgdelta = " << average_slave_delta 
587                  << endl;
588         #endif  
589
590         if (!starting && !non_realtime_work_pending()) {
591                 /* speed is set, we're locked, and good to go */
592                 return true;
593         }
594
595   silent_motion:
596         #ifdef DEBUG_SLAVES     
597         cerr << "reached silent_motion:" <<endl;
598         #endif
599         
600         follow_slave_silently (nframes, slave_speed);
601         
602   noroll:
603         /* don't move at all */
604         #ifdef DEBUG_SLAVES     
605         cerr << "reached no_roll:" <<endl;
606         #endif
607         no_roll (nframes);
608         return false;
609 }
610
611 void
612 Session::calculate_moving_average_of_slave_delta(int dir, nframes_t this_delta)
613 {
614         if (delta_accumulator_cnt >= delta_accumulator_size) {
615                 have_first_delta_accumulator = true;
616                 delta_accumulator_cnt = 0;
617         }
618
619         if (delta_accumulator_cnt != 0 || this_delta < _current_frame_rate) {
620                 delta_accumulator[delta_accumulator_cnt++] = long(dir) * long(this_delta);
621         }
622         
623         if (have_first_delta_accumulator) {
624                 average_slave_delta = 0L;
625                 for (int i = 0; i < delta_accumulator_size; ++i) {
626                         average_slave_delta += delta_accumulator[i];
627                 }
628                 average_slave_delta /= long(delta_accumulator_size);
629                 if (average_slave_delta < 0L) {
630                         average_dir = -1;
631                         average_slave_delta = abs(average_slave_delta);
632                 } else {
633                         average_dir = 1;
634                 }
635         }
636 }
637
638 void
639 Session::track_slave_state(
640                 float slave_speed, 
641                 nframes_t slave_transport_frame, 
642                 nframes_t this_delta,
643                 bool starting)
644 {
645         if (slave_speed != 0.0f) {
646
647                 /* slave is running */
648
649                 switch (slave_state) {
650                 case Stopped:
651                         if (_slave->requires_seekahead()) {
652                                 slave_wait_end = slave_transport_frame + _current_frame_rate;
653                                 locate (slave_wait_end, false, false);
654                                 slave_state = Waiting;
655                                 starting = true;
656
657                         } else {
658
659                                 slave_state = Running;
660
661                                 Location* al = _locations.auto_loop_location();
662
663                                 if (al && play_loop && (slave_transport_frame < al->start() || slave_transport_frame > al->end())) {
664                                         // cancel looping
665                                         request_play_loop(false);
666                                 }
667
668                                 if (slave_transport_frame != _transport_frame) {
669                                         locate (slave_transport_frame, false, false);
670                                 }
671                         }
672                         break;
673
674                 case Waiting:
675                         break;
676
677                 default:
678                         break;
679
680                 }
681
682                 if (slave_state == Waiting) {
683
684                 #ifdef DEBUG_SLAVES
685                         cerr << "waiting at " << slave_transport_frame << endl;
686                 #endif                  
687                         if (slave_transport_frame >= slave_wait_end) {
688 #ifdef DEBUG_SLAVES
689                                 cerr << "\tstart at " << _transport_frame << endl;
690 #endif
691                                 slave_state = Running;
692
693                                 bool ok = true;
694                                 nframes_t frame_delta = slave_transport_frame - _transport_frame;
695
696                                 boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
697                                 
698                                 for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
699                                         if (!(*i)->can_internal_playback_seek (frame_delta)) {
700                                                 ok = false;
701                                                 break;
702                                         }
703                                 }
704
705                                 if (ok) {
706                                         for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
707                                                 (*i)->internal_playback_seek (frame_delta);
708                                         }
709                                         _transport_frame += frame_delta;
710                                        
711                                 } else {
712                                         cerr << "cannot micro-seek\n";
713                                         /* XXX what? */
714                                 }
715
716                                 memset (delta_accumulator, 0, sizeof (long) * delta_accumulator_size);
717                                 average_slave_delta = 0L;
718                                 this_delta = 0;
719                         }
720                 }
721                 
722                 if (slave_state == Running && _transport_speed == 0.0f) {
723                         
724         #ifdef DEBUG_SLAVES
725                         cerr << "slave starts transport\n";
726         #endif
727                         start_transport ();
728                 } 
729
730         } else { // slave_speed is 0
731
732                 /* slave has stopped */
733
734                 if (_transport_speed != 0.0f) {
735
736          #ifdef DEBUG_SLAVES
737                         cerr << "slave stops transport: " << slave_speed << " frame: " << slave_transport_frame 
738                              << " tf = " << _transport_frame << endl;
739          #endif
740                         
741                         stop_transport();
742                 }
743
744                 if (slave_transport_frame != _transport_frame) {
745         #ifdef DEBUG_SLAVES                     
746                         cerr << "slave stopped, move to " << slave_transport_frame << endl;
747         #endif
748                         force_locate (slave_transport_frame, false);
749                 }
750
751                 slave_state = Stopped;
752         }
753 }
754
755 void
756 Session::follow_slave_silently (nframes_t nframes, float slave_speed)
757 {
758         if (slave_speed && _transport_speed) {
759
760                 /* something isn't right, but we should move with the master
761                    for now.
762                 */
763
764                 bool need_butler;
765                 
766                 prepare_diskstreams ();
767                 silent_process_routes (nframes);
768                 commit_diskstreams (nframes, need_butler);
769
770                 if (need_butler) {
771                         summon_butler ();
772                 }
773                 
774                 int32_t frames_moved = (int32_t) floor (_transport_speed * nframes);
775                 
776                 if (frames_moved < 0) {
777                         decrement_transport_position (-frames_moved);
778                 } else {
779                         increment_transport_position (frames_moved);
780                 }
781                 
782                 nframes_t stop_limit;
783                 
784                 if (actively_recording()) {
785                         stop_limit = max_frames;
786                 } else {
787                         if (Config->get_stop_at_session_end()) {
788                                 stop_limit = current_end_frame();
789                         } else {
790                                 stop_limit = max_frames;
791                         }
792                 }
793
794                 maybe_stop (stop_limit);
795         }
796 }
797
798 void
799 Session::process_without_events (nframes_t nframes)
800 {
801         bool session_needs_butler = false;
802         nframes_t stop_limit;
803         long frames_moved;
804
805         if (!process_can_proceed()) {
806                 _silent = true;
807                 return;
808         }
809
810         if (!_exporting && _slave) {
811                 if (!follow_slave (nframes)) {
812                         return;
813                 }
814         } 
815
816         if (_transport_speed == 0) {
817                 fail_roll (nframes);
818                 return;
819         }
820                 
821         if (!_exporting) {
822                 send_midi_time_code_for_cycle (nframes);
823         }
824
825         if (actively_recording()) {
826                 stop_limit = max_frames;
827         } else {
828                 if (Config->get_stop_at_session_end()) {
829                         stop_limit = current_end_frame();
830                 } else {
831                         stop_limit = max_frames;
832                 }
833         }
834                 
835         if (maybe_stop (stop_limit)) {
836                 fail_roll (nframes);
837                 return;
838         } 
839
840         if (maybe_sync_start (nframes)) {
841                 return;
842         }
843
844         click (_transport_frame, nframes);
845
846         prepare_diskstreams ();
847         
848         /// TODO: Figure out what happens to phi and phase, if transport speed momentarily becomes
849         /// 1.0 eg. during the adjustments of a slave. If that is a bug, then AudioDiskstream::process
850         /// is very likely broken too
851         if (_transport_speed == 1.0) {
852                 frames_moved = (long) nframes;
853         } else {                
854                 frames_moved = (long) AudioDiskstream::
855                         calculate_varispeed_playback_distance(nframes, phase, phi, target_phi); 
856         }
857
858         if (process_routes (nframes)) {
859                 fail_roll (nframes);
860                 return;
861         }
862
863         commit_diskstreams (nframes, session_needs_butler);
864
865         if (frames_moved < 0) {
866                 decrement_transport_position (-frames_moved);
867         } else {
868                 increment_transport_position (frames_moved);
869         }
870
871         maybe_stop (stop_limit);
872         check_declick_out ();
873
874         if (session_needs_butler)
875                 summon_butler ();
876 }
877
878 /** Process callback used when the auditioner is active.
879  * @param nframes number of frames to process.
880  */
881 void
882 Session::process_audition (nframes_t nframes)
883 {
884         Event* ev;
885         boost::shared_ptr<RouteList> r = routes.reader ();
886
887         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
888                 if (!(*i)->is_hidden()) {
889                         (*i)->silence (nframes);
890                 }
891         }
892
893         /* run the auditioner, and if it says we need butler service, ask for it */
894         
895         if (auditioner->play_audition (nframes) > 0) {
896                 summon_butler ();
897         } 
898
899         /* handle pending events */
900
901         while (pending_events.read (&ev, 1) == 1) {
902                 merge_event (ev);
903         }
904
905         /* if we are not in the middle of a state change,
906            and there are immediate events queued up,
907            process them. 
908         */
909
910         while (!non_realtime_work_pending() && !immediate_events.empty()) {
911                 Event *ev = immediate_events.front ();
912                 immediate_events.pop_front ();
913                 process_event (ev);
914         }
915
916         if (!auditioner->active()) {
917                 /* auditioner no longer active, so go back to the normal process callback */
918                 process_function = &Session::process_with_events;
919         }
920 }
921
922 bool
923 Session::maybe_sync_start (nframes_t& nframes)
924 {
925         nframes_t sync_offset;
926
927         if (!waiting_for_sync_offset) {
928                 return false;
929         }
930
931         if (_engine.get_sync_offset (sync_offset) && sync_offset < nframes) {
932
933                 /* generate silence up to the sync point, then
934                    adjust nframes + offset to reflect whatever
935                    is left to do.
936                 */
937
938                 no_roll (sync_offset);
939                 nframes -= sync_offset;
940                 Port::increment_port_offset (sync_offset);
941                 waiting_for_sync_offset = false;
942                 
943                 if (nframes == 0) {
944                         return true; // done, nothing left to process
945                 }
946                 
947         } else {
948
949                 /* sync offset point is not within this process()
950                    cycle, so just generate silence. and don't bother 
951                    with any fancy stuff here, just the minimal silence.
952                 */
953
954                 _silent = true;
955
956                 if (Config->get_locate_while_waiting_for_sync()) {
957                         if (micro_locate (nframes)) {
958                                 /* XXX ERROR !!! XXX */
959                         }
960                 }
961
962                 return true; // done, nothing left to process
963         }
964
965         return false;
966 }
967