From 77ce989dfa38a302da8722e6021e7ee768a5afb3 Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Mon, 31 Aug 2015 21:56:04 +1000 Subject: Pass input and output audio buffers into PortaudioBackend blocking process function This makes it possible to reuse the method for callback based processing --- libs/backends/portaudio/portaudio_backend.cc | 25 ++++++++++++++++--------- libs/backends/portaudio/portaudio_backend.h | 3 ++- libs/backends/portaudio/portaudio_io.h | 3 +++ 3 files changed, 21 insertions(+), 10 deletions(-) (limited to 'libs/backends') 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::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::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(); -- cgit v1.2.3