From 61e851da0841190b5f45944a0aa5395cae07a269 Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Tue, 4 Aug 2015 13:36:29 +1000 Subject: [PATCH] Add code to use ASIO supplied min/max buffer sizes but don't use it RME HDSP: min == max == preferred size with granularity == 0 Focusrite scarlett 2i2: min = current ASIO setting and max = max buffersize the device supports with a granularity of 1 which means hundreds of entries in the dropdown menu. --- libs/backends/portaudio/portaudio_io.cc | 36 +++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/libs/backends/portaudio/portaudio_io.cc b/libs/backends/portaudio/portaudio_io.cc index c007e29436..5ba424c26d 100644 --- a/libs/backends/portaudio/portaudio_io.cc +++ b/libs/backends/portaudio/portaudio_io.cc @@ -206,7 +206,10 @@ PortAudioIO::get_asio_buffer_properties (int device_id, bool PortAudioIO::get_asio_buffer_sizes (int device_id, std::vector& buffer_sizes) { - long min_size_frames, max_size_frames, preferred_size_frames, granularity; + long min_size_frames = 0; + long max_size_frames = 0; + long preferred_size_frames = 0; + long granularity = 0; if (!get_asio_buffer_properties (device_id, min_size_frames, @@ -218,7 +221,36 @@ PortAudioIO::get_asio_buffer_sizes (int device_id, std::vector& buffer return false; } - buffer_sizes.push_back(preferred_size_frames); + DEBUG_AUDIO (string_compose ("ASIO buffer properties for device %1, " + "min_size_frames: %2, max_size_frames: %3, " + "preferred_size_frames: %4, granularity: %5\n", + device_id, + min_size_frames, + max_size_frames, + preferred_size_frames, + granularity)); + +#ifdef USE_ASIO_MIN_MAX_BUFFER_SIZES + if (min_size_frames >= max_size_frames) { + buffer_sizes.push_back (preferred_size_frames); + return true; + } + + long buffer_size = min_size_frames; + while (buffer_size <= max_size_frames) { + buffer_sizes.push_back (buffer_size); + + if (granularity <= 0) { + // buffer sizes are power of 2 + buffer_size = buffer_size * 2; + } else { + buffer_size += granularity; + } + } +#else + buffer_sizes.push_back (preferred_size_frames); +#endif + return true; } #endif