From cb649e195a7a3a81a1df1abd99b8e60fe30ce5ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pekka=20Geh=C3=B6r?= Date: Thu, 14 Oct 2021 08:36:19 +0300 Subject: 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 Reviewed-by: Lars Knoll (cherry picked from commit b9d508b7bb15d067c50ed6fbee8cae2cd6ee3cd0) Reviewed-by: Qt Cherry-pick Bot --- examples/multimedia/spectrum/engine.cpp | 34 ++++++++++++++++++++++++++++- examples/multimedia/spectrum/engine.h | 2 +- examples/multimedia/spectrum/mainwidget.cpp | 18 ++++++++++++--- examples/multimedia/spectrum/mainwidget.h | 2 ++ 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 -- cgit v1.2.3