diff options
author | Tim Mayberry <mojofunk@gmail.com> | 2015-08-27 11:41:00 +1000 |
---|---|---|
committer | Tim Mayberry <mojofunk@gmail.com> | 2015-09-02 12:07:58 +1000 |
commit | f27d8e1e23af67b76ec5e59daa73265dbfd993c1 (patch) | |
tree | 8cfc6f1c0d538bc0d52ada7c0e70a198984a5d2e /libs/backends | |
parent | cf81caa7982f8cd541c8aba2b81ead216879c1b2 (diff) |
Extract freewheel processing in PortAudioBackend into new method
Diffstat (limited to 'libs/backends')
-rw-r--r-- | libs/backends/portaudio/portaudio_backend.cc | 54 | ||||
-rw-r--r-- | 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<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; + if (!blocking_process_freewheel()) { return 0; } - - // 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 } 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<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_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; |