summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Gehör <pekka.gehor@qt.io>2021-10-14 08:36:19 +0300
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-11-09 16:14:20 +0000
commitcb649e195a7a3a81a1df1abd99b8e60fe30ce5ce (patch)
treeb581ae30ce11f2cad5649d01d8be88ffd3b93a2d
parenta991850c5aef363ff960b4ff7a7753a69741a732 (diff)
downloadqtmultimedia-cb649e195a7a3a81a1df1abd99b8e60fe30ce5ce.tar.gz
Android: Fix for crashes issue of the Spectrum example
The Spectrum app does not crash anymore after the fix. Fixes: QTBUG-96953 Change-Id: Ia555bdd21c3bc1ab0ada585c49441d6f8f548f8d Reviewed-by: Samuel Mira <samuel.mira@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io> (cherry picked from commit b9d508b7bb15d067c50ed6fbee8cae2cd6ee3cd0) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--examples/multimedia/spectrum/engine.cpp34
-rw-r--r--examples/multimedia/spectrum/engine.h2
-rw-r--r--examples/multimedia/spectrum/mainwidget.cpp18
-rw-r--r--examples/multimedia/spectrum/mainwidget.h2
4 files changed, 51 insertions, 5 deletions
diff --git a/examples/multimedia/spectrum/engine.cpp b/examples/multimedia/spectrum/engine.cpp
index 2a6a50168..bbbe08a67 100644
--- a/examples/multimedia/spectrum/engine.cpp
+++ b/examples/multimedia/spectrum/engine.cpp
@@ -252,6 +252,9 @@ void Engine::startRecording()
void Engine::startPlayback()
{
+ if (!m_audioOutput)
+ initialize();
+
if (m_audioOutput) {
if (QAudioDevice::Output == m_mode &&
QAudio::SuspendedState == m_state) {
@@ -409,6 +412,7 @@ void Engine::audioStateChanged(QAudio::State state)
break;
}
if (QAudio::NoError != error) {
+ emitError(error);
reset();
return;
}
@@ -466,8 +470,8 @@ void Engine::reset()
stopRecording();
stopPlayback();
setState(QAudioDevice::Input, QAudio::StoppedState);
- setFormat(QAudioFormat());
m_generateTone = false;
+ setFormat(QAudioFormat());
delete m_file;
m_file = nullptr;
delete m_analysisFile;
@@ -586,6 +590,7 @@ void Engine::stopRecording()
m_audioInput->disconnect();
}
m_audioInputIODevice = nullptr;
+ m_notifyTimer->stop();
#ifdef DUMP_AUDIO
dumpData();
@@ -600,6 +605,7 @@ void Engine::stopPlayback()
m_audioOutput->disconnect();
setPlayPosition(0);
}
+ m_notifyTimer->stop();
}
void Engine::setState(QAudio::State state)
@@ -707,6 +713,32 @@ void Engine::setLevel(qreal rmsLevel, qreal peakLevel, int numSamples)
emit levelChanged(m_rmsLevel, m_peakLevel, numSamples);
}
+void Engine::emitError(QAudio::Error error)
+{
+ QString errorString;
+ switch (error) {
+ case QAudio::NoError:
+ errorString = tr("NoError");
+ break;
+ case QAudio::OpenError:
+ errorString = tr("OpenError: An error occurred opening the audio device.");
+ break;
+ case QAudio::IOError:
+ errorString = tr("IOError: An error occurred during read/write of audio device.");
+ break;
+ case QAudio::UnderrunError:
+ errorString = tr("UnderrunError: Audio data is not being fed"
+ "to the audio device at a fast enough rate.");
+ break;
+ case QAudio::FatalError:
+ errorString = tr("FatalError: A non-recoverable error has occurred,"
+ "the audio device is not usable at this time.");
+ break;
+ }
+
+ emit errorMessage(tr("Audio Device"), errorString);
+}
+
#ifdef DUMP_DATA
void Engine::createOutputDir()
{
diff --git a/examples/multimedia/spectrum/engine.h b/examples/multimedia/spectrum/engine.h
index 449884251..7f7028bab 100644
--- a/examples/multimedia/spectrum/engine.h
+++ b/examples/multimedia/spectrum/engine.h
@@ -112,7 +112,6 @@ public:
* Stop any ongoing recording or playback, and reset to ground state.
*/
void reset();
-
/**
* Load data from WAV file
*/
@@ -266,6 +265,7 @@ private:
void calculateLevel(qint64 position, qint64 length);
void calculateSpectrum(qint64 position);
void setLevel(qreal rmsLevel, qreal peakLevel, int numSamples);
+ void emitError(QAudio::Error error);
#ifdef DUMP_DATA
void createOutputDir();
diff --git a/examples/multimedia/spectrum/mainwidget.cpp b/examples/multimedia/spectrum/mainwidget.cpp
index 2dbfda9ab..b72b01bac 100644
--- a/examples/multimedia/spectrum/mainwidget.cpp
+++ b/examples/multimedia/spectrum/mainwidget.cpp
@@ -96,6 +96,7 @@ MainWidget::MainWidget(QWidget *parent)
, m_loadFileAction(nullptr)
, m_generateToneAction(nullptr)
, m_recordAction(nullptr)
+ , m_errorOccurred(false)
{
m_spectrograph->setParams(SpectrumNumBands, SpectrumLowFreq, SpectrumHighFreq);
@@ -158,6 +159,8 @@ void MainWidget::infoMessage(const QString &message, int timeoutMs)
void MainWidget::errorMessage(const QString &heading, const QString &detail)
{
QMessageBox::warning(this, heading, detail, QMessageBox::Close);
+ m_errorOccurred = true;
+ reset();
}
void MainWidget::timerEvent(QTimerEvent *event)
@@ -190,6 +193,7 @@ void MainWidget::bufferLengthChanged(qint64 length)
void MainWidget::showFileDialog()
{
+ m_errorOccurred = false;
const QString dir;
const QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Open WAV file"), dir, "*.wav");
if (fileNames.count()) {
@@ -214,6 +218,7 @@ void MainWidget::showSettingsDialog()
void MainWidget::showToneGeneratorDialog()
{
+ m_errorOccurred = false;
m_toneGeneratorDialog->exec();
if (m_toneGeneratorDialog->result() == QDialog::Accepted) {
reset();
@@ -228,12 +233,14 @@ void MainWidget::showToneGeneratorDialog()
updateButtonStates();
}
} else {
+ setMode(NoMode);
updateModeMenu();
}
}
void MainWidget::initializeRecord()
{
+ m_errorOccurred = false;
reset();
setMode(RecordMode);
if (m_engine->initializeRecord())
@@ -413,17 +420,18 @@ void MainWidget::updateButtonStates()
(QAudio::ActiveState != m_engine->state() &&
QAudio::IdleState != m_engine->state())) &&
RecordMode == m_mode);
- m_recordButton->setEnabled(recordEnabled);
+ m_recordButton->setEnabled(m_errorOccurred ? false : recordEnabled);
const bool pauseEnabled = (QAudio::ActiveState == m_engine->state() ||
QAudio::IdleState == m_engine->state());
- m_pauseButton->setEnabled(pauseEnabled);
+ m_pauseButton->setEnabled(m_errorOccurred ? false : pauseEnabled);
const bool playEnabled = (/*m_engine->dataLength() &&*/
(QAudioDevice::Output != m_engine->mode() ||
(QAudio::ActiveState != m_engine->state() &&
QAudio::IdleState != m_engine->state())));
- m_playButton->setEnabled(playEnabled);
+
+ m_playButton->setEnabled(m_errorOccurred ? false : playEnabled);
}
void MainWidget::reset()
@@ -435,6 +443,10 @@ void MainWidget::reset()
m_levelMeter->reset();
m_spectrograph->reset();
m_progressBar->reset();
+ if (m_errorOccurred) {
+ setMode(Mode::NoMode);
+ updateButtonStates();
+ }
}
void MainWidget::setMode(Mode mode)
diff --git a/examples/multimedia/spectrum/mainwidget.h b/examples/multimedia/spectrum/mainwidget.h
index d2340daae..0eae08af0 100644
--- a/examples/multimedia/spectrum/mainwidget.h
+++ b/examples/multimedia/spectrum/mainwidget.h
@@ -152,6 +152,8 @@ private:
QAction* m_loadFileAction;
QAction* m_generateToneAction;
QAction* m_recordAction;
+ bool m_errorOccurred;
+
};
#endif // MAINWIDGET_H