From: Tim Mayberry Date: Tue, 4 Aug 2015 02:02:06 +0000 (+1000) Subject: Add ASIO specific code to query preferred buffer size for device X-Git-Tag: 4.2~121 X-Git-Url: https://main.carlh.net/gitweb/?a=commitdiff_plain;h=6ca1c8164f6d43588729cd3f7e74c27040920613;p=ardour.git Add ASIO specific code to query preferred buffer size for device --- diff --git a/libs/backends/portaudio/portaudio_io.cc b/libs/backends/portaudio/portaudio_io.cc index 3dcc6d377f..665df97823 100644 --- a/libs/backends/portaudio/portaudio_io.cc +++ b/libs/backends/portaudio/portaudio_io.cc @@ -158,14 +158,82 @@ PortAudioIO::available_sample_rates(int device_id, std::vector& sampleRat return 0; } -int -PortAudioIO::available_buffer_sizes(int device_id, std::vector& bufferSizes) +#ifdef WITH_ASIO +bool +PortAudioIO::get_asio_buffer_sizes (int device_id, std::vector& buffer_sizes) +{ + // we shouldn't really need all these checks but it shouldn't hurt + const PaDeviceInfo* device_info = Pa_GetDeviceInfo(device_id); + + if (!device_info) { + DEBUG_AUDIO (string_compose ( + "Unable to get device info from device index %1\n", device_id)); + return false; + } + + const PaHostApiInfo* info = Pa_GetHostApiInfo (device_info->hostApi); + + if (info == NULL) { + DEBUG_AUDIO (string_compose ( + "Unable to determine Host API from device index %1\n", device_id)); + return false; + } + + if (info->type != paASIO) { + DEBUG_AUDIO (string_compose ( + "ERROR device_id %1 is not an ASIO device\n", device_id)); + return false; + } + + long min_size, max_size, preferred_size, granularity; + + PaError err = PaAsio_GetAvailableBufferSizes ( + device_id, &min_size, &max_size, &preferred_size, &granularity); + + if (err != paNoError) { + DEBUG_AUDIO (string_compose ( + "Unable to determine available buffer sizes for device %1\n", device_id)); + return false; + } + + buffer_sizes.push_back(preferred_size); + return true; +} +#endif + +bool +PortAudioIO::get_default_buffer_sizes (int device_id, std::vector& buffer_sizes) { - // TODO static const uint32_t ardourSizes[] = { 64, 128, 256, 512, 1024, 2048, 4096 }; for(uint32_t i = 0; i < sizeof(ardourSizes)/sizeof(uint32_t); ++i) { - bufferSizes.push_back (ardourSizes[i]); + buffer_sizes.push_back (ardourSizes[i]); + } + return true; +} + +int +PortAudioIO::available_buffer_sizes(int device_id, std::vector& buffer_sizes) +{ +#ifdef WITH_ASIO + const PaHostApiInfo* info = Pa_GetHostApiInfo (_host_api_index); + + if (info == NULL) { + DEBUG_AUDIO (string_compose ("Unable to determine Host API from index %1\n", + _host_api_index)); + return -1; } + + PaHostApiTypeId type_id = info->type; + + if (type_id == paASIO) { + if (get_asio_buffer_sizes (device_id, buffer_sizes)) { + return 0; + } + } +#endif + + get_default_buffer_sizes (device_id, buffer_sizes); + return 0; } diff --git a/libs/backends/portaudio/portaudio_io.h b/libs/backends/portaudio/portaudio_io.h index 991c542574..1a122e7074 100644 --- a/libs/backends/portaudio/portaudio_io.h +++ b/libs/backends/portaudio/portaudio_io.h @@ -51,8 +51,13 @@ public: void input_device_list (std::map &devices) const; void output_device_list (std::map &devices) const; - int available_sample_rates (int device_id, std::vector& sampleRates); - int available_buffer_sizes (int device_id, std::vector& sampleRates); + int available_sample_rates (int device_id, std::vector& sample_rates); + int available_buffer_sizes (int device_id, std::vector& buffer_sizes); + + bool get_default_buffer_sizes (int device_id, std::vector& buffer_sizes); +#ifdef WITH_ASIO + bool get_asio_buffer_sizes (int device_id, std::vector& buffer_size); +#endif std::string control_app_name (int device_id) const; void launch_control_app (int device_id);