MCPcopy Create free account
hub / github.com/Serial-Studio/Serial-Studio / extractCapabilities

Function extractCapabilities

app/src/IO/Drivers/Audio.cpp:65–122  ·  view source on GitHub ↗

* @brief Extracts audio device capabilities using MiniAudio's backend context. */

Source from the content-addressed store, hash-verified

63 * @brief Extracts audio device capabilities using MiniAudio's backend context.
64 */
65static IO::Drivers::Audio::AudioDeviceInfo extractCapabilities(ma_context* context,
66 const ma_device_info& info,
67 ma_device_type type)
68{
69 const QSet<int> defaultChannels = {1, 2};
70 const QSet<int> defaultSampleRates = {
71 8000, 11025, 16000, 22050, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000};
72
73 const QSet<ma_format> defaultFormats = {
74 ma_format_u8, ma_format_s16, ma_format_s24, ma_format_s32, ma_format_f32};
75
76 ma_device_info fullInfo = {};
77 auto r = ma_context_get_device_info(context, type, &info.id, &fullInfo);
78 if (r != MA_SUCCESS)
79 fullInfo = info;
80
81 QSet<int> sampleRates;
82 QSet<ma_format> formats;
83 QSet<int> channelCounts = {1};
84 for (ma_uint32 i = 0; i < fullInfo.nativeDataFormatCount; ++i) {
85 const auto& f = fullInfo.nativeDataFormats[i];
86
87 if (f.format == ma_format_unknown)
88 formats.unite(defaultFormats);
89 else
90 formats.insert(f.format);
91
92 if (f.channels == 0)
93 channelCounts.unite(defaultChannels);
94 else
95 channelCounts.insert(static_cast<int>(f.channels));
96
97 if (f.sampleRate == 0)
98 sampleRates.unite(defaultSampleRates);
99 else
100 sampleRates.insert(static_cast<int>(f.sampleRate));
101 }
102
103 if (formats.isEmpty())
104 formats = defaultFormats;
105
106 if (sampleRates.isEmpty())
107 sampleRates = defaultSampleRates;
108
109 if (channelCounts.isEmpty())
110 channelCounts = defaultChannels;
111
112 IO::Drivers::Audio::AudioDeviceInfo caps;
113 caps.supportedFormats = formats.values();
114 caps.supportedSampleRates = sampleRates.values();
115 caps.supportedChannelCounts = channelCounts.values();
116
117 std::sort(caps.supportedFormats.begin(), caps.supportedFormats.end());
118 std::sort(caps.supportedSampleRates.begin(), caps.supportedSampleRates.end());
119 std::sort(caps.supportedChannelCounts.begin(), caps.supportedChannelCounts.end());
120
121 return caps;
122}

Callers 1

replaceDeviceListFunction · 0.85

Calls 3

sortFunction · 0.85
isEmptyMethod · 0.80
beginMethod · 0.80

Tested by

no test coverage detected