+ if (_no_inplace) {
+ BufferSet& inplace_bufs = _session.get_noinplace_buffers();
+ ARDOUR::ChanMapping used_outputs;
+
+ uint32_t pc = 0;
+ for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
+
+ ARDOUR::ChanMapping i_in_map (natural_input_streams());
+ ARDOUR::ChanMapping i_out_map;
+ ARDOUR::ChanCount mapped;
+ ARDOUR::ChanCount backmap;
+
+ // map inputs sequentially
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
+ bool valid;
+ uint32_t in_idx = in_map[pc].get (*t, in, &valid);
+ uint32_t m = mapped.get (*t);
+ if (valid) {
+ inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
+ } else {
+ inplace_bufs.get (*t, m).silence (nframes, offset);
+ }
+ mapped.set (*t, m + 1);
+ }
+ }
+
+ // TODO use map_offset_to() instead ??
+ backmap = mapped;
+
+ // map outputs
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
+ uint32_t m = mapped.get (*t);
+ inplace_bufs.get (*t, m).silence (nframes, offset);
+ i_out_map.set (*t, out, m);
+ mapped.set (*t, m + 1);
+ }
+ }
+
+ if ((*i)->connect_and_run(inplace_bufs, i_in_map, i_out_map, nframes, offset)) {
+ deactivate ();
+ }
+
+
+ // copy back outputs
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
+ uint32_t m = backmap.get (*t);
+ bool valid;
+ uint32_t out_idx = out_map[pc].get (*t, out, &valid);
+ if (valid) {
+ bufs.get (*t, out_idx).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
+ used_outputs.set (*t, out_idx, 1); // mark as used
+ }
+ backmap.set (*t, m + 1);
+ }
+ }
+ }
+ /* all instances have completed, now clear outputs that have not been written to.
+ * (except midi bypass)
+ */
+ if (bufs.count().n_midi() == 1 && natural_output_streams().get(DataType::MIDI) == 0) {
+ used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
+ }