Extract freewheel processing in PortAudioBackend into new method
authorTim Mayberry <mojofunk@gmail.com>
Thu, 27 Aug 2015 01:41:00 +0000 (11:41 +1000)
committerTim Mayberry <mojofunk@gmail.com>
Wed, 2 Sep 2015 02:07:58 +0000 (12:07 +1000)
libs/backends/portaudio/portaudio_backend.cc
libs/backends/portaudio/portaudio_backend.h

index 9248c2d32c9dcbcd18aca5b00921bba86c2f56e3..36fd21e9eea43b72741fc6f3a28c17a993a3fe8c 100644 (file)
@@ -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 ()
 {
index cbef7508df619355cc49cd8c37102cd4083e5337..52d7d0e3ac45534ce584f09293670dc72b7de04f 100644 (file)
@@ -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;