diff options
author | Tim Mayberry <mojofunk@gmail.com> | 2015-08-31 21:56:04 +1000 |
---|---|---|
committer | Tim Mayberry <mojofunk@gmail.com> | 2015-09-02 12:07:59 +1000 |
commit | 77ce989dfa38a302da8722e6021e7ee768a5afb3 (patch) | |
tree | 5f3d06d751528f8e357268ec941129a0663c3af2 /libs/backends | |
parent | a6fb71022ff039fb7d133e8bb970c36df0799fd1 (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.cc | 25 | ||||
-rw-r--r-- | libs/backends/portaudio/portaudio_backend.h | 3 | ||||
-rw-r--r-- | libs/backends/portaudio/portaudio_io.h | 3 |
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(); |