diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2022-10-17 14:18:12 +0200 |
---|---|---|
committer | Artem Dyomin <artem.dyomin@qt.io> | 2022-10-18 13:51:46 +0200 |
commit | 59997dcedce9cc93dfaa32926e45c36a23564d41 (patch) | |
tree | 68268a280f6511a6814de63a4f9c2f84d998d56d /tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp | |
parent | 561c0c06398b0a45b7d03efcabf772b590bb7021 (diff) | |
download | qtmultimedia-59997dcedce9cc93dfaa32926e45c36a23564d41.tar.gz |
Apply ffmpeg recoder redisign to AudioDecoder
Additional improvements:
- cover more corners cases by tests.
- add asserts to improve code self-diagnostics
- improve cpp code style: get rid of raw ptrs and goto
Task-number: QTBUG-106259
Change-Id: I4e7ce7e31e00bce3ea1e59a20754785b7cf1199e
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
Diffstat (limited to 'tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp')
-rw-r--r-- | tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp b/tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp index 2fe14272c..b69fb7999 100644 --- a/tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp +++ b/tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp @@ -32,6 +32,11 @@ public slots: void initTestCase(); private slots: + void directBruteForceReading(); + void indirectReading(); + void stopOnBufferReady(); + void restartOnBufferReady(); + void restartOnFinish(); void fileTest(); void unsupportedFileTest(); void corruptedFileTest(); @@ -41,6 +46,7 @@ private slots: private: bool isWavSupported(); QUrl testFileUrl(const QString filePath); + void checkNoMoreChanges(QAudioDecoder &decoder); }; void tst_QAudioDecoderBackend::init() @@ -85,6 +91,206 @@ QUrl tst_QAudioDecoderBackend::testFileUrl(const QString filePath) return url; } +void tst_QAudioDecoderBackend::checkNoMoreChanges(QAudioDecoder &decoder) +{ + QSignalSpy finishedSpy(&decoder, &QAudioDecoder::finished); + QSignalSpy bufferReadySpy(&decoder, &QAudioDecoder::bufferReady); + QSignalSpy bufferAvailableSpy(&decoder, &QAudioDecoder::bufferAvailableChanged); + + QTest::qWait(50); // wait a bit to check nothing happened after finish + + QCOMPARE(finishedSpy.size(), 0); + QCOMPARE(bufferReadySpy.size(), 0); + QCOMPARE(bufferAvailableSpy.size(), 0); +} + +void tst_QAudioDecoderBackend::directBruteForceReading() +{ + if (!isWavSupported()) + QSKIP("Sound format is not supported"); + + QAudioDecoder decoder; + if (decoder.error() == QAudioDecoder::NotSupportedError) + QSKIP("There is no audio decoding support on this platform."); + + int sampleCount = 0; + + decoder.setSource(testFileUrl(TEST_FILE_NAME)); + QVERIFY(!decoder.isDecoding()); + QVERIFY(!decoder.bufferAvailable()); + + decoder.start(); + + auto waitAndCheck = [](auto &&predicate) { QVERIFY(QTest::qWaitFor(predicate)); }; + + auto waitForBufferAvailable = [&]() { + waitAndCheck([&]() { return !decoder.isDecoding() || decoder.bufferAvailable(); }); + + return decoder.bufferAvailable(); + }; + + while (waitForBufferAvailable()) { + auto buffer = decoder.read(); + QVERIFY(buffer.isValid()); + + sampleCount += buffer.sampleCount(); + } + + checkNoMoreChanges(decoder); + + QCOMPARE(sampleCount, 44094); +} + +void tst_QAudioDecoderBackend::indirectReading() +{ + if (!isWavSupported()) + QSKIP("Sound format is not supported"); + + QAudioDecoder decoder; + if (decoder.error() == QAudioDecoder::NotSupportedError) + QSKIP("There is no audio decoding support on this platform."); + + int sampleCount = 0; + + connect(&decoder, &QAudioDecoder::bufferReady, [&]() { + QVERIFY(decoder.bufferAvailable()); + QVERIFY(decoder.isDecoding()); + + auto buffer = decoder.read(); + QVERIFY(buffer.isValid()); + QVERIFY(!decoder.bufferAvailable()); + + sampleCount += buffer.sampleCount(); + }); + + QSignalSpy finishSpy(&decoder, &QAudioDecoder::finished); + + decoder.setSource(testFileUrl(TEST_FILE_NAME)); + QVERIFY(!decoder.isDecoding()); + QVERIFY(!decoder.bufferAvailable()); + + decoder.start(); + QVERIFY(decoder.isDecoding()); + + QVERIFY(finishSpy.wait()); + QVERIFY(!decoder.isDecoding()); + + checkNoMoreChanges(decoder); + + QCOMPARE(sampleCount, 44094); + QCOMPARE(finishSpy.size(), 1); +} + +void tst_QAudioDecoderBackend::stopOnBufferReady() +{ + if (!isWavSupported()) + QSKIP("Sound format is not supported"); + + QAudioDecoder decoder; + if (decoder.error() == QAudioDecoder::NotSupportedError) + QSKIP("There is no audio decoding support on this platform."); + + connect(&decoder, &QAudioDecoder::bufferReady, [&]() { + decoder.read(); // run next reading + decoder.stop(); + }); + + QSignalSpy finishSpy(&decoder, &QAudioDecoder::finished); + QSignalSpy bufferReadySpy(&decoder, &QAudioDecoder::bufferReady); + + decoder.setSource(testFileUrl(TEST_FILE_NAME)); + decoder.start(); + + QVERIFY(finishSpy.wait()); + QVERIFY(!decoder.isDecoding()); + + checkNoMoreChanges(decoder); + + QCOMPARE(bufferReadySpy.size(), 1); +} + +void tst_QAudioDecoderBackend::restartOnBufferReady() +{ + if (!isWavSupported()) + QSKIP("Sound format is not supported"); + + QAudioDecoder decoder; + if (decoder.error() == QAudioDecoder::NotSupportedError) + QSKIP("There is no audio decoding support on this platform."); + + int sampleCount = 0; + + std::once_flag restartOnce; + connect(&decoder, &QAudioDecoder::bufferReady, [&]() { + QVERIFY(decoder.bufferAvailable()); + + auto buffer = decoder.read(); + QVERIFY(buffer.isValid()); + QVERIFY(!decoder.bufferAvailable()); + + sampleCount += buffer.sampleCount(); + + std::call_once(restartOnce, [&]() { + sampleCount = 0; + decoder.start(); + }); + }); + + QSignalSpy finishSpy(&decoder, &QAudioDecoder::finished); + + decoder.setSource(testFileUrl(TEST_FILE_NAME)); + decoder.start(); + + QVERIFY(finishSpy.wait()); + QVERIFY(!decoder.isDecoding()); + + checkNoMoreChanges(decoder); + + QCOMPARE(sampleCount, 44094); +} + +void tst_QAudioDecoderBackend::restartOnFinish() +{ + if (!isWavSupported()) + QSKIP("Sound format is not supported"); + + QAudioDecoder decoder; + if (decoder.error() == QAudioDecoder::NotSupportedError) + QSKIP("There is no audio decoding support on this platform."); + + int sampleCount = 0; + + connect(&decoder, &QAudioDecoder::bufferReady, [&]() { + auto buffer = decoder.read(); + QVERIFY(buffer.isValid()); + + sampleCount += buffer.sampleCount(); + }); + + QSignalSpy finishSpy(&decoder, &QAudioDecoder::finished); + + std::once_flag restartOnce; + connect(&decoder, &QAudioDecoder::finished, [&]() { + QVERIFY(!decoder.bufferAvailable()); + QVERIFY(!decoder.isDecoding()); + + std::call_once(restartOnce, [&]() { + sampleCount = 0; + decoder.start(); + }); + }); + + decoder.setSource(testFileUrl(TEST_FILE_NAME)); + decoder.start(); + + QVERIFY(QTest::qWaitFor([&finishSpy]() { return finishSpy.size() == 2; })); + + QVERIFY(!decoder.isDecoding()); + + checkNoMoreChanges(decoder); + QCOMPARE(sampleCount, 44094); +} + void tst_QAudioDecoderBackend::fileTest() { if (!isWavSupported()) |