From f27d8e1e23af67b76ec5e59daa73265dbfd993c1 Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Thu, 27 Aug 2015 11:41:00 +1000 Subject: [PATCH] Extract freewheel processing in PortAudioBackend into new method --- libs/backends/portaudio/portaudio_backend.cc | 54 ++++++++++++-------- libs/backends/portaudio/portaudio_backend.h | 2 + 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/libs/backends/portaudio/portaudio_backend.cc b/libs/backends/portaudio/portaudio_backend.cc index 9248c2d32c..36fd21e9ee 100644 --- a/libs/backends/portaudio/portaudio_backend.cc +++ b/libs/backends/portaudio/portaudio_backend.cc @@ -1574,29 +1574,10 @@ PortAudioBackend::main_blocking_process_thread () } } else { - // Freewheelin' - // zero audio input buffers - for (std::vector::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; + if (!blocking_process_freewheel()) { return 0; } - - // drop all outgoing MIDI messages - for (std::vector::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 } process_port_connection_changes(); @@ -1614,6 +1595,39 @@ PortAudioBackend::main_blocking_process_thread () return 0; } +bool +PortAudioBackend::blocking_process_freewheel () +{ + // zero audio input buffers + for (std::vector::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::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_port_connection_changes () { diff --git a/libs/backends/portaudio/portaudio_backend.h b/libs/backends/portaudio/portaudio_backend.h index cbef7508df..52d7d0e3ac 100644 --- a/libs/backends/portaudio/portaudio_backend.h +++ b/libs/backends/portaudio/portaudio_backend.h @@ -322,9 +322,11 @@ class PortAudioBackend : public AudioBackend { private: // Methods bool start_blocking_process_thread (); bool stop_blocking_process_thread (); + bool blocking_process_freewheel (); void process_port_connection_changes (); + private: std::string _instance_name; PortAudioIO *_pcmio;