| 22 | //////////////////////////////////////////////////// |
| 23 | |
| 24 | std::vector<AudioDeviceInfo> AudioDevice::MakeAudioDeviceList() |
| 25 | { |
| 26 | std::vector<std::string> rt_audio_apis{ |
| 27 | "unspecified", |
| 28 | "linux_alsa", |
| 29 | "linux_pulse", |
| 30 | "linux_oss", |
| 31 | "unix_jack", |
| 32 | "macos_coreaudio", |
| 33 | "windows_wasapi", |
| 34 | "windows_asio", |
| 35 | "windows_directsound", |
| 36 | "rtaudio_dummy"}; |
| 37 | |
| 38 | RtAudio rt; |
| 39 | if (rt.getDeviceCount() <= 0) throw std::runtime_error("no rtaudio devices available!"); |
| 40 | |
| 41 | const auto api_enum = rt.getCurrentApi(); |
| 42 | LOG_INFO("using rtaudio api %s", rt_audio_apis[static_cast<int>(api_enum)].c_str()); |
| 43 | |
| 44 | auto to_flt_vec = [](const std::vector<unsigned int> & vec) { |
| 45 | std::vector<float> result; |
| 46 | for (auto & i : vec) result.push_back(static_cast<float>(i)); |
| 47 | return result; |
| 48 | }; |
| 49 | |
| 50 | std::vector<AudioDeviceInfo> devices; |
| 51 | for (uint32_t i = 0; i < rt.getDeviceCount(); ++i) |
| 52 | { |
| 53 | RtAudio::DeviceInfo info = rt.getDeviceInfo(i); |
| 54 | |
| 55 | if (info.probed) |
| 56 | { |
| 57 | AudioDeviceInfo lab_device_info; |
| 58 | lab_device_info.index = i; |
| 59 | lab_device_info.identifier = info.name; |
| 60 | lab_device_info.num_output_channels = info.outputChannels; |
| 61 | lab_device_info.num_input_channels = info.inputChannels; |
| 62 | lab_device_info.supported_samplerates = to_flt_vec(info.sampleRates); |
| 63 | lab_device_info.nominal_samplerate = static_cast<float>(info.preferredSampleRate); |
| 64 | lab_device_info.is_default_output = info.isDefaultOutput; |
| 65 | lab_device_info.is_default_input = info.isDefaultInput; |
| 66 | |
| 67 | devices.push_back(lab_device_info); |
| 68 | } |
| 69 | else |
| 70 | { |
| 71 | LOG_ERROR("probing failed %s", info.name.c_str()); |
| 72 | } |
| 73 | } |
| 74 | |
| 75 | return devices; |
| 76 | } |
| 77 | |
| 78 | AudioDeviceIndex AudioDevice::GetDefaultOutputAudioDeviceIndex() noexcept |
| 79 | { |
nothing calls this directly
no test coverage detected