/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include //TESTED_COMPONENT=src/multimedia class tst_QAudioFormat : public QObject { Q_OBJECT public: tst_QAudioFormat(QObject* parent=0) : QObject(parent) {} private slots: void checkNull(); void checkSampleSize(); void checkCodec(); void checkByteOrder(); void checkSampleType(); void checkEquality(); void checkAssignment(); void checkSampleRate(); void checkChannelCount(); void checkSizes(); void checkSizes_data(); }; void tst_QAudioFormat::checkNull() { // Default constructed QAudioFormat is invalid. QAudioFormat audioFormat0; QVERIFY(!audioFormat0.isValid()); // validity is transferred QAudioFormat audioFormat1(audioFormat0); QVERIFY(!audioFormat1.isValid()); audioFormat0.setSampleRate(44100); audioFormat0.setChannelCount(2); audioFormat0.setSampleSize(16); audioFormat0.setCodec("audio/pcm"); audioFormat0.setSampleType(QAudioFormat::SignedInt); QVERIFY(audioFormat0.isValid()); } void tst_QAudioFormat::checkSampleSize() { QAudioFormat audioFormat; audioFormat.setSampleSize(16); QVERIFY(audioFormat.sampleSize() == 16); } void tst_QAudioFormat::checkCodec() { QAudioFormat audioFormat; audioFormat.setCodec(QString::fromLatin1("audio/pcm")); QVERIFY(audioFormat.codec() == QString::fromLatin1("audio/pcm")); } void tst_QAudioFormat::checkByteOrder() { QAudioFormat audioFormat; audioFormat.setByteOrder(QAudioFormat::LittleEndian); QVERIFY(audioFormat.byteOrder() == QAudioFormat::LittleEndian); QTest::ignoreMessage(QtDebugMsg, "LittleEndian"); qDebug() << QAudioFormat::LittleEndian; audioFormat.setByteOrder(QAudioFormat::BigEndian); QVERIFY(audioFormat.byteOrder() == QAudioFormat::BigEndian); QTest::ignoreMessage(QtDebugMsg, "BigEndian"); qDebug() << QAudioFormat::BigEndian; } void tst_QAudioFormat::checkSampleType() { QAudioFormat audioFormat; audioFormat.setSampleType(QAudioFormat::SignedInt); QVERIFY(audioFormat.sampleType() == QAudioFormat::SignedInt); QTest::ignoreMessage(QtDebugMsg, "SignedInt"); qDebug() << QAudioFormat::SignedInt; audioFormat.setSampleType(QAudioFormat::Unknown); QVERIFY(audioFormat.sampleType() == QAudioFormat::Unknown); QTest::ignoreMessage(QtDebugMsg, "Unknown"); qDebug() << QAudioFormat::Unknown; audioFormat.setSampleType(QAudioFormat::UnSignedInt); QVERIFY(audioFormat.sampleType() == QAudioFormat::UnSignedInt); QTest::ignoreMessage(QtDebugMsg, "UnSignedInt"); qDebug() << QAudioFormat::UnSignedInt; audioFormat.setSampleType(QAudioFormat::Float); QVERIFY(audioFormat.sampleType() == QAudioFormat::Float); QTest::ignoreMessage(QtDebugMsg, "Float"); qDebug() << QAudioFormat::Float; } void tst_QAudioFormat::checkEquality() { QAudioFormat audioFormat0; QAudioFormat audioFormat1; // Null formats are equivalent QVERIFY(audioFormat0 == audioFormat1); QVERIFY(!(audioFormat0 != audioFormat1)); // on filled formats audioFormat0.setSampleRate(8000); audioFormat0.setChannelCount(1); audioFormat0.setSampleSize(8); audioFormat0.setCodec("audio/pcm"); audioFormat0.setByteOrder(QAudioFormat::LittleEndian); audioFormat0.setSampleType(QAudioFormat::UnSignedInt); audioFormat1.setSampleRate(8000); audioFormat1.setChannelCount(1); audioFormat1.setSampleSize(8); audioFormat1.setCodec("audio/pcm"); audioFormat1.setByteOrder(QAudioFormat::LittleEndian); audioFormat1.setSampleType(QAudioFormat::UnSignedInt); QVERIFY(audioFormat0 == audioFormat1); QVERIFY(!(audioFormat0 != audioFormat1)); audioFormat0.setSampleRate(44100); QVERIFY(audioFormat0 != audioFormat1); QVERIFY(!(audioFormat0 == audioFormat1)); } void tst_QAudioFormat::checkAssignment() { QAudioFormat audioFormat0; QAudioFormat audioFormat1; audioFormat0.setSampleRate(8000); audioFormat0.setChannelCount(1); audioFormat0.setSampleSize(8); audioFormat0.setCodec("audio/pcm"); audioFormat0.setByteOrder(QAudioFormat::LittleEndian); audioFormat0.setSampleType(QAudioFormat::UnSignedInt); audioFormat1 = audioFormat0; QVERIFY(audioFormat1 == audioFormat0); QAudioFormat audioFormat2(audioFormat0); QVERIFY(audioFormat2 == audioFormat0); } /* sampleRate() API property test. */ void tst_QAudioFormat::checkSampleRate() { QAudioFormat audioFormat; QVERIFY(audioFormat.sampleRate() == -1); audioFormat.setSampleRate(123); QVERIFY(audioFormat.sampleRate() == 123); } /* channelCount() API property test. */ void tst_QAudioFormat::checkChannelCount() { // channels is the old name for channelCount, so // they should always be equal QAudioFormat audioFormat; QVERIFY(audioFormat.channelCount() == -1); QVERIFY(audioFormat.channelCount() == -1); audioFormat.setChannelCount(123); QVERIFY(audioFormat.channelCount() == 123); QVERIFY(audioFormat.channelCount() == 123); audioFormat.setChannelCount(5); QVERIFY(audioFormat.channelCount() == 5); QVERIFY(audioFormat.channelCount() == 5); } void tst_QAudioFormat::checkSizes() { QFETCH(QAudioFormat, format); QFETCH(int, frameSize); QFETCH(int, byteCount); QFETCH(int, frameCount); QFETCH(qint64, durationForByte); QFETCH(int, byteForFrame); QFETCH(qint64, durationForByteForDuration); QFETCH(int, byteForDuration); QFETCH(int, framesForDuration); QCOMPARE(format.bytesPerFrame(), frameSize); // Byte input QCOMPARE(format.framesForBytes(byteCount), frameCount); QCOMPARE(format.durationForBytes(byteCount), durationForByte); // Framecount input QCOMPARE(format.bytesForFrames(frameCount), byteForFrame); QCOMPARE(format.durationForFrames(frameCount), durationForByte); // Duration input QCOMPARE(format.bytesForDuration(durationForByteForDuration), byteForDuration); QCOMPARE(format.framesForDuration(durationForByte), frameCount); QCOMPARE(format.framesForDuration(durationForByteForDuration), framesForDuration); } void tst_QAudioFormat::checkSizes_data() { QTest::addColumn("format"); QTest::addColumn("frameSize"); QTest::addColumn("byteCount"); QTest::addColumn("durationForByte"); QTest::addColumn("frameCount"); // output of sampleCountforByte, input for byteForFrame QTest::addColumn("byteForFrame"); QTest::addColumn("durationForByteForDuration"); // input for byteForDuration QTest::addColumn("byteForDuration"); QTest::addColumn("framesForDuration"); QAudioFormat f; QTest::newRow("invalid") << f << 0 << 0 << 0LL << 0 << 0 << 0LL << 0 << 0; f.setByteOrder(QAudioFormat::LittleEndian); f.setChannelCount(1); f.setSampleRate(8000); f.setCodec("audio/pcm"); f.setSampleSize(8); f.setSampleType(QAudioFormat::SignedInt); qint64 qrtr = 250000LL; qint64 half = 500000LL; qint64 one = 1000000LL; qint64 two = 2000000LL; // No rounding errors with mono 8 bit QTest::newRow("1ch_8b_8k_signed_4000") << f << 1 << 4000 << half << 4000 << 4000 << half << 4000 << 4000; QTest::newRow("1ch_8b_8k_signed_8000") << f << 1 << 8000 << one << 8000 << 8000 << one << 8000 << 8000; QTest::newRow("1ch_8b_8k_signed_16000") << f << 1 << 16000 << two << 16000 << 16000 << two << 16000 << 16000; // Mono 16bit f.setSampleSize(16); QTest::newRow("1ch_16b_8k_signed_8000") << f << 2 << 8000 << half << 4000 << 8000 << half << 8000 << 4000; QTest::newRow("1ch_16b_8k_signed_16000") << f << 2 << 16000 << one << 8000 << 16000 << one << 16000 << 8000; // Rounding errors QTest::newRow("1ch_16b_8k_signed_8001") << f << 2 << 8001 << half << 4000 << 8000 << half << 8000 << 4000; QTest::newRow("1ch_16b_8k_signed_8000_duration1") << f << 2 << 8000 << half << 4000 << 8000 << half + 1 << 8000 << 4000; QTest::newRow("1ch_16b_8k_signed_8000_duration2") << f << 2 << 8000 << half << 4000 << 8000 << half + 124 << 8000 << 4000; QTest::newRow("1ch_16b_8k_signed_8000_duration3") << f << 2 << 8000 << half << 4000 << 8000 << half + 125 << 8002 << 4001; QTest::newRow("1ch_16b_8k_signed_8000_duration4") << f << 2 << 8000 << half << 4000 << 8000 << half + 126 << 8002 << 4001; // Stereo 16 bit f.setChannelCount(2); QTest::newRow("2ch_16b_8k_signed_8000") << f << 4 << 8000 << qrtr << 2000 << 8000 << qrtr << 8000 << 2000; QTest::newRow("2ch_16b_8k_signed_16000") << f << 4 << 16000 << half << 4000 << 16000 << half << 16000 << 4000; // More rounding errors // First rounding bytes QTest::newRow("2ch_16b_8k_signed_8001") << f << 4 << 8001 << qrtr << 2000 << 8000 << qrtr << 8000 << 2000; QTest::newRow("2ch_16b_8k_signed_8002") << f << 4 << 8002 << qrtr << 2000 << 8000 << qrtr << 8000 << 2000; QTest::newRow("2ch_16b_8k_signed_8003") << f << 4 << 8003 << qrtr << 2000 << 8000 << qrtr << 8000 << 2000; // Then rounding duration // 8khz = 125us per frame QTest::newRow("2ch_16b_8k_signed_8000_duration1") << f << 4 << 8000 << qrtr << 2000 << 8000 << qrtr + 1 << 8000 << 2000; QTest::newRow("2ch_16b_8k_signed_8000_duration2") << f << 4 << 8000 << qrtr << 2000 << 8000 << qrtr + 124 << 8000 << 2000; QTest::newRow("2ch_16b_8k_signed_8000_duration3") << f << 4 << 8000 << qrtr << 2000 << 8000 << qrtr + 125 << 8004 << 2001; QTest::newRow("2ch_16b_8k_signed_8000_duration4") << f << 4 << 8000 << qrtr << 2000 << 8000 << qrtr + 126 << 8004 << 2001; } QTEST_MAIN(tst_QAudioFormat) #include "tst_qaudioformat.moc"