Add ASIO specific code to query preferred buffer size for device
authorTim Mayberry <mojofunk@gmail.com>
Tue, 4 Aug 2015 02:02:06 +0000 (12:02 +1000)
committerTim Mayberry <mojofunk@gmail.com>
Wed, 5 Aug 2015 00:52:03 +0000 (10:52 +1000)
libs/backends/portaudio/portaudio_io.cc
libs/backends/portaudio/portaudio_io.h

index 3dcc6d377f1b7bfd1ff71905b55b0e253898f303..665df9782364968d0330fee15d7e4b8dfbe28222 100644 (file)
@@ -158,14 +158,82 @@ PortAudioIO::available_sample_rates(int device_id, std::vector<float>& sampleRat
        return 0;
 }
 
-int
-PortAudioIO::available_buffer_sizes(int device_id, std::vector<uint32_t>& bufferSizes)
+#ifdef WITH_ASIO
+bool
+PortAudioIO::get_asio_buffer_sizes (int device_id, std::vector<uint32_t>& 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<uint32_t>& 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<uint32_t>& 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;
 }
 
index 991c5425748247bb179d73cf03fae339c3122176..1a122e7074b1a0e71f1716e822cd8a63c41a304e 100644 (file)
@@ -51,8 +51,13 @@ public:
        void     input_device_list (std::map<int, std::string> &devices) const;
        void     output_device_list (std::map<int, std::string> &devices) const;
 
-       int      available_sample_rates (int device_id, std::vector<float>& sampleRates);
-       int      available_buffer_sizes (int device_id, std::vector<uint32_t>& sampleRates);
+       int available_sample_rates (int device_id, std::vector<float>& sample_rates);
+       int available_buffer_sizes (int device_id, std::vector<uint32_t>& buffer_sizes);
+
+       bool get_default_buffer_sizes (int device_id, std::vector<uint32_t>& buffer_sizes);
+#ifdef WITH_ASIO
+       bool get_asio_buffer_sizes (int device_id, std::vector<uint32_t>& buffer_size);
+#endif
 
        std::string control_app_name (int device_id) const;
        void launch_control_app (int device_id);