+ if (input_device == _("None") && output_device == _("None")) {
+ return bs;
+ }
+ else if (input_device == _("None")) {
+ bs = available_buffer_sizes (output_device);
+ }
+ else if (output_device == _("None")) {
+ bs = available_buffer_sizes (input_device);
+ } else {
+ std::vector<uint32_t> bs_in = available_buffer_sizes (input_device);
+ std::vector<uint32_t> bs_out = available_buffer_sizes (output_device);
+ std::set_intersection (bs_in.begin(), bs_in.end(), bs_out.begin(), bs_out.end(), std::back_inserter(bs));
+ }
+ return bs;
+}
+
+std::vector<uint32_t>
+AlsaAudioBackend::available_buffer_sizes (const std::string& device) const
+{
+ ALSADeviceInfo *nfo = NULL;
+ std::vector<uint32_t> bs;
+ if (device == _("None")) {
+ return bs;
+ }
+ if (device == _input_audio_device && _input_audio_device_info.valid) {
+ nfo = &_input_audio_device_info;
+ }
+ else if (device == _output_audio_device && _output_audio_device_info.valid) {
+ nfo = &_output_audio_device_info;
+ }
+
+ static const unsigned long avail_sizes [] = { 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 };
+
+ for (size_t i = 0 ; i < sizeof(avail_sizes) / sizeof(unsigned long); ++i) {
+ if (!nfo || (avail_sizes[i] >= nfo->min_size && avail_sizes[i] <= nfo->max_size)) {
+ bs.push_back (avail_sizes[i]);
+ }
+ }