29 QAudioDevicePrivate::AudioDeviceFormat format;
31 format.minimumChannelCount = 1;
32 format.maximumChannelCount = 2;
34 format.minimumSampleRate = 8000;
35 format.maximumSampleRate = 48000;
37 format.supportedSampleFormats = {
44 format.preferredFormat.setChannelCount(mode == QAudioDevice::Input ? 1 : 2);
45 format.preferredFormat.setSampleFormat(QAudioFormat::Float);
46 format.preferredFormat.setSampleRate(48000);
57 QAudioDevice::Mode mode)
59 QAudioDevicePrivate::AudioDeviceFormat format = defaultDeviceFormat(mode);
61 const snd_pcm_stream_t direction =
62 mode == QAudioDevice::Input ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK;
66 snd_pcm_t *handle =
nullptr;
67 if (
int err = snd_pcm_open(&handle, dev.constData(), direction, SND_PCM_NONBLOCK); err < 0) {
68 qCDebug(lcQnxSndDevices) <<
"probe: cannot open" << dev <<
":" << snd_strerror(err)
69 <<
"- using default format";
73 snd_pcm_hw_params_t *hwparams;
74 snd_pcm_hw_params_alloca(&hwparams);
75 if (
int err = snd_pcm_hw_params_any(handle, hwparams); err < 0) {
76 qCDebug(lcQnxSndDevices) <<
"probe: hw_params_any failed for" << dev <<
":"
77 << snd_strerror(err) <<
"- using default format";
78 snd_pcm_close(handle);
84 QList<
int> supportedRates;
85 for (
int rate : QtMultimediaPrivate::allSupportedSampleRates) {
86 if (snd_pcm_hw_params_test_rate(handle, hwparams,
static_cast<
unsigned>(rate), 0) == 0)
87 supportedRates.append(rate);
89 if (!supportedRates.isEmpty()) {
91 format.minimumSampleRate = supportedRates.first();
92 format.maximumSampleRate = supportedRates.last();
100 QList<QAudioFormat::SampleFormat> nativeFormats;
101 for (QAudioFormat::SampleFormat sf : { QAudioFormat::UInt8, QAudioFormat::Int16,
102 QAudioFormat::Int32, QAudioFormat::Float }) {
103 const snd_pcm_format_t pcmFormat = QnxSndHelpers::mapSampleFormat(sf);
104 if (pcmFormat != SND_PCM_FORMAT_UNKNOWN
105 && snd_pcm_hw_params_test_format(handle, hwparams, pcmFormat) == 0) {
106 nativeFormats.append(sf);
109 format.supportedSampleFormats = qAllSupportedSampleFormats();
112 unsigned int minChannels = 0;
113 unsigned int maxChannels = 0;
114 if (snd_pcm_hw_params_get_channels_min(hwparams, &minChannels) == 0
115 && snd_pcm_hw_params_get_channels_max(hwparams, &maxChannels) == 0 && maxChannels > 0) {
116 format.minimumChannelCount =
static_cast<
int>(minChannels);
117 format.maximumChannelCount =
static_cast<
int>(maxChannels);
122 format.preferredFormat.setSampleFormat(QAudioFormat::Float);
125 const int preferredRate = supportedRates.isEmpty()
126 ? ((48000 >= format.minimumSampleRate && 48000 <= format.maximumSampleRate)
128 : format.maximumSampleRate)
129 : QtMultimediaPrivate::findClosestSamplingRate(48000, QSpan<
const int>{ supportedRates });
130 format.preferredFormat.setSampleRate(preferredRate);
132 const int preferredChannels = mode == QAudioDevice::Input ? 1 : 2;
133 format.preferredFormat.setChannelCount(
134 std::clamp(preferredChannels, format.minimumChannelCount, format.maximumChannelCount));
136 if (
const int err = snd_pcm_close(handle); err < 0)
137 qCDebug(lcQnxSndDevices) <<
"probe: snd_pcm_close failed:" << snd_strerror(err);
139 qCDebug(lcQnxSndDevices) <<
"probe:" << dev <<
"rate" << format.minimumSampleRate <<
"-"
140 << format.maximumSampleRate <<
"ch" << format.minimumChannelCount <<
"-"
141 << format.maximumChannelCount <<
"native formats" << nativeFormats
142 <<
"(advertising all)";