61 using SampleFormat = QAudioFormat::SampleFormat;
64 int ringbufferElements = inferRingbufferFrames(ringbufferSize, m_hardwareBufferFrames, m_format)
65 * m_format.channelCount();
67 switch (m_format.sampleFormat()) {
68 case SampleFormat::Float:
69 m_ringbuffer.emplace<QAudioRingBuffer<
float>>(ringbufferElements);
71 case SampleFormat::Int16:
72 m_ringbuffer.emplace<QAudioRingBuffer<int16_t>>(ringbufferElements);
74 case SampleFormat::Int32:
75 m_ringbuffer.emplace<QAudioRingBuffer<int32_t>>(ringbufferElements);
77 case SampleFormat::UInt8:
78 m_ringbuffer.emplace<QAudioRingBuffer<uint8_t>>(ringbufferElements);
82 qCritical() <<
"invalid sample format";
83 Q_UNREACHABLE_RETURN();
94 const std::optional<int32_t> &hardwareBufferFrames,
95 const QAudioFormat &format)
97 int bytesPerFrame = format.bytesPerFrame();
98 QT_MM_ASSUME(bytesPerFrame > 0);
100 return inferRingbufferBytes(ringbufferSize, hardwareBufferFrames, format) / bytesPerFrame;
105 const std::optional<int32_t> &hardwareBufferFrames,
106 const QAudioFormat &format)
109 const int minimumRingbufferFrames = hardwareBufferFrames ? *hardwareBufferFrames * 2 : 32;
110 const int minimumRingbufferBytes = format.bytesForFrames(minimumRingbufferFrames);
112 return ringbufferSize >= minimumRingbufferBytes ? *ringbufferSize : minimumRingbufferBytes;
114 using namespace std::chrono;
115 static constexpr auto defaultBufferDuration = 250ms;
117 return format.bytesForDuration(microseconds(defaultBufferDuration).count());