Pass input and output audio buffers into PortaudioBackend blocking process function

This makes it possible to reuse the method for callback based processing
This commit is contained in:
Tim Mayberry 2015-08-31 21:56:04 +10:00
parent a6fb71022f
commit 77ce989dfa
3 changed files with 21 additions and 10 deletions

View file

@ -39,6 +39,7 @@
#include "win_utils.h" #include "win_utils.h"
#include "mmcss.h" #include "mmcss.h"
#include "audio_utils.h"
#include "debug.h" #include "debug.h"
@ -1461,7 +1462,8 @@ PortAudioBackend::main_blocking_process_thread ()
break; break;
} }
if (!blocking_process_main()) { if (!blocking_process_main(_pcmio->get_capture_buffer(),
_pcmio->get_playback_buffer())) {
return 0; return 0;
} }
} else { } else {
@ -1487,7 +1489,8 @@ PortAudioBackend::main_blocking_process_thread ()
} }
bool bool
PortAudioBackend::blocking_process_main () PortAudioBackend::blocking_process_main(const float* interleaved_input_data,
float* interleaved_output_data)
{ {
uint32_t i = 0; uint32_t i = 0;
uint64_t min_elapsed_us = 1000000; uint64_t min_elapsed_us = 1000000;
@ -1495,13 +1498,16 @@ PortAudioBackend::blocking_process_main ()
m_dsp_calc.set_start_timestamp_us (utils::get_microseconds()); m_dsp_calc.set_start_timestamp_us (utils::get_microseconds());
/* get audio */
i = 0; i = 0;
/* Copy input audio data into input port buffers */
for (std::vector<PamPort*>::const_iterator it = _system_inputs.begin(); for (std::vector<PamPort*>::const_iterator it = _system_inputs.begin();
it != _system_inputs.end(); it != _system_inputs.end();
++it, ++i) { ++it, ++i) {
_pcmio->get_capture_channel( assert(_system_inputs.size() == _pcmio->n_capture_channels());
i, (float*)((*it)->get_buffer(_samples_per_period)), _samples_per_period); 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 (); process_incoming_midi ();
@ -1554,10 +1560,11 @@ PortAudioBackend::blocking_process_main ()
for (std::vector<PamPort*>::const_iterator it = _system_outputs.begin(); for (std::vector<PamPort*>::const_iterator it = _system_outputs.begin();
it != _system_outputs.end(); it != _system_outputs.end();
++it, ++i) { ++it, ++i) {
_pcmio->set_playback_channel( assert(_system_outputs.size() == _pcmio->n_playback_channels());
i, const uint32_t channels = _system_outputs.size();
(float const*)(*it)->get_buffer(_samples_per_period), float* output_port_buffer = (float*)(*it)->get_buffer(_samples_per_period);
_samples_per_period); interleave_audio_data(
output_port_buffer, interleaved_output_data, _samples_per_period, i, channels);
} }
_processed_samples += _samples_per_period; _processed_samples += _samples_per_period;

View file

@ -324,7 +324,8 @@ class PortAudioBackend : public AudioBackend {
bool start_blocking_process_thread (); bool start_blocking_process_thread ();
bool stop_blocking_process_thread (); bool stop_blocking_process_thread ();
bool blocking_process_freewheel (); 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_port_connection_changes ();
void process_incoming_midi (); void process_incoming_midi ();

View file

@ -106,6 +106,9 @@ public:
int get_capture_channel (uint32_t chn, float *input, uint32_t n_samples); 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); 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 private: // Methods
static bool pa_initialize(); static bool pa_initialize();