Remove beat entry from meter dialog (beats are not allowed in API), clean up some...
[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 "i18n.h"
40
41 using namespace ARDOUR;
42 using namespace PBD;
43 using namespace std;
44
45 void
46 Session::process (nframes_t nframes)
47 {
48         _silent = false;
49
50         if (synced_to_jack() && waiting_to_start) {
51                 if ( _engine.transport_state() == AudioEngine::TransportRolling) {
52                         actually_start_transport ();
53                 }
54         }
55
56         if (non_realtime_work_pending()) {
57                 if (!transport_work_requested ()) {
58                         post_transport ();
59                 } 
60         } 
61         
62         (this->*process_function) (nframes);
63
64         SendFeedback (); /* EMIT SIGNAL */
65 }
66
67 void
68 Session::prepare_diskstreams ()
69 {
70         boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
71         for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
72                 (*i)->prepare ();
73         }
74 }
75
76 int
77 Session::no_roll (nframes_t nframes, nframes_t offset)
78 {
79         nframes_t end_frame = _transport_frame + nframes;
80         int ret = 0;
81         bool declick = get_transport_declick_required();
82         boost::shared_ptr<RouteList> r = routes.reader ();
83
84         if (_click_io) {
85                 _click_io->silence (nframes, offset);
86         }
87
88         if (g_atomic_int_get (&processing_prohibited)) {
89                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
90                         (*i)->silence (nframes, offset);
91                 }
92                 return 0;
93         }
94
95         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
96                 
97                 if ((*i)->hidden()) {
98                         continue;
99                 }
100                 
101                 (*i)->set_pending_declick (declick);
102                 
103                 if ((*i)->no_roll (nframes, _transport_frame, end_frame, offset, non_realtime_work_pending(), 
104                                    actively_recording(), declick)) {
105                         error << string_compose(_("Session: error in no roll for %1"), (*i)->name()) << endmsg;
106                         ret = -1;
107                         break;
108                 }
109         }
110
111         return ret;
112 }
113
114 int
115 Session::process_routes (nframes_t nframes, nframes_t offset)
116 {
117         bool record_active;
118         int  declick = get_transport_declick_required();
119         bool rec_monitors = get_rec_monitors_input();
120         boost::shared_ptr<RouteList> r = routes.reader ();
121
122         if (transport_sub_state & StopPendingCapture) {
123                 /* force a declick out */
124                 declick = -1;
125         }
126
127         record_active = actively_recording(); // || (get_record_enabled() && get_punch_in());
128
129         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
130
131                 int ret;
132
133                 if ((*i)->hidden()) {
134                         continue;
135                 }
136
137                 (*i)->set_pending_declick (declick);
138
139                 if ((ret = (*i)->roll (nframes, _transport_frame, _transport_frame + nframes, offset, declick, record_active, rec_monitors)) < 0) {
140
141                         /* we have to do this here. Route::roll() for an AudioTrack will have called AudioDiskstream::process(),
142                            and the DS will expect AudioDiskstream::commit() to be called. but we're aborting from that
143                            call path, so make sure we release any outstanding locks here before we return failure.
144                         */
145
146                         boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
147                         for (DiskstreamList::iterator ids = dsl->begin(); ids != dsl->end(); ++ids) {
148                                 (*ids)->recover ();
149                         }
150
151                         stop_transport ();
152                         return -1;
153                 } 
154         }
155
156         return 0;
157 }
158
159 int
160 Session::silent_process_routes (nframes_t nframes, nframes_t offset)
161 {
162         bool record_active = actively_recording();
163         int  declick = get_transport_declick_required();
164         bool rec_monitors = get_rec_monitors_input();
165         boost::shared_ptr<RouteList> r = routes.reader ();
166
167         if (transport_sub_state & StopPendingCapture) {
168                 /* force a declick out */
169                 declick = -1;
170         }
171
172         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
173
174                 int ret;
175
176                 if ((*i)->hidden()) {
177                         continue;
178                 }
179
180                 if ((ret = (*i)->silent_roll (nframes, _transport_frame, _transport_frame + nframes, offset, record_active, rec_monitors)) < 0) {
181                         
182                         /* we have to do this here. Route::roll() for an AudioTrack will have called AudioDiskstream::process(),
183                            and the DS will expect AudioDiskstream::commit() to be called. but we're aborting from that
184                            call path, so make sure we release any outstanding locks here before we return failure.
185                         */
186
187                         boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
188                         for (DiskstreamList::iterator ids = dsl->begin(); ids != dsl->end(); ++ids) {
189                                 (*ids)->recover ();
190                         }
191
192                         stop_transport ();
193                         return -1;
194                 } 
195         }
196
197         return 0;
198 }
199
200 void
201 Session::commit_diskstreams (nframes_t nframes, bool &needs_butler)
202 {
203         int dret;
204         float pworst = 1.0f;
205         float cworst = 1.0f;
206
207         boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
208         for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
209
210                 if ((*i)->hidden()) {
211                         continue;
212                 }
213                 
214                 /* force all diskstreams not handled by a Route to call do their stuff.
215                    Note: the diskstreams that were handled by a route will just return zero
216                    from this call, because they know they were processed. So in fact, this
217                    also runs commit() for every diskstream.
218                  */
219
220                 if ((dret = (*i)->process (_transport_frame, nframes, 0, actively_recording(), get_rec_monitors_input())) == 0) {
221                         if ((*i)->commit (nframes)) {
222                                 needs_butler = true;
223                         }
224
225                 } else if (dret < 0) {
226                         (*i)->recover();
227                 }
228                 
229                 pworst = min (pworst, (*i)->playback_buffer_load());
230                 cworst = min (cworst, (*i)->capture_buffer_load());
231         }
232
233         uint32_t pmin = g_atomic_int_get (&_playback_load);
234         uint32_t pminold = g_atomic_int_get (&_playback_load_min);
235         uint32_t cmin = g_atomic_int_get (&_capture_load);
236         uint32_t cminold = g_atomic_int_get (&_capture_load_min);
237
238         g_atomic_int_set (&_playback_load, (uint32_t) floor (pworst * 100.0f));
239         g_atomic_int_set (&_capture_load, (uint32_t) floor (cworst * 100.0f));
240         g_atomic_int_set (&_playback_load_min, min (pmin, pminold));
241         g_atomic_int_set (&_capture_load_min, min (cmin, cminold));
242
243         if (actively_recording()) {
244                 set_dirty();
245         }
246 }
247
248 void
249 Session::process_with_events (nframes_t nframes)
250 {
251         Event* ev;
252         nframes_t this_nframes;
253         nframes_t end_frame;
254         nframes_t offset;
255         bool session_needs_butler = false;
256         nframes_t stop_limit;
257         long           frames_moved;
258         
259         /* make sure the auditioner is silent */
260
261         if (auditioner) {
262                 auditioner->silence (nframes, 0);
263         }
264
265         /* handle any pending events */
266
267         while (pending_events.read (&ev, 1) == 1) {
268                 merge_event (ev);
269         }
270
271         /* if we are not in the middle of a state change,
272            and there are immediate events queued up,
273            process them. 
274         */
275
276         while (!non_realtime_work_pending() && !immediate_events.empty()) {
277                 Event *ev = immediate_events.front ();
278                 immediate_events.pop_front ();
279                 process_event (ev);
280         }
281
282         if (!process_can_proceed()) {
283                 _silent = true;
284                 return;
285         }
286                 
287         if (events.empty() || next_event == events.end()) {
288                 process_without_events (nframes);
289                 return;
290         }
291
292         end_frame = _transport_frame + (nframes_t)abs(floor(nframes * _transport_speed));
293
294         {
295                 Event* this_event;
296                 Events::iterator the_next_one;
297                 
298                 if (!process_can_proceed()) {
299                         _silent = true;
300                         return;
301                 }
302                 
303                 if (!_exporting && _slave) {
304                         if (!follow_slave (nframes, 0)) {
305                                 return;
306                         }
307                 } 
308
309                 if (_transport_speed == 0) {
310                         no_roll (nframes, 0);
311                         return;
312                 }
313
314                 if (actively_recording()) {
315                         stop_limit = max_frames;
316                 } else {
317
318                         if (Config->get_stop_at_session_end()) {
319                                 stop_limit = current_end_frame();
320                         } else {
321                                 stop_limit = max_frames;
322                         }
323                 }
324
325                 if (maybe_stop (stop_limit)) {
326                         no_roll (nframes, 0);
327                         return;
328                 } 
329
330                 this_event = *next_event;
331                 the_next_one = next_event;
332                 ++the_next_one;
333
334                 offset = 0;
335
336                 while (nframes) {
337
338                         this_nframes = nframes; /* real (jack) time relative */
339                         frames_moved = (long) floor (_transport_speed * nframes); /* transport relative */
340
341                         /* running an event, position transport precisely to its time */
342                         if (this_event && this_event->action_frame <= end_frame && this_event->action_frame >= _transport_frame) {
343                                 /* this isn't quite right for reverse play */
344                                 frames_moved = (long) (this_event->action_frame - _transport_frame);
345                                 this_nframes = (nframes_t) abs( floor(frames_moved / _transport_speed) );
346                         } 
347
348                         if (this_nframes) {
349                                 
350                                 click (_transport_frame, nframes, offset);
351                                 
352                                 /* now process frames between now and the first event in this block */
353                                 prepare_diskstreams ();
354
355                                 if (process_routes (this_nframes, offset)) {
356                                         no_roll (nframes, 0);
357                                         return;
358                                 }
359                                 
360                                 commit_diskstreams (this_nframes, session_needs_butler);
361
362                                 nframes -= this_nframes;
363                                 offset += this_nframes;
364                                 
365                                 if (frames_moved < 0) {
366                                         decrement_transport_position (-frames_moved);
367                                 } else {
368                                         increment_transport_position (frames_moved);
369                                 }
370
371                                 maybe_stop (stop_limit);
372                                 check_declick_out ();
373                         }
374
375                         /* now handle this event and all others scheduled for the same time */
376                         
377                         while (this_event && this_event->action_frame == _transport_frame) {
378                                 process_event (this_event);
379
380                                 if (the_next_one == events.end()) {
381                                         this_event = 0;
382                                 } else {
383                                         this_event = *the_next_one;
384                                         ++the_next_one;
385                                 }
386                         } 
387
388                         /* if an event left our state changing, do the right thing */
389
390                         if (non_realtime_work_pending()) {
391                                 no_roll (nframes, offset);
392                                 break;
393                         }
394
395                         /* this is necessary to handle the case of seamless looping */
396                         end_frame = _transport_frame + (nframes_t) floor (nframes * _transport_speed);
397                         
398                 }
399
400                 set_next_event ();
401
402         } /* implicit release of route lock */
403
404
405         if (session_needs_butler) {
406                 summon_butler ();
407         } 
408         
409         if (!_engine.freewheeling() && session_send_mtc) {
410                 send_midi_time_code_in_another_thread ();
411         }
412
413         return;
414 }               
415
416 void
417 Session::reset_slave_state ()
418 {
419         average_slave_delta = 1800;
420         delta_accumulator_cnt = 0;
421         have_first_delta_accumulator = false;
422         slave_state = Stopped;
423 }
424
425 bool
426 Session::transport_locked () const
427 {
428         Slave* sl = _slave;
429
430         if (!locate_pending() && ((Config->get_slave_source() == None) || (sl && sl->ok() && sl->locked()))) {
431                 return true;
432         }
433
434         return false;
435 }
436
437 bool
438 Session::follow_slave (nframes_t nframes, nframes_t offset)
439 {
440         float slave_speed;
441         nframes_t slave_transport_frame;
442         nframes_t this_delta;
443         int dir;
444         bool starting;
445
446         if (!_slave->ok()) {
447                 stop_transport ();
448                 Config->set_slave_source (None);
449                 goto noroll;
450         }
451         
452         _slave->speed_and_position (slave_speed, slave_transport_frame);
453
454         if (!_slave->locked()) {
455                 cerr << "Slave not locked, not rolling\n";
456                 goto noroll;
457         }
458
459         if (slave_transport_frame > _transport_frame) {
460                 this_delta = slave_transport_frame - _transport_frame;
461                 dir = 1;
462         } else {
463                 this_delta = _transport_frame - slave_transport_frame;
464                 dir = -1;
465         }
466
467         if ((starting = _slave->starting())) {
468                 slave_speed = 0.0f;
469         }
470
471 #if 0
472         cerr << "delta = " << (int) (dir * this_delta)
473              << " speed = " << slave_speed 
474              << " ts = " << _transport_speed 
475              << " M@ "<< slave_transport_frame << " S@ " << _transport_frame 
476              << " avgdelta = " << average_slave_delta 
477              << endl;
478 #endif  
479
480         if (_slave->is_always_synced() || Config->get_timecode_source_is_synced()) {
481
482                 /* if the TC source is synced, then we assume that its 
483                    speed is binary: 0.0 or 1.0
484                 */
485
486                 if (slave_speed != 0.0f) {
487                         slave_speed = 1.0f;
488                 } 
489
490         } else {
491
492                 /* TC source is able to drift relative to us (slave)
493                    so we need to keep track of the drift and adjust
494                    our speed to remain locked.
495                 */
496
497                 if (delta_accumulator_cnt >= delta_accumulator_size) {
498                         have_first_delta_accumulator = true;
499                         delta_accumulator_cnt = 0;
500                 }
501
502                 if (delta_accumulator_cnt != 0 || this_delta < _current_frame_rate) {
503                         delta_accumulator[delta_accumulator_cnt++] = dir*this_delta;
504                 }
505                 
506                 if (have_first_delta_accumulator) {
507                         average_slave_delta = 0;
508                         for (int i = 0; i < delta_accumulator_size; ++i) {
509                                 average_slave_delta += delta_accumulator[i];
510                         }
511                         average_slave_delta /= delta_accumulator_size;
512                         if (average_slave_delta < 0) {
513                                 average_dir = -1;
514                                 average_slave_delta = -average_slave_delta;
515                         } else {
516                                 average_dir = 1;
517                         }
518                         // cerr << "avgdelta = " << average_slave_delta*average_dir << endl;
519                 }
520         }
521
522         if (slave_speed != 0.0f) {
523
524                 /* slave is running */
525
526                 switch (slave_state) {
527                 case Stopped:
528                         if (_slave->requires_seekahead()) {
529                                 slave_wait_end = slave_transport_frame + _current_frame_rate;
530                                 locate (slave_wait_end, false, false);
531                                 slave_state = Waiting;
532                                 starting = true;
533
534                         } else {
535
536                                 slave_state = Running;
537
538                                 Location* al = _locations.auto_loop_location();
539
540                                 if (al && play_loop && (slave_transport_frame < al->start() || slave_transport_frame > al->end())) {
541                                         // cancel looping
542                                         request_play_loop(false);
543                                 }
544
545                                 if (slave_transport_frame != _transport_frame) {
546                                         locate (slave_transport_frame, false, false);
547                                 }
548                         }
549                         break;
550
551                 case Waiting:
552                         break;
553
554                 default:
555                         break;
556
557                 }
558
559                 if (slave_state == Waiting) {
560
561                         // cerr << "waiting at " << slave_transport_frame << endl;
562                         
563                         if (slave_transport_frame >= slave_wait_end) {
564                                 // cerr << "\tstart at " << _transport_frame << endl;
565
566                                 slave_state = Running;
567
568                                 bool ok = true;
569                                 nframes_t frame_delta = slave_transport_frame - _transport_frame;
570
571                                 boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
572                                 
573                                 for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
574                                         if (!(*i)->can_internal_playback_seek (frame_delta)) {
575                                                 ok = false;
576                                                 break;
577                                         }
578                                 }
579
580                                 if (ok) {
581                                         for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
582                                                 (*i)->internal_playback_seek (frame_delta);
583                                         }
584                                         _transport_frame += frame_delta;
585                                        
586                                 } else {
587                                         // cerr << "cannot micro-seek\n";
588                                         /* XXX what? */
589                                 }
590
591                                 memset (delta_accumulator, 0, sizeof (nframes_t) * delta_accumulator_size);
592                                 average_slave_delta = 0;
593                                 this_delta = 0;
594                         }
595                 }
596                 
597                 if (slave_state == Running && _transport_speed == 0.0f) {
598                         
599                         // cerr << "slave starts transport\n";
600                         
601                         start_transport ();
602                 } 
603
604         } else {
605
606                 /* slave has stopped */
607
608                 if (_transport_speed != 0.0f) {
609
610                         // cerr << "slave stops transport: " << slave_speed << " frame: " << slave_transport_frame 
611                         // << " tf = " << _transport_frame
612                         // << endl;
613                         
614                         if (Config->get_slave_source() == JACK) {
615                                 last_stop_frame = _transport_frame;
616                         }
617
618                         stop_transport();
619                 }
620
621                 if (slave_transport_frame != _transport_frame) {
622                         // cerr << "slave stopped, move to " << slave_transport_frame << endl;
623                         force_locate (slave_transport_frame, false);
624                 }
625
626                 slave_state = Stopped;
627         }
628
629         if (slave_state == Running && !_slave->is_always_synced() && !Config->get_timecode_source_is_synced()) {
630
631
632                 if (_transport_speed != 0.0f) {
633                         
634                         /* 
635                            note that average_dir is +1 or -1 
636                         */
637                         
638                         const float adjust_seconds = 1.0f;
639                         float delta;
640
641                         //if (average_slave_delta == 0) {
642                                 delta = this_delta;
643                                 delta *= dir;
644 //                      } else {
645 //                              delta = average_slave_delta;
646 //                              delta *= average_dir;
647 //                      }
648
649                         float adjusted_speed = slave_speed +
650                                 (delta / (adjust_seconds * _current_frame_rate));
651                         
652                         // cerr << "adjust using " << delta
653                         // << " towards " << adjusted_speed
654                         // << " ratio = " << adjusted_speed / slave_speed
655                         // << " current = " << _transport_speed
656                         // << " slave @ " << slave_speed
657                         // << endl;
658                         
659                         request_transport_speed (adjusted_speed);
660                         
661 #if 1
662                         if ((nframes_t) average_slave_delta > _slave->resolution()) {
663                                 // cerr << "not locked\n";
664                                 goto silent_motion;
665                         }
666 #endif
667                 }
668         } 
669
670         if (!starting && !non_realtime_work_pending()) {
671                 /* speed is set, we're locked, and good to go */
672                 return true;
673         }
674
675   silent_motion:
676
677         if (slave_speed && _transport_speed) {
678
679                 /* something isn't right, but we should move with the master
680                    for now.
681                 */
682
683                 bool need_butler;
684                 
685                 prepare_diskstreams ();
686                 silent_process_routes (nframes, offset);
687                 commit_diskstreams (nframes, need_butler);
688
689                 if (need_butler) {
690                         summon_butler ();
691                 }
692                 
693                 int32_t frames_moved = (int32_t) floor (_transport_speed * nframes);
694                 
695                 if (frames_moved < 0) {
696                         decrement_transport_position (-frames_moved);
697                 } else {
698                         increment_transport_position (frames_moved);
699                 }
700                 
701                 nframes_t stop_limit;
702                 
703                 if (actively_recording()) {
704                         stop_limit = max_frames;
705                 } else {
706                         if (Config->get_stop_at_session_end()) {
707                                 stop_limit = current_end_frame();
708                         } else {
709                                 stop_limit = max_frames;
710                         }
711                 }
712
713                 maybe_stop (stop_limit);
714         }
715
716   noroll:
717         /* don't move at all */
718         no_roll (nframes, 0);
719         return false;
720 }
721
722 void
723 Session::process_without_events (nframes_t nframes)
724 {
725         bool session_needs_butler = false;
726         nframes_t stop_limit;
727         long frames_moved;
728         nframes_t offset = 0;
729
730         if (!process_can_proceed()) {
731                 _silent = true;
732                 return;
733         }
734
735         if (!_exporting && _slave) {
736                 if (!follow_slave (nframes, 0)) {
737                         return;
738                 }
739         } 
740
741         if (_transport_speed == 0) {
742                 no_roll (nframes, 0);
743                 return;
744         }
745                 
746         if (actively_recording()) {
747                 stop_limit = max_frames;
748         } else {
749                 if (Config->get_stop_at_session_end()) {
750                         stop_limit = current_end_frame();
751                 } else {
752                         stop_limit = max_frames;
753                 }
754         }
755                 
756         if (maybe_stop (stop_limit)) {
757                 no_roll (nframes, 0);
758                 return;
759         } 
760
761         if (maybe_sync_start (nframes, offset)) {
762                 return;
763         }
764
765         click (_transport_frame, nframes, offset);
766
767         prepare_diskstreams ();
768         
769         frames_moved = (long) floor (_transport_speed * nframes);
770
771         if (process_routes (nframes, offset)) {
772                 no_roll (nframes, offset);
773                 return;
774         }
775
776         commit_diskstreams (nframes, session_needs_butler);
777
778         if (frames_moved < 0) {
779                 decrement_transport_position (-frames_moved);
780         } else {
781                 increment_transport_position (frames_moved);
782         }
783
784         maybe_stop (stop_limit);
785         check_declick_out ();
786
787         if (session_needs_butler) {
788                 summon_butler ();
789         } 
790         
791         if (!_engine.freewheeling() && session_send_mtc) {
792                 send_midi_time_code_in_another_thread ();
793         }
794
795         return;
796 }               
797
798 void
799 Session::process_audition (nframes_t nframes)
800 {
801         Event* ev;
802         boost::shared_ptr<RouteList> r = routes.reader ();
803
804         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
805                 if (!(*i)->hidden()) {
806                         (*i)->silence (nframes, 0);
807                 }
808         }
809
810         /* run the auditioner, and if it says we need butler service, ask for it */
811         
812         if (auditioner->play_audition (nframes) > 0) {
813                 summon_butler ();
814         } 
815
816         /* handle pending events */
817
818         while (pending_events.read (&ev, 1) == 1) {
819                 merge_event (ev);
820         }
821
822         /* if we are not in the middle of a state change,
823            and there are immediate events queued up,
824            process them. 
825         */
826
827         while (!non_realtime_work_pending() && !immediate_events.empty()) {
828                 Event *ev = immediate_events.front ();
829                 immediate_events.pop_front ();
830                 process_event (ev);
831         }
832
833         if (!auditioner->active()) {
834                 process_function = &Session::process_with_events;
835         }
836 }
837
838 bool
839 Session::maybe_sync_start (nframes_t& nframes, nframes_t& offset)
840 {
841         nframes_t sync_offset;
842         
843         if (!waiting_for_sync_offset) {
844                 return false;
845         }
846
847         if (_engine.get_sync_offset (sync_offset) && sync_offset < nframes) {
848
849                 no_roll (sync_offset, 0);
850                 nframes -= sync_offset;
851                 offset += sync_offset;
852                 waiting_for_sync_offset = false;
853                 
854                 if (nframes == 0) {
855                         return true; // done
856                 }
857                 
858         } else {
859                 no_roll (nframes, 0);
860                 return true; // done
861         }
862
863         return false;
864 }
865