13 snd_pcm_channel_params_t params;
14 memset(¶ms, 0,
sizeof(params));
15 params.channel = (mode == QAudioDevice::Output) ? SND_PCM_CHANNEL_PLAYBACK : SND_PCM_CHANNEL_CAPTURE;
16 params.mode = SND_PCM_MODE_BLOCK;
17 params.start_mode = SND_PCM_START_DATA;
18 params.stop_mode = SND_PCM_STOP_ROLLOVER;
19 params.buf.block.frag_size = fragmentSize;
20 params.buf.block.frags_min = 1;
21 params.buf.block.frags_max = 1;
22 strcpy(params.sw_mixer_subchn_name,
"QAudio Channel");
24 params.format.interleave = 1;
25 params.format.rate = format.sampleRate();
26 params.format.voices = format.channelCount();
28 switch (format.sampleFormat()) {
29 case QAudioFormat::UInt8:
30 params.format.format = SND_PCM_SFMT_U8;
34 case QAudioFormat::Int16:
35#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
36 params.format.format = SND_PCM_SFMT_S16_LE;
38 params.format.format = SND_PCM_SFMT_S16_BE;
41 case QAudioFormat::Int32:
42#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
43 params.format.format = SND_PCM_SFMT_S32_LE;
45 params.format.format = SND_PCM_SFMT_S32_BE;
48 case QAudioFormat::Float:
49#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
50 params.format.format = SND_PCM_SFMT_FLOAT_LE;
52 params.format.format = SND_PCM_SFMT_FLOAT_BE;
63 const int pcmMode = mode == QAudioDevice::Output
64 ? SND_PCM_OPEN_PLAYBACK
65 : SND_PCM_OPEN_CAPTURE;
69 const int errorCode = snd_pcm_open_name(&handle, id.constData(), pcmMode);
72 qWarning(
"Unable to open PCM device %s (0x%x)", id.constData(), -errorCode);
76 return HandleUniquePtr { handle };
83 std::optional<T> t = { T{} };
85 t->channel = mode == QAudioDevice::Output
86 ? SND_PCM_CHANNEL_PLAYBACK
87 : SND_PCM_CHANNEL_CAPTURE;
89 const int errorCode = func(handle, &(*t));
92 qWarning(
"QAudioDevice: couldn't get channel info (0x%x)", -errorCode);