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

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