+ /* write back audio */
+ i = 0;
+ for (std::vector<PamPort*>::const_iterator it = _system_outputs.begin();
+ it != _system_outputs.end();
+ ++it, ++i) {
+ assert(_system_outputs.size() == _pcmio->n_playback_channels());
+ const uint32_t channels = _system_outputs.size();
+ float* output_port_buffer = (float*)(*it)->get_buffer(_samples_per_period);
+ interleave_audio_data(
+ output_port_buffer, interleaved_output_data, _samples_per_period, i, channels);
+ }
+
+ _processed_samples += _samples_per_period;
+
+ /* calculate DSP load */
+ _dsp_calc.set_stop_timestamp_us (PBD::get_microseconds());
+ _dsp_load = _dsp_calc.get_dsp_load();
+
+ DEBUG_TIMING(string_compose("DSP Load: %1\n", _dsp_load));
+
+ max_elapsed_us = std::max(_dsp_calc.elapsed_time_us(), max_elapsed_us);
+ min_elapsed_us = std::min(_dsp_calc.elapsed_time_us(), min_elapsed_us);
+ if ((_cycle_count % 1000) == 0) {
+ DEBUG_TIMING(string_compose("Elapsed process time(usecs) max: %1, min: %2\n",
+ max_elapsed_us,
+ min_elapsed_us));
+ }
+
+ return true;
+}
+
+bool
+PortAudioBackend::blocking_process_freewheel()
+{
+ // zero audio input buffers
+ for (std::vector<PamPort*>::const_iterator it = _system_inputs.begin();
+ it != _system_inputs.end();
+ ++it) {
+ memset((*it)->get_buffer(_samples_per_period),
+ 0,
+ _samples_per_period * sizeof(Sample));
+ }
+
+ // TODO clear midi or stop midi recv when entering fwheelin'
+
+ if (engine.process_callback(_samples_per_period)) {
+ _pcmio->close_stream();
+ _active = false;
+ return false;
+ }
+
+ // drop all outgoing MIDI messages
+ for (std::vector<PamPort*>::const_iterator it = _system_midi_out.begin();
+ it != _system_midi_out.end();
+ ++it) {
+ void* bptr = (*it)->get_buffer(0);
+ midi_clear(bptr);
+ }
+
+ _dsp_load = 1.0;
+ Glib::usleep(100); // don't hog cpu
+ return true;
+}
+
+void
+PortAudioBackend::process_incoming_midi ()
+{
+ uint32_t i = 0;
+ for (std::vector<PamPort*>::const_iterator it = _system_midi_in.begin();
+ it != _system_midi_in.end();
+ ++it, ++i) {
+ PortMidiBuffer* mbuf = static_cast<PortMidiBuffer*>((*it)->get_buffer(0));
+ mbuf->clear();
+ uint64_t timestamp;
+ pframes_t sample_offset;
+ uint8_t data[256];
+ size_t size = sizeof(data);
+ while (_midiio->dequeue_input_event(i,
+ _cycle_timer.get_start(),
+ _cycle_timer.get_next_start(),
+ timestamp,
+ data,
+ size)) {
+ sample_offset = _cycle_timer.samples_since_cycle_start(timestamp);
+ midi_event_put(mbuf, sample_offset, data, size);
+ DEBUG_MIDI(string_compose("Dequeuing incoming MIDI data for device: %1 "
+ "sample_offset: %2 timestamp: %3, size: %4\n",
+ _midiio->get_inputs()[i]->name(),
+ sample_offset,
+ timestamp,
+ size));
+ size = sizeof(data);