framework for silent-roll-while-slave-syncing
This commit is contained in:
parent
144f95c305
commit
66c5fe41ee
@ -99,6 +99,8 @@ class LIBARDOUR_API DiskReader : public DiskIOProcessor
|
|||||||
|
|
||||||
static void set_midi_readahead_frames (framecnt_t frames_ahead) { midi_readahead = frames_ahead; }
|
static void set_midi_readahead_frames (framecnt_t frames_ahead) { midi_readahead = frames_ahead; }
|
||||||
|
|
||||||
|
static void set_no_disk_output (bool yn);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class Track;
|
friend class Track;
|
||||||
friend class MidiTrack;
|
friend class MidiTrack;
|
||||||
@ -126,6 +128,7 @@ class LIBARDOUR_API DiskReader : public DiskIOProcessor
|
|||||||
|
|
||||||
static framecnt_t _chunk_frames;
|
static framecnt_t _chunk_frames;
|
||||||
static framecnt_t midi_readahead;
|
static framecnt_t midi_readahead;
|
||||||
|
static bool no_disk_output;
|
||||||
|
|
||||||
/* The MIDI stuff */
|
/* The MIDI stuff */
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ PBD::Signal0<void> DiskReader::Underrun;
|
|||||||
Sample* DiskReader::_mixdown_buffer = 0;
|
Sample* DiskReader::_mixdown_buffer = 0;
|
||||||
gain_t* DiskReader::_gain_buffer = 0;
|
gain_t* DiskReader::_gain_buffer = 0;
|
||||||
framecnt_t DiskReader::midi_readahead = 4096;
|
framecnt_t DiskReader::midi_readahead = 4096;
|
||||||
|
bool DiskReader::no_disk_output = false;
|
||||||
|
|
||||||
DiskReader::DiskReader (Session& s, string const & str, DiskIOProcessor::Flag f)
|
DiskReader::DiskReader (Session& s, string const & str, DiskIOProcessor::Flag f)
|
||||||
: DiskIOProcessor (s, str, f)
|
: DiskIOProcessor (s, str, f)
|
||||||
@ -289,7 +290,7 @@ DiskReader::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if monitoring disk but locating, put silence in the buffers */
|
/* if monitoring disk but locating put silence in the buffers */
|
||||||
|
|
||||||
if (still_locating && (ms == MonitoringDisk)) {
|
if (still_locating && (ms == MonitoringDisk)) {
|
||||||
bufs.silence (playback_distance, 0);
|
bufs.silence (playback_distance, 0);
|
||||||
@ -380,7 +381,7 @@ DiskReader::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame,
|
|||||||
|
|
||||||
chaninfo->buf->increment_read_ptr (playback_distance);
|
chaninfo->buf->increment_read_ptr (playback_distance);
|
||||||
|
|
||||||
if ((speed != 0.0) && (ms & MonitoringInput)) {
|
if (!no_disk_output && (speed != 0.0) && (ms & MonitoringInput)) {
|
||||||
/* mix the disk signal into the input signal (already in bufs) */
|
/* mix the disk signal into the input signal (already in bufs) */
|
||||||
mix_buffers_no_gain (output.data(), disk_signal, speed == 0.0 ? nframes : playback_distance);
|
mix_buffers_no_gain (output.data(), disk_signal, speed == 0.0 ? nframes : playback_distance);
|
||||||
}
|
}
|
||||||
@ -1465,3 +1466,16 @@ DiskReader::refill_midi ()
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DiskReader::set_no_disk_output (bool yn)
|
||||||
|
{
|
||||||
|
/* this MUST be called as part of the process call tree, before any
|
||||||
|
disk readers are invoked. We use it when the session needs the
|
||||||
|
transport (and thus effective read position for DiskReaders) to keep
|
||||||
|
advancing as part of syncing up with a transport master, but we
|
||||||
|
don't want any actual disk output yet because we are still not
|
||||||
|
synced.
|
||||||
|
*/
|
||||||
|
no_disk_output = yn;
|
||||||
|
}
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include "ardour/butler.h"
|
#include "ardour/butler.h"
|
||||||
#include "ardour/cycle_timer.h"
|
#include "ardour/cycle_timer.h"
|
||||||
#include "ardour/debug.h"
|
#include "ardour/debug.h"
|
||||||
|
#include "ardour/disk_reader.h"
|
||||||
#include "ardour/graph.h"
|
#include "ardour/graph.h"
|
||||||
#include "ardour/port.h"
|
#include "ardour/port.h"
|
||||||
#include "ardour/process_thread.h"
|
#include "ardour/process_thread.h"
|
||||||
@ -235,43 +236,10 @@ Session::process_routes (pframes_t nframes, bool& need_butler)
|
|||||||
int
|
int
|
||||||
Session::silent_process_routes (pframes_t nframes, bool& need_butler)
|
Session::silent_process_routes (pframes_t nframes, bool& need_butler)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<RouteList> r = routes.reader ();
|
DiskReader::set_no_disk_output (true);
|
||||||
|
int ret = process_routes (nframes, need_butler);
|
||||||
const framepos_t start_frame = _transport_frame;
|
DiskReader::set_no_disk_output (false);
|
||||||
const framepos_t end_frame = _transport_frame + lrintf(nframes * _transport_speed);
|
return ret;
|
||||||
|
|
||||||
VCAList v = _vca_manager->vcas ();
|
|
||||||
for (VCAList::const_iterator i = v.begin(); i != v.end(); ++i) {
|
|
||||||
(*i)->automation_run (start_frame, nframes);
|
|
||||||
}
|
|
||||||
|
|
||||||
_global_locate_pending = locate_pending();
|
|
||||||
|
|
||||||
if (_process_graph) {
|
|
||||||
_process_graph->silent_process_routes (nframes, start_frame, end_frame, need_butler);
|
|
||||||
} else {
|
|
||||||
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
|
|
||||||
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if ((*i)->is_auditioner()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool b = false;
|
|
||||||
|
|
||||||
if ((ret = (*i)->silent_roll (nframes, start_frame, end_frame, b)) < 0) {
|
|
||||||
stop_transport ();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (b) {
|
|
||||||
need_butler = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user