+std::vector<float>
+AlsaAudioBackend::available_sample_rates (const std::string& device) const
+{
+ ALSADeviceInfo *nfo = NULL;
+ std::vector<float> sr;
+ if (device == get_standard_device_name(DeviceNone)) {
+ return sr;
+ }
+ 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 float avail_rates [] = { 8000, 22050.0, 24000.0, 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0 };
+
+ for (size_t i = 0 ; i < sizeof(avail_rates) / sizeof(float); ++i) {
+ if (!nfo || (avail_rates[i] >= nfo->min_rate && avail_rates[i] <= nfo->max_rate)) {
+ sr.push_back (avail_rates[i]);
+ }
+ }
+
+ return sr;
+}
+
+std::vector<uint32_t>
+AlsaAudioBackend::available_buffer_sizes2 (const std::string& input_device, const std::string& output_device) const
+{
+ std::vector<uint32_t> bs;
+ if (input_device == get_standard_device_name(DeviceNone) && output_device == get_standard_device_name(DeviceNone)) {
+ return bs;
+ }
+ else if (input_device == get_standard_device_name(DeviceNone)) {
+ bs = available_buffer_sizes (output_device);
+ }
+ else if (output_device == get_standard_device_name(DeviceNone)) {
+ 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;
+}
+