summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPiotr Srebrny <piotr.srebrny@qt.io>2022-04-07 16:29:39 +0200
committerPiotr Srebrny <piotr.srebrny@qt.io>2022-04-26 19:35:28 +0200
commit65772a78718d44bee65f7846cec55cf3078d24ba (patch)
treed6de632c706484cc67c690b073ff9da4c0e842b9 /tests
parent983e50fbef960086e05d7de4f13a534216f76d66 (diff)
Restart pulling data if QIODevice signals readyRead
This patch improves handling of the QIODevice protocol by QAudioSink in the pull mode. QAudioSink will restart pulling data when it receives the readyRead signal. If the QIODevice source is atEnd(), QAudioSink will no longer emit UnderrunError, but will switch to IdleState without error. It will first check if the device is open and ask for bytesAvailable before performing read. Change-Id: Idd1d18419f7b77d2df2d76e7b1892194d652d63a Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/integration/qaudiosink/tst_qaudiosink.cpp66
1 files changed, 65 insertions, 1 deletions
diff --git a/tests/auto/integration/qaudiosink/tst_qaudiosink.cpp b/tests/auto/integration/qaudiosink/tst_qaudiosink.cpp
index 64da57efa..d957cecc7 100644
--- a/tests/auto/integration/qaudiosink/tst_qaudiosink.cpp
+++ b/tests/auto/integration/qaudiosink/tst_qaudiosink.cpp
@@ -51,7 +51,6 @@ public:
private slots:
void initTestCase();
-
void format();
void invalidFormat_data();
void invalidFormat();
@@ -68,6 +67,7 @@ private slots:
void pullSuspendResume_data(){generate_audiofile_testrows();}
void pullSuspendResume();
+ void pullResumeFromUnderrun();
void push_data(){generate_audiofile_testrows();}
void push();
@@ -513,6 +513,70 @@ void tst_QAudioSink::pullSuspendResume()
audioFile->close();
}
+class AudioPullSource : public QIODevice
+{
+ Q_OBJECT
+public:
+ qint64 readData(char *data, qint64 len) override {
+ qint64 read = qMin(len, available);
+ available -= read;
+ memset(data, 0, read);
+ return read;
+ }
+ qint64 writeData(const char *, qint64) override { return 0; }
+ bool isSequential() const override { return true; }
+
+ qint64 bytesAvailable() const override { return available; }
+ bool atEnd() const override { return signalEnd && available == 0; }
+
+ qint64 available = 0;
+ bool signalEnd = false;
+};
+
+void tst_QAudioSink::pullResumeFromUnderrun()
+{
+ AudioPullSource audioSource;
+ QAudioFormat format;
+ format.setChannelCount(1);
+ format.setSampleFormat(QAudioFormat::UInt8);
+ format.setSampleRate(1024);
+ QAudioSink audioOutput(format, this);
+
+ QSignalSpy stateSignal(&audioOutput, SIGNAL(stateChanged(QAudio::State)));
+
+ audioSource.open(QIODeviceBase::ReadOnly);
+ audioSource.available = 128;
+ audioOutput.start(&audioSource);
+
+ QTRY_VERIFY(stateSignal.count() == 1);
+ QVERIFY(audioOutput.state() == QAudio::ActiveState);
+ QVERIFY(audioOutput.error() == QAudio::NoError);
+ stateSignal.clear();
+
+ QTRY_VERIFY(stateSignal.count() == 1);
+ QVERIFY(audioOutput.state() == QAudio::IdleState);
+ QVERIFY(audioOutput.error() == QAudio::UnderrunError);
+ stateSignal.clear();
+
+ QTest::qWait(300);
+ audioSource.available = 128;
+ audioSource.signalEnd = true;
+
+ // Resume pull
+ emit audioSource.readyRead();
+
+ QTRY_VERIFY(stateSignal.count() == 1);
+ QVERIFY(audioOutput.state() == QAudio::ActiveState);
+ QVERIFY(audioOutput.error() == QAudio::NoError);
+ stateSignal.clear();
+
+ QTRY_VERIFY(stateSignal.count() == 1);
+ QVERIFY(audioOutput.state() == QAudio::IdleState);
+ QVERIFY(audioOutput.error() == QAudio::NoError);
+
+ QTRY_COMPARE(audioOutput.processedUSecs(), 250000);
+}
+
void tst_QAudioSink::push()
{
QFETCH(FilePtr, audioFile);