Added data driven integration tests for qaudiooutput.

Change-Id: Ifde39817405557b073fbe60d612d01f48b9ec3ed
Reviewed-by: Mithra Pattison <mithra.pattison@nokia.com>
Reviewed-by: Michael Goddard <michael.goddard@nokia.com>
This commit is contained in:
Mylione Anadarajah
2012-07-16 16:13:48 +10:00
committed by Qt by Nokia
parent 1ac9318645
commit 0e550eaae9

View File

@@ -68,7 +68,7 @@
QTest::qWait(__step); \
} \
QVERIFY2(__expr,__msg); \
} while(0)
} while (0)
#endif
class tst_QAudioOutput : public QObject
@@ -84,22 +84,34 @@ private slots:
void invalidFormat_data();
void invalidFormat();
void bufferSize_data();
void bufferSize();
void notifyInterval_data();
void notifyInterval();
void disableNotifyInterval();
void stopWhileStopped();
void suspendWhileStopped();
void resumeWhileStopped();
void pull_data(){generate_audiofile_testrows();}
void pull();
void pullSuspendResume_data(){generate_audiofile_testrows();}
void pullSuspendResume();
void push_data(){generate_audiofile_testrows();}
void push();
void pushSuspendResume_data(){generate_audiofile_testrows();}
void pushSuspendResume();
void pushUnderrun_data(){generate_audiofile_testrows();}
void pushUnderrun();
void volume_data();
void volume();
private:
@@ -108,6 +120,8 @@ private:
QString formatToFileName(const QAudioFormat &format);
void createSineWaveData(const QAudioFormat &format, qint64 length, int sampleRate = 440);
void generate_audiofile_testrows();
QAudioDeviceInfo audioDevice;
QList<QAudioFormat> testFormats;
QList<FilePtr> audioFiles;
@@ -180,6 +194,21 @@ void tst_QAudioOutput::createSineWaveData(const QAudioFormat &format, qint64 len
Q_ASSERT(m_buffer->open(QIODevice::ReadOnly));
}
void tst_QAudioOutput::generate_audiofile_testrows()
{
QTest::addColumn<FilePtr>("audioFile");
QTest::addColumn<QAudioFormat>("audioFormat");
for (int i=0; i<audioFiles.count(); i++) {
QTest::newRow(QString("Audio File %1").arg(i).toLocal8Bit().constData())
<< audioFiles.at(i) << testFormats.at(i);
// Only run first format in CI system to reduce test times
if (m_inCISystem)
break;
}
}
void tst_QAudioOutput::initTestCase()
{
qRegisterMetaType<QAudioFormat>();
@@ -329,53 +358,47 @@ void tst_QAudioOutput::invalidFormat()
QTRY_VERIFY2((audioOutput.error() == QAudio::OpenError),"error() was not set to QAudio::OpenError after start()");
}
void tst_QAudioOutput::bufferSize_data()
{
QTest::addColumn<int>("bufferSize");
QTest::newRow("Buffer size 512") << 512;
QTest::newRow("Buffer size 4096") << 4096;
QTest::newRow("Buffer size 8192") << 8192;
}
void tst_QAudioOutput::bufferSize()
{
QFETCH(int, bufferSize);
QAudioOutput audioOutput(audioDevice.preferredFormat(), this);
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() was not set to QAudio::NoError on creation");
QVERIFY2((audioOutput.error() == QAudio::NoError), QString("error() was not set to QAudio::NoError on creation(%1)").arg(bufferSize).toLocal8Bit().constData());
audioOutput.setBufferSize(512);
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() is not QAudio::NoError after setBufferSize(512)");
QVERIFY2((audioOutput.bufferSize() == 512),
QString("bufferSize: requested=512, actual=%2").arg(audioOutput.bufferSize()).toLocal8Bit().constData());
audioOutput.setBufferSize(bufferSize);
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() is not QAudio::NoError after setBufferSize");
QVERIFY2((audioOutput.bufferSize() == bufferSize),
QString("bufferSize: requested=%1, actual=%2").arg(bufferSize).arg(audioOutput.bufferSize()).toLocal8Bit().constData());
}
audioOutput.setBufferSize(4096);
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() is not QAudio::NoError after setBufferSize(4096)");
QVERIFY2((audioOutput.bufferSize() == 4096),
QString("bufferSize: requested=4096, actual=%2").arg(audioOutput.bufferSize()).toLocal8Bit().constData());
audioOutput.setBufferSize(8192);
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() is not QAudio::NoError after setBufferSize(8192)");
QVERIFY2((audioOutput.bufferSize() == 8192),
QString("bufferSize: requested=8192, actual=%2").arg(audioOutput.bufferSize()).toLocal8Bit().constData());
void tst_QAudioOutput::notifyInterval_data()
{
QTest::addColumn<int>("interval");
QTest::newRow("Notify interval 50") << 50;
QTest::newRow("Notify interval 100") << 100;
QTest::newRow("Notify interval 250") << 250;
QTest::newRow("Notify interval 1000") << 1000;
}
void tst_QAudioOutput::notifyInterval()
{
QFETCH(int, interval);
QAudioOutput audioOutput(audioDevice.preferredFormat(), this);
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() was not set to QAudio::NoError on creation");
audioOutput.setNotifyInterval(50);
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() is not QAudio::NoError after setNotifyInterval(50)");
QVERIFY2((audioOutput.notifyInterval() == 50),
QString("notifyInterval: requested=50, actual=%2").arg(audioOutput.notifyInterval()).toLocal8Bit().constData());
audioOutput.setNotifyInterval(100);
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() is not QAudio::NoError after setNotifyInterval(100)");
QVERIFY2((audioOutput.notifyInterval() == 100),
QString("notifyInterval: requested=100, actual=%2").arg(audioOutput.notifyInterval()).toLocal8Bit().constData());
audioOutput.setNotifyInterval(250);
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() is not QAudio::NoError after setNotifyInterval(250)");
QVERIFY2((audioOutput.notifyInterval() == 250),
QString("notifyInterval: requested=250, actual=%2").arg(audioOutput.notifyInterval()).toLocal8Bit().constData());
audioOutput.setNotifyInterval(1000);
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() is not QAudio::NoError after setNotifyInterval(1000)");
QVERIFY2((audioOutput.notifyInterval() == 1000),
QString("notifyInterval: requested=1000, actual=%2").arg(audioOutput.notifyInterval()).toLocal8Bit().constData());
audioOutput.setNotifyInterval(interval);
QVERIFY2((audioOutput.error() == QAudio::NoError), QString("error() is not QAudio::NoError after setNotifyInterval(%1)").arg(interval).toLocal8Bit().constData());
QVERIFY2((audioOutput.notifyInterval() == interval),
QString("notifyInterval: requested=%1, actual=%2").arg(interval).arg(audioOutput.notifyInterval()).toLocal8Bit().constData());
}
void tst_QAudioOutput::disableNotifyInterval()
@@ -479,8 +502,10 @@ void tst_QAudioOutput::resumeWhileStopped()
void tst_QAudioOutput::pull()
{
for(int i=0; i<audioFiles.count(); i++) {
QAudioOutput audioOutput(testFormats.at(i), this);
QFETCH(FilePtr, audioFile);
QFETCH(QAudioFormat, audioFormat);
QAudioOutput audioOutput(audioFormat, this);
audioOutput.setNotifyInterval(100);
audioOutput.setVolume(0.1f);
@@ -493,12 +518,11 @@ void tst_QAudioOutput::pull()
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() was not set to QAudio::NoError before start()");
QVERIFY2((audioOutput.elapsedUSecs() == qint64(0)),"elapsedUSecs() not zero on creation");
QFile *audioFile = audioFiles.at(i).data();
audioFile->close();
audioFile->open(QIODevice::ReadOnly);
audioFile->seek(WavHeader::headerLength());
audioOutput.start(audioFile);
audioOutput.start(audioFile.data());
// Check that QAudioOutput immediately transitions to ActiveState
QTRY_VERIFY2((stateSignal.count() == 1),
@@ -536,11 +560,6 @@ void tst_QAudioOutput::pull()
QVERIFY2(notifySignal.count() > 0, "not emitting notify() signal");
audioFile->close();
// Only run first format in CI system to reduce test times
if (m_inCISystem)
break;
}
}
void tst_QAudioOutput::pullSuspendResume()
@@ -549,8 +568,9 @@ void tst_QAudioOutput::pullSuspendResume()
if (m_inCISystem)
QSKIP("QTBUG-26504 Fails 20% of time with pulseaudio backend");
#endif
for(int i=0; i<audioFiles.count(); i++) {
QAudioOutput audioOutput(testFormats.at(i), this);
QFETCH(FilePtr, audioFile);
QFETCH(QAudioFormat, audioFormat);
QAudioOutput audioOutput(audioFormat, this);
audioOutput.setNotifyInterval(100);
audioOutput.setVolume(0.1f);
@@ -563,12 +583,11 @@ void tst_QAudioOutput::pullSuspendResume()
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() was not set to QAudio::NoError before start()");
QVERIFY2((audioOutput.elapsedUSecs() == qint64(0)),"elapsedUSecs() not zero on creation");
QFile *audioFile = audioFiles.at(i).data();
audioFile->close();
audioFile->open(QIODevice::ReadOnly);
audioFile->seek(WavHeader::headerLength());
audioOutput.start(audioFile);
audioOutput.start(audioFile.data());
// Check that QAudioOutput immediately transitions to ActiveState
QTRY_VERIFY2((stateSignal.count() == 1),
QString("didn't emit signal on start(), got %1 signals instead").arg(stateSignal.count()).toLocal8Bit().constData());
@@ -634,17 +653,14 @@ void tst_QAudioOutput::pullSuspendResume()
QVERIFY2((audioOutput.elapsedUSecs() == (qint64)0), "elapsedUSecs() not equal to zero in StoppedState");
audioFile->close();
// Only run first format in CI system to reduce test times
if (m_inCISystem)
break;
}
}
void tst_QAudioOutput::push()
{
for(int i=0; i<audioFiles.count(); i++) {
QAudioOutput audioOutput(testFormats.at(i), this);
QFETCH(FilePtr, audioFile);
QFETCH(QAudioFormat, audioFormat);
QAudioOutput audioOutput(audioFormat, this);
audioOutput.setNotifyInterval(100);
audioOutput.setVolume(0.1f);
@@ -657,7 +673,6 @@ void tst_QAudioOutput::push()
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() was not set to QAudio::NoError before start()");
QVERIFY2((audioOutput.elapsedUSecs() == qint64(0)),"elapsedUSecs() not zero on creation");
QFile *audioFile = audioFiles.at(i).data();
audioFile->close();
audioFile->open(QIODevice::ReadOnly);
audioFile->seek(WavHeader::headerLength());
@@ -725,11 +740,6 @@ void tst_QAudioOutput::push()
QVERIFY2(notifySignal.count() > 0, "not emitting notify signal");
audioFile->close();
// Only run first format in CI system to reduce test times
if (m_inCISystem)
break;
}
}
void tst_QAudioOutput::pushSuspendResume()
@@ -738,8 +748,10 @@ void tst_QAudioOutput::pushSuspendResume()
if (m_inCISystem)
QSKIP("QTBUG-26504 Fails 20% of time with pulseaudio backend");
#endif
for(int i=0; i<audioFiles.count(); i++) {
QAudioOutput audioOutput(testFormats.at(i), this);
QFETCH(FilePtr, audioFile);
QFETCH(QAudioFormat, audioFormat);
QAudioOutput audioOutput(audioFormat, this);
audioOutput.setNotifyInterval(100);
audioOutput.setVolume(0.1f);
@@ -752,7 +764,6 @@ void tst_QAudioOutput::pushSuspendResume()
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() was not set to QAudio::NoError before start()");
QVERIFY2((audioOutput.elapsedUSecs() == qint64(0)),"elapsedUSecs() not zero on creation");
QFile *audioFile = audioFiles.at(i).data();
audioFile->close();
audioFile->open(QIODevice::ReadOnly);
audioFile->seek(WavHeader::headerLength());
@@ -861,17 +872,14 @@ void tst_QAudioOutput::pushSuspendResume()
QVERIFY2((audioOutput.elapsedUSecs() == (qint64)0), "elapsedUSecs() not equal to zero in StoppedState");
audioFile->close();
// Only run first format in CI system to reduce test times
if (m_inCISystem)
break;
}
}
void tst_QAudioOutput::pushUnderrun()
{
for(int i=0; i<audioFiles.count(); i++) {
QAudioOutput audioOutput(testFormats.at(i), this);
QFETCH(FilePtr, audioFile);
QFETCH(QAudioFormat, audioFormat);
QAudioOutput audioOutput(audioFormat, this);
audioOutput.setNotifyInterval(100);
audioOutput.setVolume(0.1f);
@@ -884,7 +892,6 @@ void tst_QAudioOutput::pushUnderrun()
QVERIFY2((audioOutput.error() == QAudio::NoError), "error() was not set to QAudio::NoError before start()");
QVERIFY2((audioOutput.elapsedUSecs() == qint64(0)),"elapsedUSecs() not zero on creation");
QFile *audioFile = audioFiles.at(i).data();
audioFile->close();
audioFile->open(QIODevice::ReadOnly);
audioFile->seek(WavHeader::headerLength());
@@ -982,34 +989,28 @@ void tst_QAudioOutput::pushUnderrun()
QVERIFY2((audioOutput.elapsedUSecs() == (qint64)0), "elapsedUSecs() not equal to zero in StoppedState");
audioFile->close();
}
// Only run first format in CI system to reduce test times
if (m_inCISystem)
break;
}
void tst_QAudioOutput::volume_data()
{
QTest::addColumn<float>("actualFloat");
QTest::addColumn<int>("expectedInt");
QTest::newRow("Volume 0.3") << 0.3f << 3;
QTest::newRow("Volume 0.6") << 0.6f << 6;
QTest::newRow("Volume 0.9") << 0.9f << 9;
}
void tst_QAudioOutput::volume()
{
QFETCH(float, actualFloat);
QFETCH(int, expectedInt);
QAudioOutput audioOutput(audioDevice.preferredFormat(), this);
audioOutput.setVolume(0.3f);
QTRY_VERIFY(qRound(audioOutput.volume()*10.0f) == 3);
audioOutput.setVolume(actualFloat);
QTRY_VERIFY(qRound(audioOutput.volume()*10.0f) == expectedInt);
// Wait a while to see if this changes
QTest::qWait(500);
QTRY_VERIFY(qRound(audioOutput.volume()*10.0f) == 3);
audioOutput.setVolume(0.6f);
QTRY_VERIFY(qRound(audioOutput.volume()*10.0f) == 6);
// Wait a while to see if this changes
QTest::qWait(500);
QTRY_VERIFY(qRound(audioOutput.volume()*10.0f) == 6);
audioOutput.setVolume(0.9f);
QTRY_VERIFY(qRound(audioOutput.volume()*10.0f) == 9);
// Wait a while to see if this changes
QTest::qWait(500);
QTRY_VERIFY(qRound(audioOutput.volume()*10.0f) == 9);
QTRY_VERIFY(qRound(audioOutput.volume()*10.0f) == expectedInt);
}
QTEST_MAIN(tst_QAudioOutput)