add a non-interleaved mode to the Portaudio backend
authorRobin Gareus <robin@gareus.org>
Fri, 20 Mar 2015 10:45:56 +0000 (11:45 +0100)
committerRobin Gareus <robin@gareus.org>
Fri, 20 Mar 2015 10:45:56 +0000 (11:45 +0100)
libs/backends/portaudio/portaudio_io.cc

index e4e2fabbb7bd3f725c8042862be415c0cda6c68c..b5757fa7762f6c9f0b9bf6008b6142a8a498c5cc 100644 (file)
@@ -22,6 +22,9 @@
 #include <assert.h>
 #include "portaudio_io.h"
 
+#define INTERLEAVED_INPUT
+#define INTERLEAVED_OUTPUT
+
 using namespace ARDOUR;
 
 PortAudioIO::PortAudioIO ()
@@ -317,7 +320,11 @@ PortAudioIO::pcm_setup (
        if (nfo_in) {
                inputParam.device = device_input;
                inputParam.channelCount = _capture_channels;
+#ifdef INTERLEAVED_INPUT
                inputParam.sampleFormat = paFloat32;
+#else
+               inputParam.sampleFormat = paFloat32 | paNonInterleaved;
+#endif
                inputParam.suggestedLatency = nfo_in->defaultLowInputLatency;
                inputParam.hostApiSpecificStreamInfo = NULL;
        }
@@ -325,7 +332,11 @@ PortAudioIO::pcm_setup (
        if (nfo_out) {
                outputParam.device = device_output;
                outputParam.channelCount = _playback_channels;
+#ifdef INTERLEAVED_OUTPUT
                outputParam.sampleFormat = paFloat32;
+#else
+               outputParam.sampleFormat = paFloat32 | paNonInterleaved;
+#endif
                outputParam.suggestedLatency = nfo_out->defaultLowOutputLatency;
                outputParam.hostApiSpecificStreamInfo = NULL;
        }
@@ -425,6 +436,9 @@ PortAudioIO::next_cycle (uint32_t n_samples)
        return xrun ? 1 : 0;
 }
 
+
+#ifdef INTERLEAVED_INPUT
+
 int
 PortAudioIO::get_capture_channel (uint32_t chn, float *input, uint32_t n_samples)
 {
@@ -438,6 +452,20 @@ PortAudioIO::get_capture_channel (uint32_t chn, float *input, uint32_t n_samples
        return 0;
 }
 
+#else
+
+int
+PortAudioIO::get_capture_channel (uint32_t chn, float *input, uint32_t n_samples)
+{
+       assert(chn < _capture_channels);
+       memcpy((void*)input, &(_input_buffer[chn * n_samples]), n_samples * sizeof(float));
+}
+
+#endif
+
+
+#ifdef INTERLEAVED_OUTPUT
+
 int
 PortAudioIO::set_playback_channel (uint32_t chn, const float *output, uint32_t n_samples)
 {
@@ -450,3 +478,15 @@ PortAudioIO::set_playback_channel (uint32_t chn, const float *output, uint32_t n
        }
        return 0;
 }
+
+#else
+
+int
+PortAudioIO::set_playback_channel (uint32_t chn, const float *output, uint32_t n_samples)
+{
+       assert(chn < _playback_channels);
+       memcpy((void*)&(_output_buffer[chn * n_samples]), (void*)output, n_samples * sizeof(float));
+       return 0;
+}
+
+#endif