summaryrefslogtreecommitdiff
path: root/libs/backends
diff options
context:
space:
mode:
authorTim Mayberry <mojofunk@gmail.com>2015-08-31 21:56:04 +1000
committerTim Mayberry <mojofunk@gmail.com>2015-09-02 12:07:59 +1000
commit77ce989dfa38a302da8722e6021e7ee768a5afb3 (patch)
tree5f3d06d751528f8e357268ec941129a0663c3af2 /libs/backends
parenta6fb71022ff039fb7d133e8bb970c36df0799fd1 (diff)
Pass input and output audio buffers into PortaudioBackend blocking process function
This makes it possible to reuse the method for callback based processing
Diffstat (limited to 'libs/backends')
-rw-r--r--libs/backends/portaudio/portaudio_backend.cc25
-rw-r--r--libs/backends/portaudio/portaudio_backend.h3
-rw-r--r--libs/backends/portaudio/portaudio_io.h3
3 files changed, 21 insertions, 10 deletions
diff --git a/libs/backends/portaudio/portaudio_backend.cc b/libs/backends/portaudio/portaudio_backend.cc
index 006bf3143a..19a3411e31 100644
--- a/libs/backends/portaudio/portaudio_backend.cc
+++ b/libs/backends/portaudio/portaudio_backend.cc
@@ -39,6 +39,7 @@
#include "win_utils.h"
#include "mmcss.h"
+#include "audio_utils.h"
#include "debug.h"
@@ -1461,7 +1462,8 @@ PortAudioBackend::main_blocking_process_thread ()
break;
}
- if (!blocking_process_main()) {
+ if (!blocking_process_main(_pcmio->get_capture_buffer(),
+ _pcmio->get_playback_buffer())) {
return 0;
}
} else {
@@ -1487,7 +1489,8 @@ PortAudioBackend::main_blocking_process_thread ()
}
bool
-PortAudioBackend::blocking_process_main ()
+PortAudioBackend::blocking_process_main(const float* interleaved_input_data,
+ float* interleaved_output_data)
{
uint32_t i = 0;
uint64_t min_elapsed_us = 1000000;
@@ -1495,13 +1498,16 @@ PortAudioBackend::blocking_process_main ()
m_dsp_calc.set_start_timestamp_us (utils::get_microseconds());
- /* get audio */
i = 0;
+ /* Copy input audio data into input port buffers */
for (std::vector<PamPort*>::const_iterator it = _system_inputs.begin();
it != _system_inputs.end();
++it, ++i) {
- _pcmio->get_capture_channel(
- i, (float*)((*it)->get_buffer(_samples_per_period)), _samples_per_period);
+ assert(_system_inputs.size() == _pcmio->n_capture_channels());
+ uint32_t channels = _system_inputs.size();
+ float* input_port_buffer = (float*)(*it)->get_buffer(_samples_per_period);
+ deinterleave_audio_data(
+ interleaved_input_data, input_port_buffer, _samples_per_period, i, channels);
}
process_incoming_midi ();
@@ -1554,10 +1560,11 @@ PortAudioBackend::blocking_process_main ()
for (std::vector<PamPort*>::const_iterator it = _system_outputs.begin();
it != _system_outputs.end();
++it, ++i) {
- _pcmio->set_playback_channel(
- i,
- (float const*)(*it)->get_buffer(_samples_per_period),
- _samples_per_period);
+ assert(_system_outputs.size() == _pcmio->n_playback_channels());
+ const uint32_t channels = _system_outputs.size();
+ float* output_port_buffer = (float*)(*it)->get_buffer(_samples_per_period);
+ interleave_audio_data(
+ output_port_buffer, interleaved_output_data, _samples_per_period, i, channels);
}
_processed_samples += _samples_per_period;
diff --git a/libs/backends/portaudio/portaudio_backend.h b/libs/backends/portaudio/portaudio_backend.h
index 7b3f247875..db16937651 100644
--- a/libs/backends/portaudio/portaudio_backend.h
+++ b/libs/backends/portaudio/portaudio_backend.h
@@ -324,7 +324,8 @@ class PortAudioBackend : public AudioBackend {
bool start_blocking_process_thread ();
bool stop_blocking_process_thread ();
bool blocking_process_freewheel ();
- bool blocking_process_main ();
+ bool blocking_process_main (const float* interleaved_input_data,
+ float* interleaved_output_data);
void process_port_connection_changes ();
void process_incoming_midi ();
diff --git a/libs/backends/portaudio/portaudio_io.h b/libs/backends/portaudio/portaudio_io.h
index 73ebb71028..3ccf9570a6 100644
--- a/libs/backends/portaudio/portaudio_io.h
+++ b/libs/backends/portaudio/portaudio_io.h
@@ -106,6 +106,9 @@ public:
int get_capture_channel (uint32_t chn, float *input, uint32_t n_samples);
int set_playback_channel (uint32_t chn, const float *input, uint32_t n_samples);
+ float* get_capture_buffer () { return _input_buffer; }
+ float* get_playback_buffer () { return _output_buffer; }
+
private: // Methods
static bool pa_initialize();