Returns input, output
| 10 | |
| 11 | // Returns input, output |
| 12 | inline std::pair<AudioStreamConfig, AudioStreamConfig> |
| 13 | GetDefaultAudioDeviceConfiguration(const bool with_input = true) |
| 14 | { |
| 15 | AudioStreamConfig inputConfig; |
| 16 | AudioStreamConfig outputConfig; |
| 17 | |
| 18 | const std::vector<AudioDeviceInfo> audioDevices = lab::MakeAudioDeviceList(); |
| 19 | const AudioDeviceIndex default_output_device = lab::GetDefaultOutputAudioDeviceIndex(); |
| 20 | const AudioDeviceIndex default_input_device = lab::GetDefaultInputAudioDeviceIndex(); |
| 21 | |
| 22 | AudioDeviceInfo defaultOutputInfo, defaultInputInfo; |
| 23 | for (auto & info : audioDevices) { |
| 24 | if (info.index == default_output_device.index) |
| 25 | defaultOutputInfo = info; |
| 26 | else if (info.index == default_input_device.index) |
| 27 | defaultInputInfo = info; |
| 28 | } |
| 29 | |
| 30 | if (defaultOutputInfo.index != -1) { |
| 31 | outputConfig.device_index = defaultOutputInfo.index; |
| 32 | outputConfig.desired_channels = std::min(uint32_t(2), defaultOutputInfo.num_output_channels); |
| 33 | outputConfig.desired_samplerate = defaultOutputInfo.nominal_samplerate; |
| 34 | } |
| 35 | |
| 36 | if (with_input) { |
| 37 | if (defaultInputInfo.index != -1) { |
| 38 | inputConfig.device_index = defaultInputInfo.index; |
| 39 | inputConfig.desired_channels = std::min(uint32_t(1), defaultInputInfo.num_input_channels); |
| 40 | inputConfig.desired_samplerate = defaultInputInfo.nominal_samplerate; |
| 41 | } |
| 42 | else { |
| 43 | throw std::invalid_argument("the default audio input device was requested but none were found"); |
| 44 | } |
| 45 | } |
| 46 | |
| 47 | // RtAudio doesn't support mismatched input and output rates. |
| 48 | // this may be a pecularity of RtAudio, but for now, force an RtAudio |
| 49 | // compatible configuration |
| 50 | if (defaultOutputInfo.nominal_samplerate != defaultInputInfo.nominal_samplerate) { |
| 51 | float min_rate = std::min(defaultOutputInfo.nominal_samplerate, defaultInputInfo.nominal_samplerate); |
| 52 | inputConfig.desired_samplerate = min_rate; |
| 53 | outputConfig.desired_samplerate = min_rate; |
| 54 | printf("Warning ~ input and output sample rates don't match, attempting to set minimum"); |
| 55 | } |
| 56 | return {inputConfig, outputConfig}; |
| 57 | } |
| 58 | |
| 59 | struct ex_devices : public labsound_example { |
| 60 | virtual void play(int argc, char ** argv) override final |
no test coverage detected