X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Faudioengine.cc;h=cbdd1fda1ce8fc088c66161295cd3775a356dd66;hb=c7e404a1c0ee9af941a335e4bdd2f667b0c6317a;hp=0bfa18be72fc03319dceb0b806e105096bef1b87;hpb=b3fe7cfc892f7d5978ad14eb81e9305fa9c14d13;p=ardour.git diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 0bfa18be72..cbdd1fda1c 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -255,6 +255,11 @@ AudioEngine::_graph_order_callback (void *arg) return 0; } +/** Wrapped which is called by JACK as its process callback. It is just + * here to get us back into C++ land by calling AudioEngine::process_callback() + * @param nframes Number of frames passed by JACK. + * @param arg User argument passed by JACK, which will be the AudioEngine*. + */ int AudioEngine::_process_callback (nframes_t nframes, void *arg) { @@ -267,11 +272,17 @@ AudioEngine::_freewheel_callback (int onoff, void *arg) static_cast(arg)->_freewheeling = onoff; } +/** Method called by JACK (via _process_callback) which says that there + * is work to be done. + * @param nframes Number of frames to process. + */ int AudioEngine::process_callback (nframes_t nframes) { // CycleTimer ct ("AudioEngine::process"); Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK); + + /// The number of frames that will have been processed when we've finished nframes_t next_processed_frames; /* handle wrap around of total frames counter */ @@ -281,13 +292,15 @@ AudioEngine::process_callback (nframes_t nframes) } else { next_processed_frames = _processed_frames + nframes; } - + if (!tm.locked() || session == 0) { + /* return having done nothing */ _processed_frames = next_processed_frames; return 0; } if (session_remove_pending) { + /* perform the actual session removal */ session = 0; session_remove_pending = false; session_removed.signal(); @@ -296,6 +309,7 @@ AudioEngine::process_callback (nframes_t nframes) } if (_freewheeling) { + /* emit the Freewheel signal and stop freewheeling in the event of trouble */ if (Freewheel (nframes)) { cerr << "Freewheeling returned non-zero!\n"; _freewheeling = false; @@ -307,23 +321,23 @@ AudioEngine::process_callback (nframes_t nframes) boost::shared_ptr p = ports.reader(); // Prepare ports (ie read data if necessary) - for (Ports::iterator i = p->begin(); i != p->end(); ++i) - (*i)->cycle_start(nframes); + for (Ports::iterator i = p->begin(); i != p->end(); ++i) { + (*i)->cycle_start (nframes); + } - session->process (nframes); + if (session) { + session->process (nframes); + } if (!_running) { - /* we were zombified, maybe because a ladspa plugin took - too long, or jackd exited, or something like that. - */ - _processed_frames = next_processed_frames; return 0; } // Finalize ports (ie write data if necessary) - for (Ports::iterator i = p->begin(); i != p->end(); ++i) - (*i)->cycle_end(); + for (Ports::iterator i = p->begin(); i != p->end(); ++i) { + (*i)->cycle_end (); + } if (last_monitor_check + monitor_check_interval < next_processed_frames) { @@ -447,14 +461,23 @@ AudioEngine::set_session (Session *s) can before we really start running. */ - session->process (blocksize); - session->process (blocksize); - session->process (blocksize); - session->process (blocksize); - session->process (blocksize); - session->process (blocksize); - session->process (blocksize); - session->process (blocksize); + boost::shared_ptr p = ports.reader(); + + for (Ports::iterator i = p->begin(); i != p->end(); ++i) + (*i)->cycle_start (blocksize); + + s->process (blocksize); + s->process (blocksize); + s->process (blocksize); + s->process (blocksize); + s->process (blocksize); + s->process (blocksize); + s->process (blocksize); + s->process (blocksize); + + for (Ports::iterator i = p->begin(); i != p->end(); ++i) + (*i)->cycle_end (); + } }