summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Mayberry <mojofunk@gmail.com>2015-08-04 12:02:06 +1000
committerTim Mayberry <mojofunk@gmail.com>2015-08-05 10:52:03 +1000
commit6ca1c8164f6d43588729cd3f7e74c27040920613 (patch)
treeccb8a24a72239c47a1807be5201efd23acf60656
parenta9b6277d501b414ce5498add82923f64c6c0f66d (diff)
Add ASIO specific code to query preferred buffer size for device
-rw-r--r--libs/backends/portaudio/portaudio_io.cc76
-rw-r--r--libs/backends/portaudio/portaudio_io.h9
2 files changed, 79 insertions, 6 deletions
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<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;
}
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<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);