static void set_midi_readahead_frames (framecnt_t frames_ahead) { midi_readahead = frames_ahead; }
+ static void set_no_disk_output (bool yn);
+
protected:
friend class Track;
friend class MidiTrack;
static framecnt_t _chunk_frames;
static framecnt_t midi_readahead;
+ static bool no_disk_output;
/* The MIDI stuff */
Sample* DiskReader::_mixdown_buffer = 0;
gain_t* DiskReader::_gain_buffer = 0;
framecnt_t DiskReader::midi_readahead = 4096;
+bool DiskReader::no_disk_output = false;
DiskReader::DiskReader (Session& s, string const & str, DiskIOProcessor::Flag f)
: DiskIOProcessor (s, str, f)
}
}
- /* 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)) {
bufs.silence (playback_distance, 0);
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_buffers_no_gain (output.data(), disk_signal, speed == 0.0 ? nframes : playback_distance);
}
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;
+}
#include "ardour/butler.h"
#include "ardour/cycle_timer.h"
#include "ardour/debug.h"
+#include "ardour/disk_reader.h"
#include "ardour/graph.h"
#include "ardour/port.h"
#include "ardour/process_thread.h"
int
Session::silent_process_routes (pframes_t nframes, bool& need_butler)
{
- boost::shared_ptr<RouteList> r = routes.reader ();
-
- const framepos_t start_frame = _transport_frame;
- const framepos_t end_frame = _transport_frame + lrintf(nframes * _transport_speed);
-
- 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;
+ DiskReader::set_no_disk_output (true);
+ int ret = process_routes (nframes, need_butler);
+ DiskReader::set_no_disk_output (false);
+ return ret;
}
void