ardour
session_process.cc
Go to the documentation of this file.
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 #include "pbd/enumwriter.h"
27 
28 #include <glibmm/threads.h>
29 
30 #include "ardour/audioengine.h"
31 #include "ardour/auditioner.h"
32 #include "ardour/butler.h"
33 #include "ardour/cycle_timer.h"
34 #include "ardour/debug.h"
35 #include "ardour/graph.h"
36 #include "ardour/port.h"
37 #include "ardour/process_thread.h"
38 #include "ardour/scene_changer.h"
39 #include "ardour/session.h"
40 #include "ardour/slave.h"
41 #include "ardour/ticker.h"
42 #include "ardour/types.h"
43 
44 #include "midi++/mmc.h"
45 
46 #include "i18n.h"
47 
48 using namespace ARDOUR;
49 using namespace PBD;
50 using namespace std;
51 
56 void
58 {
59  framepos_t transport_at_start = _transport_frame;
60 
61  _silent = false;
62 
63  if (processing_blocked()) {
64  _silent = true;
65  return;
66  }
67 
68  if (non_realtime_work_pending()) {
69  if (!_butler->transport_work_requested ()) {
70  post_transport ();
71  }
72  }
73 
74  _engine.main_thread()->get_buffers ();
75 
76  (this->*process_function) (nframes);
77 
78  /* realtime-safe meter-position and processor-order changes
79  *
80  * ideally this would be done in
81  * Route::process_output_buffers() but various functions
82  * callig it hold a _processor_lock reader-lock
83  */
84  boost::shared_ptr<RouteList> r = routes.reader ();
85  for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
86  if ((*i)->apply_processor_changes_rt()) {
87  _rt_emit_pending = true;
88  }
89  }
90  if (_rt_emit_pending) {
91  if (!_rt_thread_active) {
92  emit_route_signals ();
93  }
94  if (pthread_mutex_trylock (&_rt_emit_mutex) == 0) {
95  pthread_cond_signal (&_rt_emit_cond);
96  pthread_mutex_unlock (&_rt_emit_mutex);
97  _rt_emit_pending = false;
98  }
99  }
100 
101  _engine.main_thread()->drop_buffers ();
102 
103  /* deliver MIDI clock. Note that we need to use the transport frame
104  * position at the start of process(), not the value at the end of
105  * it. We may already have ticked() because of a transport state
106  * change, for example.
107  */
108 
109  try {
110  if (!_silent && !_engine.freewheeling() && Config->get_send_midi_clock() && (transport_speed() == 1.0f || transport_speed() == 0.0f) && midi_clock->has_midi_port()) {
111  midi_clock->tick (transport_at_start, nframes);
112  }
113 
114  _scene_changer->run (transport_at_start, transport_at_start + nframes);
115 
116  } catch (...) {
117  /* don't bother with a message */
118  }
119 
120  SendFeedback (); /* EMIT SIGNAL */
121 }
122 
123 int
125 {
126  return no_roll (nframes);
127 }
128 
129 int
131 {
132  PT_TIMING_CHECK (4);
133 
134  framepos_t end_frame = _transport_frame + nframes; // FIXME: varispeed + no_roll ??
135  int ret = 0;
136  int declick = get_transport_declick_required();
137  boost::shared_ptr<RouteList> r = routes.reader ();
138 
139  if (_click_io) {
140  _click_io->silence (nframes);
141  }
142 
143  ltc_tx_send_time_code_for_cycle (_transport_frame, end_frame, _target_transport_speed, _transport_speed, nframes);
144 
145  if (_process_graph) {
146  DEBUG_TRACE(DEBUG::ProcessThreads,"calling graph/no-roll\n");
147  _process_graph->routes_no_roll( nframes, _transport_frame, end_frame, non_realtime_work_pending(), declick);
148  } else {
149  PT_TIMING_CHECK (10);
150  for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
151 
152  if ((*i)->is_auditioner()) {
153  continue;
154  }
155 
156  (*i)->set_pending_declick (declick);
157 
158  if ((*i)->no_roll (nframes, _transport_frame, end_frame, non_realtime_work_pending())) {
159  error << string_compose(_("Session: error in no roll for %1"), (*i)->name()) << endmsg;
160  ret = -1;
161  break;
162  }
163  }
164  PT_TIMING_CHECK (11);
165  }
166 
167  PT_TIMING_CHECK (5);
168  return ret;
169 }
170 
174 int
175 Session::process_routes (pframes_t nframes, bool& need_butler)
176 {
177  int declick = get_transport_declick_required();
178  boost::shared_ptr<RouteList> r = routes.reader ();
179 
180  const framepos_t start_frame = _transport_frame;
181  const framepos_t end_frame = _transport_frame + floor (nframes * _transport_speed);
182 
183  if (_process_graph) {
184  DEBUG_TRACE(DEBUG::ProcessThreads,"calling graph/process-routes\n");
185  if (_process_graph->process_routes (nframes, start_frame, end_frame, declick, need_butler) < 0) {
186  stop_transport ();
187  return -1;
188  }
189  } else {
190 
191  for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
192 
193  int ret;
194 
195  if ((*i)->is_auditioner()) {
196  continue;
197  }
198 
199  (*i)->set_pending_declick (declick);
200 
201  bool b = false;
202 
203  if ((ret = (*i)->roll (nframes, start_frame, end_frame, declick, b)) < 0) {
204  stop_transport ();
205  return -1;
206  }
207 
208  if (b) {
209  need_butler = true;
210  }
211  }
212  }
213 
214  return 0;
215 }
216 
220 int
221 Session::silent_process_routes (pframes_t nframes, bool& need_butler)
222 {
223  boost::shared_ptr<RouteList> r = routes.reader ();
224 
225  const framepos_t start_frame = _transport_frame;
226  const framepos_t end_frame = _transport_frame + lrintf(nframes * _transport_speed);
227 
228  if (_process_graph) {
229  _process_graph->silent_process_routes (nframes, start_frame, end_frame, need_butler);
230  } else {
231  for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
232 
233  int ret;
234 
235  if ((*i)->is_auditioner()) {
236  continue;
237  }
238 
239  bool b = false;
240 
241  if ((ret = (*i)->silent_roll (nframes, start_frame, end_frame, b)) < 0) {
242  stop_transport ();
243  return -1;
244  }
245 
246  if (b) {
247  need_butler = true;
248  }
249  }
250  }
251 
252  return 0;
253 }
254 
255 void
257 {
258  float pworst = 1.0f;
259  float cworst = 1.0f;
260 
261  boost::shared_ptr<RouteList> rl = routes.reader();
262  for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
263 
265 
266  if (!tr || tr->hidden()) {
267  continue;
268  }
269 
270  pworst = min (pworst, tr->playback_buffer_load());
271  cworst = min (cworst, tr->capture_buffer_load());
272  }
273 
274  g_atomic_int_set (&_playback_load, (uint32_t) floor (pworst * 100.0f));
275  g_atomic_int_set (&_capture_load, (uint32_t) floor (cworst * 100.0f));
276 
277  if (actively_recording()) {
278  set_dirty();
279  }
280 }
281 
283 void
285 {
286  PT_TIMING_CHECK (3);
287 
288  SessionEvent* ev;
289  pframes_t this_nframes;
290  framepos_t end_frame;
291  bool session_needs_butler = false;
292  framecnt_t frames_moved;
293 
294  /* make sure the auditioner is silent */
295 
296  if (auditioner) {
297  auditioner->silence (nframes);
298  }
299 
300  /* handle any pending events */
301 
302  while (pending_events.read (&ev, 1) == 1) {
303  merge_event (ev);
304  }
305 
306  /* if we are not in the middle of a state change,
307  and there are immediate events queued up,
308  process them.
309  */
310 
311  while (!non_realtime_work_pending() && !immediate_events.empty()) {
312  SessionEvent *ev = immediate_events.front ();
313  immediate_events.pop_front ();
314  process_event (ev);
315  }
316 
317  /* Decide on what to do with quarter-frame MTC during this cycle */
318 
319  bool const was_sending_qf_mtc = _send_qf_mtc;
320  double const tolerance = Config->get_mtc_qf_speed_tolerance() / 100.0;
321 
322  if (_transport_speed != 0) {
323  _send_qf_mtc = (
324  Config->get_send_mtc () &&
325  _transport_speed >= (1 - tolerance) &&
326  _transport_speed <= (1 + tolerance)
327  );
328 
329  if (_send_qf_mtc && !was_sending_qf_mtc) {
330  /* we will re-start quarter-frame MTC this cycle, so send a full update to set things up */
331  _send_timecode_update = true;
332  }
333 
334  if (Config->get_send_mtc() && !_send_qf_mtc && _pframes_since_last_mtc > (frame_rate () / 4)) {
335  /* we're sending MTC, but we're not sending QF MTC at the moment, and it's been
336  a quarter of a second since we sent anything at all, so send a full MTC update
337  this cycle.
338  */
339  _send_timecode_update = true;
340  }
341 
342  _pframes_since_last_mtc += nframes;
343  }
344 
345  /* Events caused a transport change (or we re-started sending
346  * MTC), so send an MTC Full Frame (Timecode) message. This
347  * is sent whether rolling or not, to give slaves an idea of
348  * ardour time on locates (and allow slow slaves to position
349  * and prepare for rolling)
350  */
351  if (_send_timecode_update) {
352  send_full_time_code (_transport_frame, nframes);
353  }
354 
355  if (!process_can_proceed()) {
356  _silent = true;
357  return;
358  }
359 
360  if (events.empty() || next_event == events.end()) {
361  process_without_events (nframes);
362  return;
363  }
364 
365  if (_transport_speed == 1.0) {
366  frames_moved = (framecnt_t) nframes;
367  } else {
368  interpolation.set_target_speed (_target_transport_speed);
369  interpolation.set_speed (_transport_speed);
370  frames_moved = (framecnt_t) interpolation.interpolate (0, nframes, 0, 0);
371  }
372 
373  end_frame = _transport_frame + frames_moved;
374 
375  {
376  SessionEvent* this_event;
377  Events::iterator the_next_one;
378 
379  if (!process_can_proceed()) {
380  _silent = true;
381  return;
382  }
383 
384  if (!_exporting && _slave) {
385  if (!follow_slave (nframes)) {
386  return;
387  }
388  }
389 
390  if (_transport_speed == 0) {
391  no_roll (nframes);
392  return;
393  }
394 
395  if (!_exporting && !timecode_transmission_suspended()) {
396  send_midi_time_code_for_cycle (_transport_frame, end_frame, nframes);
397  }
398 
399  ltc_tx_send_time_code_for_cycle (_transport_frame, end_frame, _target_transport_speed, _transport_speed, nframes);
400 
401  framepos_t stop_limit = compute_stop_limit ();
402 
403  if (maybe_stop (stop_limit)) {
404  no_roll (nframes);
405  return;
406  }
407 
408  this_event = *next_event;
409  the_next_one = next_event;
410  ++the_next_one;
411 
412  /* yes folks, here it is, the actual loop where we really truly
413  process some audio
414  */
415 
416  while (nframes) {
417 
418  this_nframes = nframes; /* real (jack) time relative */
419  frames_moved = (framecnt_t) floor (_transport_speed * nframes); /* transport relative */
420 
421  /* running an event, position transport precisely to its time */
422  if (this_event && this_event->action_frame <= end_frame && this_event->action_frame >= _transport_frame) {
423  /* this isn't quite right for reverse play */
424  frames_moved = (framecnt_t) (this_event->action_frame - _transport_frame);
425  this_nframes = abs (floor(frames_moved / _transport_speed));
426  }
427 
428  if (this_nframes) {
429 
430  click (_transport_frame, this_nframes);
431 
432  if (process_routes (this_nframes, session_needs_butler)) {
433  fail_roll (nframes);
434  return;
435  }
436 
437  get_track_statistics ();
438 
439  nframes -= this_nframes;
440 
441  if (frames_moved < 0) {
442  decrement_transport_position (-frames_moved);
443  } else {
444  increment_transport_position (frames_moved);
445  }
446 
447  maybe_stop (stop_limit);
448  check_declick_out ();
449  }
450 
451  if (nframes > 0) {
452  _engine.split_cycle (this_nframes);
453  }
454 
455  /* now handle this event and all others scheduled for the same time */
456 
457  while (this_event && this_event->action_frame == _transport_frame) {
458  process_event (this_event);
459 
460  if (the_next_one == events.end()) {
461  this_event = 0;
462  } else {
463  this_event = *the_next_one;
464  ++the_next_one;
465  }
466  }
467 
468  /* if an event left our state changing, do the right thing */
469 
470  if (nframes && non_realtime_work_pending()) {
471  no_roll (nframes);
472  break;
473  }
474 
475  /* this is necessary to handle the case of seamless looping */
476  end_frame = _transport_frame + floor (nframes * _transport_speed);
477  }
478 
479  set_next_event ();
480 
481  } /* implicit release of route lock */
482 
483  if (session_needs_butler) {
484  _butler->summon ();
485  }
486 }
487 
488 void
490 {
491  average_slave_delta = 1800;
492  delta_accumulator_cnt = 0;
493  have_first_delta_accumulator = false;
494  _slave_state = Stopped;
495 }
496 
497 bool
499 {
500  Slave* sl = _slave;
501 
502  if (!locate_pending() && (!config.get_external_sync() || (sl && sl->ok() && sl->locked()))) {
503  return true;
504  }
505 
506  return false;
507 }
508 
509 bool
511 {
512  double slave_speed;
513  framepos_t slave_transport_frame;
514  framecnt_t this_delta;
515  int dir;
516 
517  if (!_slave->ok()) {
518  stop_transport ();
519  config.set_external_sync (false);
520  goto noroll;
521  }
522 
523  _slave->speed_and_position (slave_speed, slave_transport_frame);
524 
525  DEBUG_TRACE (DEBUG::Slave, string_compose ("Slave position %1 speed %2\n", slave_transport_frame, slave_speed));
526 
527  if (!_slave->locked()) {
528  DEBUG_TRACE (DEBUG::Slave, "slave not locked\n");
529  goto noroll;
530  }
531 
532  if (slave_transport_frame > _transport_frame) {
533  this_delta = slave_transport_frame - _transport_frame;
534  dir = 1;
535  } else {
536  this_delta = _transport_frame - slave_transport_frame;
537  dir = -1;
538  }
539 
540  if (_slave->starting()) {
541  slave_speed = 0.0f;
542  }
543 
544  if (_slave->is_always_synced() ||
545  (Config->get_timecode_source_is_synced() && (dynamic_cast<TimecodeSlave*>(_slave)) != 0)
546  ) {
547 
548  /* if the TC source is synced, then we assume that its
549  speed is binary: 0.0 or 1.0
550  */
551 
552  if (slave_speed != 0.0f) {
553  slave_speed = 1.0f;
554  }
555 
556  } else {
557 
558  /* if we are chasing and the average delta between us and the
559  master gets too big, we want to switch to silent
560  motion. so keep track of that here.
561  */
562 
563  if (_slave_state == Running) {
564  calculate_moving_average_of_slave_delta(dir, this_delta);
565  }
566  }
567 
568  track_slave_state (slave_speed, slave_transport_frame, this_delta);
569 
570  DEBUG_TRACE (DEBUG::Slave, string_compose ("slave state %1 @ %2 speed %3 cur delta %4 avg delta %5\n",
571  _slave_state, slave_transport_frame, slave_speed, this_delta, average_slave_delta));
572 
573 
574  if (_slave_state == Running && !_slave->is_always_synced() &&
575  !(Config->get_timecode_source_is_synced() && (dynamic_cast<TimecodeSlave*>(_slave)) != 0)
576  ) {
577 
578  if (_transport_speed != 0.0f) {
579 
580  /*
581  note that average_dir is +1 or -1
582  */
583 
584  float delta;
585 
586  if (average_slave_delta == 0) {
587  delta = this_delta;
588  delta *= dir;
589  } else {
590  delta = average_slave_delta;
591  delta *= average_dir;
592  }
593 
594 #ifndef NDEBUG
595  if (slave_speed != 0.0) {
596  DEBUG_TRACE (DEBUG::Slave, string_compose ("delta = %1 speed = %2 ts = %3 M@%4 S@%5 avgdelta %6\n",
597  (int) (dir * this_delta),
598  slave_speed,
599  _transport_speed,
600  _transport_frame,
601  slave_transport_frame,
602  average_slave_delta));
603  }
604 #endif
605 
606  if (_slave->give_slave_full_control_over_transport_speed()) {
607  set_transport_speed (slave_speed, 0, false, false);
608  //std::cout << "set speed = " << slave_speed << "\n";
609  } else {
610  float adjusted_speed = slave_speed + (1.5 * (delta / float(_current_frame_rate)));
611  request_transport_speed (adjusted_speed);
612  DEBUG_TRACE (DEBUG::Slave, string_compose ("adjust using %1 towards %2 ratio %3 current %4 slave @ %5\n",
613  delta, adjusted_speed, adjusted_speed/slave_speed, _transport_speed,
614  slave_speed));
615  }
616 
617 #if 1
618  if (!actively_recording() && (framecnt_t) abs(average_slave_delta) > _slave->resolution()) {
619  cerr << "average slave delta greater than slave resolution (" << _slave->resolution() << "), going to silent motion\n";
620  goto silent_motion;
621  }
622 #endif
623  }
624  }
625 
626 
627  if (_slave_state == Running && !non_realtime_work_pending()) {
628  /* speed is set, we're locked, and good to go */
629  return true;
630  }
631 
632  silent_motion:
633  DEBUG_TRACE (DEBUG::Slave, "silent motion\n")
634  follow_slave_silently (nframes, slave_speed);
635 
636  noroll:
637  /* don't move at all */
638  DEBUG_TRACE (DEBUG::Slave, "no roll\n")
639  no_roll (nframes);
640  return false;
641 }
642 
643 void
645 {
646  if (delta_accumulator_cnt >= delta_accumulator_size) {
647  have_first_delta_accumulator = true;
648  delta_accumulator_cnt = 0;
649  }
650 
651  if (delta_accumulator_cnt != 0 || this_delta < _current_frame_rate) {
652  delta_accumulator[delta_accumulator_cnt++] = (framecnt_t) dir * (framecnt_t) this_delta;
653  }
654 
655  if (have_first_delta_accumulator) {
656  average_slave_delta = 0L;
657  for (int i = 0; i < delta_accumulator_size; ++i) {
658  average_slave_delta += delta_accumulator[i];
659  }
660  average_slave_delta /= (int32_t) delta_accumulator_size;
661  if (average_slave_delta < 0L) {
662  average_dir = -1;
663  average_slave_delta = abs(average_slave_delta);
664  } else {
665  average_dir = 1;
666  }
667  }
668 }
669 
670 void
671 Session::track_slave_state (float slave_speed, framepos_t slave_transport_frame, framecnt_t /*this_delta*/)
672 {
673  if (slave_speed != 0.0f) {
674 
675  /* slave is running */
676 
677  switch (_slave_state) {
678  case Stopped:
679  if (_slave->requires_seekahead()) {
680  slave_wait_end = slave_transport_frame + _slave->seekahead_distance ();
681  DEBUG_TRACE (DEBUG::Slave, string_compose ("slave stopped, but running, requires seekahead to %1\n", slave_wait_end));
682  /* we can call locate() here because we are in process context */
683  locate (slave_wait_end, false, false);
684  _slave_state = Waiting;
685 
686  } else {
687 
688  DEBUG_TRACE (DEBUG::Slave, string_compose ("slave stopped -> running at %1\n", slave_transport_frame));
689 
690  memset (delta_accumulator, 0, sizeof (int32_t) * delta_accumulator_size);
691  average_slave_delta = 0L;
692 
693  Location* al = _locations->auto_loop_location();
694 
695  if (al && play_loop && (slave_transport_frame < al->start() || slave_transport_frame > al->end())) {
696  // cancel looping
697  request_play_loop(false);
698  }
699 
700  if (slave_transport_frame != _transport_frame) {
701  DEBUG_TRACE (DEBUG::Slave, string_compose ("require locate to run. eng: %1 -> sl: %2\n", _transport_frame, slave_transport_frame));
702  locate (slave_transport_frame, false, false);
703  }
704  _slave_state = Running;
705  }
706  break;
707 
708  case Waiting:
709  default:
710  break;
711  }
712 
713  if (_slave_state == Waiting) {
714 
715  DEBUG_TRACE (DEBUG::Slave, string_compose ("slave waiting at %1\n", slave_transport_frame));
716 
717  if (slave_transport_frame >= slave_wait_end) {
718 
719  DEBUG_TRACE (DEBUG::Slave, string_compose ("slave start at %1 vs %2\n", slave_transport_frame, _transport_frame));
720 
721  _slave_state = Running;
722 
723  /* now perform a "micro-seek" within the disk buffers to realign ourselves
724  precisely with the master.
725  */
726 
727 
728  bool ok = true;
729  framecnt_t frame_delta = slave_transport_frame - _transport_frame;
730 
731  boost::shared_ptr<RouteList> rl = routes.reader();
732  for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
734  if (tr && !tr->can_internal_playback_seek (frame_delta)) {
735  ok = false;
736  break;
737  }
738  }
739 
740  if (ok) {
741  for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
743  if (tr) {
744  tr->internal_playback_seek (frame_delta);
745  }
746  }
747  _transport_frame += frame_delta;
748 
749  } else {
750  cerr << "cannot micro-seek\n";
751  /* XXX what? */
752  }
753  }
754  }
755 
756  if (_slave_state == Running && _transport_speed == 0.0f) {
757  DEBUG_TRACE (DEBUG::Slave, "slave starts transport\n");
758  start_transport ();
759  }
760 
761  } else { // slave_speed is 0
762 
763  /* slave has stopped */
764 
765  if (_transport_speed != 0.0f) {
766  DEBUG_TRACE (DEBUG::Slave, string_compose ("slave stops transport: %1 frame %2 tf %3\n", slave_speed, slave_transport_frame, _transport_frame));
767  stop_transport ();
768  }
769 
770  if (slave_transport_frame != _transport_frame) {
771  DEBUG_TRACE (DEBUG::Slave, string_compose ("slave stopped, move to %1\n", slave_transport_frame));
772  force_locate (slave_transport_frame, false);
773  }
774 
775  reset_slave_state();
776  }
777 }
778 
779 void
780 Session::follow_slave_silently (pframes_t nframes, float slave_speed)
781 {
782  if (slave_speed && _transport_speed) {
783 
784  /* something isn't right, but we should move with the master
785  for now.
786  */
787 
788  bool need_butler = false;
789 
790  silent_process_routes (nframes, need_butler);
791 
792  get_track_statistics ();
793 
794  if (need_butler) {
795  _butler->summon ();
796  }
797 
798  int32_t frames_moved = (int32_t) floor (_transport_speed * nframes);
799 
800  if (frames_moved < 0) {
801  decrement_transport_position (-frames_moved);
802  } else {
803  increment_transport_position (frames_moved);
804  }
805 
806  framepos_t const stop_limit = compute_stop_limit ();
807  maybe_stop (stop_limit);
808  }
809 }
810 
811 void
813 {
814  bool session_needs_butler = false;
815  framecnt_t frames_moved;
816 
817  if (!process_can_proceed()) {
818  _silent = true;
819  return;
820  }
821 
822  if (!_exporting && _slave) {
823  if (!follow_slave (nframes)) {
824  ltc_tx_send_time_code_for_cycle (_transport_frame, _transport_frame, 0, 0 , nframes);
825  return;
826  }
827  }
828 
829  if (_transport_speed == 0) {
830  fail_roll (nframes);
831  return;
832  }
833 
834  if (_transport_speed == 1.0) {
835  frames_moved = (framecnt_t) nframes;
836  } else {
837  interpolation.set_target_speed (_target_transport_speed);
838  interpolation.set_speed (_transport_speed);
839  frames_moved = (framecnt_t) interpolation.interpolate (0, nframes, 0, 0);
840  }
841 
842  if (!_exporting && !timecode_transmission_suspended()) {
843  send_midi_time_code_for_cycle (_transport_frame, _transport_frame + frames_moved, nframes);
844  }
845 
846  ltc_tx_send_time_code_for_cycle (_transport_frame, _transport_frame + frames_moved, _target_transport_speed, _transport_speed, nframes);
847 
848  framepos_t const stop_limit = compute_stop_limit ();
849 
850  if (maybe_stop (stop_limit)) {
851  fail_roll (nframes);
852  return;
853  }
854 
855  if (maybe_sync_start (nframes)) {
856  return;
857  }
858 
859  click (_transport_frame, nframes);
860 
861  if (process_routes (nframes, session_needs_butler)) {
862  fail_roll (nframes);
863  return;
864  }
865 
866  get_track_statistics ();
867 
868  if (frames_moved < 0) {
869  decrement_transport_position (-frames_moved);
870  } else {
871  increment_transport_position (frames_moved);
872  }
873 
874  maybe_stop (stop_limit);
875  check_declick_out ();
876 
877  if (session_needs_butler) {
878  _butler->summon ();
879  }
880 }
881 
885 void
887 {
888  SessionEvent* ev;
889  boost::shared_ptr<RouteList> r = routes.reader ();
890 
891  for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
892  if (!(*i)->is_auditioner()) {
893  (*i)->silence (nframes);
894  }
895  }
896 
897  /* run the auditioner, and if it says we need butler service, ask for it */
898 
899  if (auditioner->play_audition (nframes) > 0) {
900  _butler->summon ();
901  }
902 
903  /* if using a monitor section, run it because otherwise we don't hear anything */
904 
905  if (_monitor_out && auditioner->needs_monitor()) {
906  _monitor_out->monitor_run (_transport_frame, _transport_frame + nframes, nframes, false);
907  }
908 
909  /* handle pending events */
910 
911  while (pending_events.read (&ev, 1) == 1) {
912  merge_event (ev);
913  }
914 
915  /* if we are not in the middle of a state change,
916  and there are immediate events queued up,
917  process them.
918  */
919 
920  while (!non_realtime_work_pending() && !immediate_events.empty()) {
921  SessionEvent *ev = immediate_events.front ();
922  immediate_events.pop_front ();
923  process_event (ev);
924  }
925 
926  if (!auditioner->auditioning()) {
927  /* auditioner no longer active, so go back to the normal process callback */
928  process_function = &Session::process_with_events;
929  }
930 }
931 
932 bool
934 {
935  pframes_t sync_offset;
936 
937  if (!waiting_for_sync_offset) {
938  return false;
939  }
940 
941  if (_engine.get_sync_offset (sync_offset) && sync_offset < nframes) {
942 
943  /* generate silence up to the sync point, then
944  adjust nframes + offset to reflect whatever
945  is left to do.
946  */
947 
948  no_roll (sync_offset);
949  nframes -= sync_offset;
951  waiting_for_sync_offset = false;
952 
953  if (nframes == 0) {
954  return true; // done, nothing left to process
955  }
956 
957  } else {
958 
959  /* sync offset point is not within this process()
960  cycle, so just generate silence. and don't bother
961  with any fancy stuff here, just the minimal silence.
962  */
963 
964  _silent = true;
965 
966  if (Config->get_locate_while_waiting_for_sync()) {
967  if (micro_locate (nframes)) {
968  /* XXX ERROR !!! XXX */
969  }
970  }
971 
972  return true; // done, nothing left to process
973  }
974 
975  return false;
976 }
977 
978 void
980 {
981  if (_state_of_the_state & Deletion) {
982  return;
983  } else if (_state_of_the_state & Loading) {
984  merge_event (ev);
985  } else {
986  pending_events.write (&ev, 1);
987  }
988 }
989 
990 void
992 {
993  if (events.empty()) {
994  next_event = events.end();
995  return;
996  }
997 
998  if (next_event == events.end()) {
999  next_event = events.begin();
1000  }
1001 
1002  if ((*next_event)->action_frame > _transport_frame) {
1003  next_event = events.begin();
1004  }
1005 
1006  for (; next_event != events.end(); ++next_event) {
1007  if ((*next_event)->action_frame >= _transport_frame) {
1008  break;
1009  }
1010  }
1011 }
1012 
1013 void
1015 {
1016  bool remove = true;
1017  bool del = true;
1018 
1019  /* if we're in the middle of a state change (i.e. waiting
1020  for the butler thread to complete the non-realtime
1021  part of the change), we'll just have to queue this
1022  event for a time when the change is complete.
1023  */
1024 
1025  if (non_realtime_work_pending()) {
1026 
1027  /* except locates, which we have the capability to handle */
1028 
1029  if (ev->type != SessionEvent::Locate) {
1030  immediate_events.insert (immediate_events.end(), ev);
1031  _remove_event (ev);
1032  return;
1033  }
1034  }
1035 
1036  DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("Processing event: %1 @ %2\n", enum_2_string (ev->type), _transport_frame));
1037 
1038  switch (ev->type) {
1039  case SessionEvent::SetLoop:
1040  set_play_loop (ev->yes_or_no, ev->speed);
1041  break;
1042 
1044  if (play_loop) {
1045  /* roll after locate, do not flush, set "with loop"
1046  true only if we are seamless looping
1047  */
1048  start_locate (ev->target_frame, true, false, Config->get_seamless_loop());
1049  }
1050  remove = false;
1051  del = false;
1052  break;
1053 
1055  if (play_loop) {
1056  /* Request a declick fade-out and a fade-in; the fade-out will happen
1057  at the end of the loop, and the fade-in at the start.
1058  */
1059  transport_sub_state |= (PendingLoopDeclickOut | PendingLoopDeclickIn);
1060  }
1061  remove = false;
1062  del = false;
1063  break;
1064 
1065  case SessionEvent::Locate:
1066  if (ev->yes_or_no) {
1067  /* args: do not roll after locate, do flush, not with loop */
1068  locate (ev->target_frame, false, true, false);
1069  } else {
1070  /* args: do not roll after locate, do flush, not with loop */
1071  start_locate (ev->target_frame, false, true, false);
1072  }
1073  _send_timecode_update = true;
1074  break;
1075 
1077  if (ev->yes_or_no) {
1078  /* args: roll after locate, do flush, not with loop */
1079  locate (ev->target_frame, true, true, false);
1080  } else {
1081  /* args: roll after locate, do flush, not with loop */
1082  start_locate (ev->target_frame, true, true, false);
1083  }
1084  _send_timecode_update = true;
1085  break;
1086 
1087  case SessionEvent::Skip:
1088  if (Config->get_skip_playback()) {
1089  start_locate (ev->target_frame, true, true, false);
1090  _send_timecode_update = true;
1091  }
1092  remove = false;
1093  del = false;
1094  break;
1095 
1097  // locate is handled by ::request_roll_at_and_return()
1098  _requested_return_frame = ev->target_frame;
1099  request_locate (ev->target2_frame, true);
1100  break;
1101 
1102 
1104  set_transport_speed (ev->speed, ev->target_frame, ev->yes_or_no, ev->second_yes_or_no, ev->third_yes_or_no);
1105  break;
1106 
1107  case SessionEvent::PunchIn:
1108  // cerr << "PunchIN at " << transport_frame() << endl;
1109  if (config.get_punch_in() && record_status() == Enabled) {
1110  enable_record ();
1111  }
1112  remove = false;
1113  del = false;
1114  break;
1115 
1117  // cerr << "PunchOUT at " << transport_frame() << endl;
1118  if (config.get_punch_out()) {
1119  step_back_from_record ();
1120  }
1121  remove = false;
1122  del = false;
1123  break;
1124 
1126  if (!non_realtime_work_pending()) {
1127  _clear_event_type (SessionEvent::StopOnce);
1128  stop_transport (ev->yes_or_no);
1129  }
1130  remove = false;
1131  del = false;
1132  break;
1133 
1135  if (!non_realtime_work_pending()) {
1136  stop_transport (ev->yes_or_no);
1137  }
1138  remove = false;
1139  del = false;
1140  break;
1141 
1143  /* args: roll after locate, do flush, not with loop */
1144  start_locate (ev->target_frame, true, true, false);
1145  remove = false;
1146  del = false;
1147  break;
1148 
1150  overwrite_some_buffers (static_cast<Track*>(ev->ptr));
1151  break;
1152 
1154  set_track_speed (static_cast<Track*> (ev->ptr), ev->speed);
1155  break;
1156 
1158  DEBUG_TRACE (DEBUG::Slave, "seen request for new slave\n");
1159  use_sync_source (ev->slave);
1160  break;
1161 
1163  set_audition (ev->region);
1164  // drop reference to region
1165  ev->region.reset ();
1166  break;
1167 
1169  add_post_transport_work (PostTransportInputChange);
1170  _butler->schedule_transport_work ();
1171  break;
1172 
1174  set_play_range (ev->audio_range, (ev->speed == 1.0f));
1175  break;
1176 
1178  unset_play_range();
1179  break;
1180 
1182  process_rtop (ev);
1183  del = false; // other side of RT request needs to clean up
1184  break;
1185 
1187  schedule_playback_buffering_adjustment ();
1188  break;
1189 
1191  schedule_capture_buffering_adjustment ();
1192  break;
1193 
1195  g_atomic_int_set (&_suspend_timecode_transmission, ev->yes_or_no ? 0 : 1);
1196  break;
1197 
1198  default:
1199  fatal << string_compose(_("Programming error: illegal event type in process_event (%1)"), ev->type) << endmsg;
1200  abort(); /*NOTREACHED*/
1201  break;
1202  };
1203 
1204  if (remove) {
1205  del = del && !_remove_event (ev);
1206  }
1207 
1208  if (del) {
1209  delete ev;
1210  }
1211 }
1212 
1213 framepos_t
1215 {
1216  if (!Config->get_stop_at_session_end ()) {
1217  return max_framepos;
1218  }
1219 
1220  if (_slave) {
1221  return max_framepos;
1222  }
1223 
1224 
1225  bool const punching_in = (config.get_punch_in () && _locations->auto_punch_location());
1226  bool const punching_out = (config.get_punch_out () && _locations->auto_punch_location());
1227 
1228  if (actively_recording ()) {
1229  /* permanently recording */
1230  return max_framepos;
1231  } else if (punching_in && !punching_out) {
1232  /* punching in but never out */
1233  return max_framepos;
1234  } else if (punching_in && punching_out && _locations->auto_punch_location()->end() > current_end_frame()) {
1235  /* punching in and punching out after session end */
1236  return max_framepos;
1237  }
1238 
1239  return current_end_frame ();
1240 }
1241 
1242 
1243 
1244 /* dedicated thread for signal emission.
1245  *
1246  * while sending cross-thread signals from the process thread
1247  * is fine in general, PBD::Signal's use of boost::function and
1248  * boost:bind can produce a vast overhead which is not
1249  * acceptable for low latency.
1250  *
1251  * This works around the issue by moving the boost overhead
1252  * out of the RT thread. The overall load is probably higher but
1253  * the realtime thread remains unaffected.
1254  */
1255 
1256 void
1258 {
1259  // TODO use RAII to allow using these signals in other places
1260  BatchUpdateStart(); /* EMIT SIGNAL */
1261  boost::shared_ptr<RouteList> r = routes.reader ();
1262  for (RouteList::const_iterator ci = r->begin(); ci != r->end(); ++ci) {
1263  (*ci)->emit_pending_signals ();
1264  }
1265  BatchUpdateEnd(); /* EMIT SIGNAL */
1266 }
1267 
1268 void
1270 {
1271  if (_rt_thread_active) {
1272  return;
1273  }
1274  _rt_thread_active = true;
1275 
1276  if (pthread_create (&_rt_emit_thread, NULL, emit_thread, this)) {
1277  _rt_thread_active = false;
1278  }
1279 }
1280 
1281 void
1283 {
1284  if (!_rt_thread_active) {
1285  return;
1286  }
1287  _rt_thread_active = false;
1288 
1289  if (pthread_mutex_lock (&_rt_emit_mutex) == 0) {
1290  pthread_cond_signal (&_rt_emit_cond);
1291  pthread_mutex_unlock (&_rt_emit_mutex);
1292  }
1293 
1294  void *status;
1295  pthread_join (_rt_emit_thread, &status);
1296 }
1297 
1298 void *
1300 {
1301  Session *s = static_cast<Session *>(arg);
1302  s->emit_thread_run ();
1303  pthread_exit (0);
1304  return 0;
1305 }
1306 
1307 void
1309 {
1310  pthread_mutex_lock (&_rt_emit_mutex);
1311  while (_rt_thread_active) {
1312  emit_route_signals();
1313  pthread_cond_wait (&_rt_emit_cond, &_rt_emit_mutex);
1314  }
1315  pthread_mutex_unlock (&_rt_emit_mutex);
1316 }
static void increment_global_port_buffer_offset(pframes_t n)
Definition: port.h:135
LIBPBD_API Transmitter fatal
bool maybe_sync_start(pframes_t &)
void calculate_moving_average_of_slave_delta(int dir, framecnt_t this_delta)
void track_slave_state(float slave_speed, framepos_t slave_transport_frame, framecnt_t this_delta)
#define enum_2_string(e)
Definition: enumwriter.h:97
int process_routes(pframes_t, bool &need_butler)
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r)
Definition: shared_ptr.hpp:396
LIBARDOUR_API uint64_t ProcessThreads
Definition: debug.cc:36
static void * emit_thread(void *)
bool hidden() const
Definition: track.cc:674
float capture_buffer_load() const
Definition: track.cc:644
framepos_t action_frame
Definition: session_event.h:80
void process_event(SessionEvent *)
uint32_t pframes_t
Definition: types.h:61
tuple f
Definition: signals.py:35
framepos_t end() const
Definition: location.h:72
Definition: Beats.hpp:239
LIBPBD_API Transmitter error
std::ostream & endmsg(std::ostream &ostr)
Definition: transmitter.h:71
#define PT_TIMING_CHECK(x)
Definition: cycle_timer.h:92
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
Definition: region.cc:63
framepos_t target_frame
Definition: session_event.h:81
std::list< AudioRange > audio_range
framepos_t target2_frame
Definition: session_event.h:87
bool transport_locked() const
LIBARDOUR_API uint64_t SessionEvents
Definition: debug.cc:43
#define _(Text)
Definition: i18n.h:11
void process_without_events(pframes_t)
int64_t framecnt_t
Definition: types.h:76
LIBARDOUR_API RCConfiguration * Config
Definition: globals.cc:119
void process_with_events(pframes_t)
int internal_playback_seek(framecnt_t)
Definition: track.cc:686
Definition: amp.h:29
void process_audition(pframes_t)
The Slave interface can be used to sync ARDOURs tempo to an external source like MTC, MIDI Clock, etc.
Definition: slave.h:62
void process(pframes_t nframes)
virtual bool ok() const =0
virtual bool locked() const =0
int fail_roll(pframes_t nframes)
#define DEBUG_TRACE(bits, str)
Definition: debug.h:55
int64_t framepos_t
Definition: types.h:66
int silent_process_routes(pframes_t, bool &need_butler)
LIBARDOUR_API uint64_t Slave
Definition: debug.cc:42
void queue_event(SessionEvent *)
bool follow_slave(pframes_t)
boost::shared_ptr< Region > region
framepos_t compute_stop_limit() const
int can_internal_playback_seek(framecnt_t)
Definition: track.cc:680
void follow_slave_silently(pframes_t nframes, float slave_speed)
float playback_buffer_load() const
Definition: track.cc:638
Definition: debug.h:30
static const framepos_t max_framepos
Definition: types.h:78
int no_roll(pframes_t nframes)
int pthread_create(pthread_t *__restrict thread, __const pthread_attr_t *__restrict attr, void *(*start_routine)(void *), void *__restrict arg)
Definition: gprofhelper.c:83
std::string string_compose(const std::string &fmt, const T1 &o1)
Definition: compose.h:208