+void
+Track::zero_diskstream_id_in_xml (XMLNode& node)
+{
+ if (node.property ("diskstream-id")) {
+ node.add_property ("diskstream-id", "0");
+ }
+}
+
+int
+Track::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
+ bool session_state_changing, bool can_record, bool /*rec_monitors_input*/)
+{
+ if (n_outputs().n_total() == 0) {
+ return 0;
+ }
+
+ if (!_active) {
+ silence (nframes);
+ return 0;
+ }
+
+ if (session_state_changing) {
+ if (_session.transport_speed() != 0.0f) {
+ /* we're rolling but some state is changing (e.g. our diskstream contents)
+ so we cannot use them. Be silent till this is over. Don't declick.
+
+ XXX note the absurdity of ::no_roll() being called when we ARE rolling!
+ */
+ passthru_silence (start_frame, end_frame, nframes, 0);
+ return 0;
+ }
+ /* we're really not rolling, so we're either delivery silence or actually
+ monitoring, both of which are safe to do while session_state_changing is true.
+ */
+ }
+
+ diskstream()->check_record_status (start_frame, nframes, can_record);
+
+ bool send_silence;
+
+ if (_have_internal_generator) {
+ /* since the instrument has no input streams,
+ there is no reason to send any signal
+ into the route.
+ */
+ send_silence = true;
+ } else {
+ if (!Config->get_tape_machine_mode()) {
+ /*
+ ADATs work in a strange way..
+ they monitor input always when stopped.and auto-input is engaged.
+ */
+ if ((Config->get_monitoring_model() == SoftwareMonitoring)
+ && (_session.config.get_auto_input () || _diskstream->record_enabled())) {
+ send_silence = false;
+ } else {
+ send_silence = true;
+ }
+ } else {
+ /*
+ Other machines switch to input on stop if the track is record enabled,
+ regardless of the auto input setting (auto input only changes the
+ monitoring state when the transport is rolling)
+ */
+ if ((Config->get_monitoring_model() == SoftwareMonitoring)
+ && _diskstream->record_enabled()) {
+ send_silence = false;
+ } else {
+ send_silence = true;
+ }
+ }
+ }
+
+ _amp->apply_gain_automation(false);
+
+ if (send_silence) {
+
+ /* if we're sending silence, but we want the meters to show levels for the signal,
+ meter right here.
+ */
+
+ if (_have_internal_generator) {
+ passthru_silence (start_frame, end_frame, nframes, 0);
+ } else {
+ if (_meter_point == MeterInput) {
+ _input->process_input (_meter, start_frame, end_frame, nframes);
+ }
+ passthru_silence (start_frame, end_frame, nframes, 0);
+ }
+
+ } else {
+
+ /* we're sending signal, but we may still want to meter the input.
+ */
+
+ passthru (start_frame, end_frame, nframes, false);
+ }
+
+ _main_outs->flush (nframes, end_frame - start_frame - 1);
+
+ return 0;
+}
+
+int
+Track::silent_roll (nframes_t nframes, sframes_t /*start_frame*/, sframes_t /*end_frame*/,
+ bool can_record, bool rec_monitors_input)
+{
+ if (n_outputs().n_total() == 0 && _processors.empty()) {
+ return 0;
+ }
+
+ if (!_active) {
+ silence (nframes);
+ return 0;
+ }
+
+ _silent = true;
+ _amp->apply_gain_automation(false);
+
+ silence (nframes);
+
+ return diskstream()->process (_session.transport_frame(), nframes, can_record, rec_monitors_input);
+}