summaryrefslogtreecommitdiff
path: root/libs/backends/portaudio/portaudio_backend.cc
diff options
context:
space:
mode:
authorTim Mayberry <mojofunk@gmail.com>2015-08-27 11:41:00 +1000
committerTim Mayberry <mojofunk@gmail.com>2015-09-02 12:07:58 +1000
commitf27d8e1e23af67b76ec5e59daa73265dbfd993c1 (patch)
tree8cfc6f1c0d538bc0d52ada7c0e70a198984a5d2e /libs/backends/portaudio/portaudio_backend.cc
parentcf81caa7982f8cd541c8aba2b81ead216879c1b2 (diff)
Extract freewheel processing in PortAudioBackend into new method
Diffstat (limited to 'libs/backends/portaudio/portaudio_backend.cc')
-rw-r--r--libs/backends/portaudio/portaudio_backend.cc54
1 files changed, 34 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 ()
{