diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-01-27 19:31:13 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-02-09 14:33:28 +0000 |
commit | 89f4db5857ea0c30c52510785f505a9217750db5 (patch) | |
tree | 9f8ed97cddf1ae0c21a8a5d829e61ee8401a8fcd /examples/multimedia/audiooutput | |
parent | c401a0dc71dc49cd34f8a5dd2fd7320f451e98bf (diff) |
Cleanup QAudioFormat and friends
Reduce the amount of available formats, and always
use host endianness.
Return both sample rate and channel count as a range,
not a list of values.
Change-Id: I88389b49ace077764fb647f50834236448e55c0e
Reviewed-by: Doris Verria <doris.verria@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'examples/multimedia/audiooutput')
-rw-r--r-- | examples/multimedia/audiooutput/audiooutput.cpp | 54 |
1 files changed, 18 insertions, 36 deletions
diff --git a/examples/multimedia/audiooutput/audiooutput.cpp b/examples/multimedia/audiooutput/audiooutput.cpp index e2133d941..971972cab 100644 --- a/examples/multimedia/audiooutput/audiooutput.cpp +++ b/examples/multimedia/audiooutput/audiooutput.cpp @@ -76,10 +76,9 @@ void Generator::stop() void Generator::generateData(const QAudioFormat &format, qint64 durationUs, int sampleRate) { - const int channelBytes = format.sampleSize() / 8; + const int channelBytes = format.bytesPerSample(); const int sampleBytes = format.channelCount() * channelBytes; - qint64 length = (format.sampleRate() * format.channelCount() * (format.sampleSize() / 8)) - * durationUs / 1000000; + qint64 length = format.bytesForDuration(durationUs); Q_ASSERT(length % sampleBytes == 0); Q_UNUSED(sampleBytes); // suppress warning in release builds @@ -91,28 +90,21 @@ void Generator::generateData(const QAudioFormat &format, qint64 durationUs, int // Produces value (-1..1) const qreal x = qSin(2 * M_PI * sampleRate * qreal(sampleIndex++ % format.sampleRate()) / format.sampleRate()); for (int i=0; i<format.channelCount(); ++i) { - if (format.sampleSize() == 8) { - if (format.sampleType() == QAudioFormat::UnSignedInt) { - const quint8 value = static_cast<quint8>((1.0 + x) / 2 * 255); - *reinterpret_cast<quint8 *>(ptr) = value; - } else if (format.sampleType() == QAudioFormat::SignedInt) { - const qint8 value = static_cast<qint8>(x * 127); - *reinterpret_cast<qint8 *>(ptr) = value; - } - } else if (format.sampleSize() == 16) { - if (format.sampleType() == QAudioFormat::UnSignedInt) { - quint16 value = static_cast<quint16>((1.0 + x) / 2 * 65535); - if (format.byteOrder() == QAudioFormat::LittleEndian) - qToLittleEndian<quint16>(value, ptr); - else - qToBigEndian<quint16>(value, ptr); - } else if (format.sampleType() == QAudioFormat::SignedInt) { - qint16 value = static_cast<qint16>(x * 32767); - if (format.byteOrder() == QAudioFormat::LittleEndian) - qToLittleEndian<qint16>(value, ptr); - else - qToBigEndian<qint16>(value, ptr); - } + switch(format.sampleFormat()) { + case QAudioFormat::UInt8: + *reinterpret_cast<quint8 *>(ptr) = static_cast<quint8>((1.0 + x) / 2 * 255); + break; + case QAudioFormat::Int16: + *reinterpret_cast<qint16 *>(ptr) = static_cast<qint16>(x * 32767); + break; + case QAudioFormat::Int32: + *reinterpret_cast<qint32 *>(ptr) = static_cast<qint32>(x * std::numeric_limits<qint32>::max()); + break; + case QAudioFormat::Float: + *reinterpret_cast<float *>(ptr) = x; + break; + default: + break; } ptr += channelBytes; @@ -204,17 +196,7 @@ void AudioTest::initializeWindow() void AudioTest::initializeAudio(const QAudioDeviceInfo &deviceInfo) { - QAudioFormat format; - format.setSampleRate(44100); - format.setChannelCount(1); - format.setSampleSize(16); - format.setByteOrder(QAudioFormat::LittleEndian); - format.setSampleType(QAudioFormat::SignedInt); - - if (!deviceInfo.isFormatSupported(format)) { - qWarning() << "Default format not supported - trying to use nearest"; - format = deviceInfo.nearestFormat(format); - } + QAudioFormat format = deviceInfo.preferredFormat(); const int durationSeconds = 1; const int toneSampleRateHz = 600; |