summaryrefslogtreecommitdiff
path: root/libs/backends
diff options
context:
space:
mode:
authorTim Mayberry <mojofunk@gmail.com>2015-08-27 18:07:25 +1000
committerTim Mayberry <mojofunk@gmail.com>2015-09-02 12:07:58 +1000
commitf143d7652308b722a973cdf8ea2cda6ce44be7eb (patch)
tree9fe74585abb544267e45c2613ca7acd91c270c8f /libs/backends
parenta65b1ddedc28a4135057dd48782f4cfa5d1411ea (diff)
Extract MIDI input/output processing in PortAudioBackend into new methods
Diffstat (limited to 'libs/backends')
-rw-r--r--libs/backends/portaudio/portaudio_backend.cc120
-rw-r--r--libs/backends/portaudio/portaudio_backend.h2
2 files changed, 68 insertions, 54 deletions
diff --git a/libs/backends/portaudio/portaudio_backend.cc b/libs/backends/portaudio/portaudio_backend.cc
index 142614bbff..3555d09928 100644
--- a/libs/backends/portaudio/portaudio_backend.cc
+++ b/libs/backends/portaudio/portaudio_backend.cc
@@ -1493,34 +1493,7 @@ PortAudioBackend::blocking_process_main ()
i, (float*)((*it)->get_buffer(_samples_per_period)), _samples_per_period);
}
- /* de-queue incoming midi*/
- 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,
- m_cycle_timer.get_start(),
- m_cycle_timer.get_next_start(),
- timestamp,
- data,
- size)) {
- sample_offset = m_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);
- }
- }
+ process_incoming_midi ();
/* clear output buffers */
for (std::vector<PamPort*>::const_iterator it = _system_outputs.begin();
@@ -1562,33 +1535,8 @@ PortAudioBackend::blocking_process_main ()
_active = false;
return false;
}
- /* mixdown midi */
- for (std::vector<PamPort*>::iterator it = _system_midi_out.begin();
- it != _system_midi_out.end();
- ++it) {
- static_cast<PortMidiPort*>(*it)->next_period();
- }
- /* queue outgoing midi */
- i = 0;
- for (std::vector<PamPort*>::const_iterator it = _system_midi_out.begin();
- it != _system_midi_out.end();
- ++it, ++i) {
- const PortMidiBuffer* src =
- static_cast<const PortMidiPort*>(*it)->const_buffer();
- for (PortMidiBuffer::const_iterator mit = src->begin(); mit != src->end();
- ++mit) {
- uint64_t timestamp =
- m_cycle_timer.timestamp_from_sample_offset((*mit)->timestamp());
- DEBUG_MIDI(string_compose("Queuing outgoing MIDI data for device: "
- "%1 sample_offset: %2 timestamp: %3, size: %4\n",
- _midiio->get_outputs()[i]->name(),
- (*mit)->timestamp(),
- timestamp,
- (*mit)->size()));
- _midiio->enqueue_output_event(i, timestamp, (*mit)->data(), (*mit)->size());
- }
- }
+ process_outgoing_midi ();
/* write back audio */
i = 0;
@@ -1654,6 +1602,70 @@ PortAudioBackend::blocking_process_freewheel()
}
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,
+ m_cycle_timer.get_start(),
+ m_cycle_timer.get_next_start(),
+ timestamp,
+ data,
+ size)) {
+ sample_offset = m_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);
+ }
+ }
+}
+
+void
+PortAudioBackend::process_outgoing_midi ()
+{
+ /* mixdown midi */
+ for (std::vector<PamPort*>::iterator it = _system_midi_out.begin();
+ it != _system_midi_out.end();
+ ++it) {
+ static_cast<PortMidiPort*>(*it)->next_period();
+ }
+ /* queue outgoing midi */
+ uint32_t i = 0;
+ for (std::vector<PamPort*>::const_iterator it = _system_midi_out.begin();
+ it != _system_midi_out.end();
+ ++it, ++i) {
+ const PortMidiBuffer* src =
+ static_cast<const PortMidiPort*>(*it)->const_buffer();
+
+ for (PortMidiBuffer::const_iterator mit = src->begin(); mit != src->end();
+ ++mit) {
+ uint64_t timestamp =
+ m_cycle_timer.timestamp_from_sample_offset((*mit)->timestamp());
+ DEBUG_MIDI(string_compose("Queuing outgoing MIDI data for device: "
+ "%1 sample_offset: %2 timestamp: %3, size: %4\n",
+ _midiio->get_outputs()[i]->name(),
+ (*mit)->timestamp(),
+ timestamp,
+ (*mit)->size()));
+ _midiio->enqueue_output_event(i, timestamp, (*mit)->data(), (*mit)->size());
+ }
+ }
+}
+
+void
PortAudioBackend::process_port_connection_changes ()
{
bool connections_changed = false;
diff --git a/libs/backends/portaudio/portaudio_backend.h b/libs/backends/portaudio/portaudio_backend.h
index 15f32befc2..08de76ccfb 100644
--- a/libs/backends/portaudio/portaudio_backend.h
+++ b/libs/backends/portaudio/portaudio_backend.h
@@ -327,6 +327,8 @@ class PortAudioBackend : public AudioBackend {
bool blocking_process_main ();
void process_port_connection_changes ();
+ void process_incoming_midi ();
+ void process_outgoing_midi ();
private:
std::string _instance_name;