From b3df2985b7939fe547df6cf69264283059b581fd Mon Sep 17 00:00:00 2001 From: Jordan Sherer Date: Fri, 11 Oct 2019 23:34:31 -0400 Subject: [PATCH] Fixed some error handling for notifications --- NotificationAudio.cpp | 28 +++++++++++----------------- NotificationAudio.h | 2 +- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/NotificationAudio.cpp b/NotificationAudio.cpp index c6bce81..c76951c 100644 --- a/NotificationAudio.cpp +++ b/NotificationAudio.cpp @@ -33,6 +33,7 @@ void NotificationAudio::init(const QAudioDeviceInfo &device, const QAudioFormat& if(!m_decoder){ m_decoder = new QAudioDecoder(this); connect(m_decoder, &QAudioDecoder::bufferReady, this, &NotificationAudio::bufferReady); + connect(m_decoder, static_cast(&QAudioDecoder::error), this, &NotificationAudio::errored); connect(m_decoder, &QAudioDecoder::finished, this, &NotificationAudio::finished); } m_decoder->setAudioFormat(m_format); @@ -66,21 +67,11 @@ void NotificationAudio::playFile(const QString &filePath){ resetBuffers(); - m_file.setFileName(filePath); - if (!m_file.open(QFile::ReadOnly)){ - return; - } - - if(!m_file.isReadable()){ - return; - } - - m_decoder->setSourceDevice(&m_file); - m_decoder->start(); - m_state = State::Playing; emit stateChanged(m_state); + m_decoder->setSourceFilename(filePath); + m_decoder->start(); m_audio->start(this); } @@ -94,7 +85,6 @@ void NotificationAudio::stop() { // Reset the internal buffers and ensure the decoder and audio device is stopped void NotificationAudio::resetBuffers() { if(m_audio){ - if(m_audio->state() != QAudio::SuspendedState){ m_audio->suspend(); } @@ -106,10 +96,6 @@ void NotificationAudio::resetBuffers() { } } - if(m_file.isOpen()){ - m_file.close(); - } - m_data.clear(); m_isDecodingFinished = false; } @@ -156,6 +142,9 @@ bool NotificationAudio::atEnd() const { // handle buffered data ready void NotificationAudio::bufferReady() { const QAudioBuffer &buffer = m_decoder->read(); + if(!buffer.isValid()){ + return; + } const int length = buffer.byteCount(); const char *data = buffer.constData(); @@ -167,3 +156,8 @@ void NotificationAudio::bufferReady() { void NotificationAudio::finished() { m_isDecodingFinished = true; } + +// handle buffered data decoding error +void NotificationAudio::errored(QAudioDecoder::Error /*error*/) { + stop(); +} diff --git a/NotificationAudio.h b/NotificationAudio.h index 0793a79..2991c03 100644 --- a/NotificationAudio.h +++ b/NotificationAudio.h @@ -37,7 +37,6 @@ protected: qint64 writeData(const char* data, qint64 len) override; private: - QFile m_file; State m_state; QBuffer m_input; QBuffer m_output; @@ -56,6 +55,7 @@ private: private slots: void bufferReady(); void finished(); + void errored(QAudioDecoder::Error); signals: void initialized();