From 3f8b0a916e9e0ca4e17900e1399ee8ad6bbf35b8 Mon Sep 17 00:00:00 2001 From: Val Doroshchuk Date: Wed, 3 Apr 2019 10:24:53 +0200 Subject: Android/AudioTrack: Fix crash when it is unable to get min buffer size MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit android/media/AudioTrack::getMinBufferSize might return an error instead of a size. Task-number: QTBUG-73583 Change-Id: I52e2d214ab7065bcea9d983979bb0b83717428af Reviewed-by: Christian Strømme --- src/plugins/opensles/qopenslesaudiooutput.cpp | 6 ++++++ src/plugins/opensles/qopenslesengine.cpp | 13 +++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/plugins/opensles/qopenslesaudiooutput.cpp b/src/plugins/opensles/qopenslesaudiooutput.cpp index 0b1f444bd..381ce0ec2 100644 --- a/src/plugins/opensles/qopenslesaudiooutput.cpp +++ b/src/plugins/opensles/qopenslesaudiooutput.cpp @@ -569,6 +569,12 @@ bool QOpenSLESAudioOutput::preparePlayer() const int lowLatencyBufferSize = QOpenSLESEngine::getLowLatencyBufferSize(m_format); const int defaultBufferSize = QOpenSLESEngine::getDefaultBufferSize(m_format); + if (defaultBufferSize <= 0) { + qWarning() << "Unable to get minimum buffer size, returned" << defaultBufferSize; + setError(QAudio::FatalError); + return false; + } + // Buffer size if (m_bufferSize <= 0) { m_bufferSize = defaultBufferSize; diff --git a/src/plugins/opensles/qopenslesengine.cpp b/src/plugins/opensles/qopenslesengine.cpp index 1a16cc2a3..43cdcb276 100644 --- a/src/plugins/opensles/qopenslesengine.cpp +++ b/src/plugins/opensles/qopenslesengine.cpp @@ -239,12 +239,13 @@ int QOpenSLESEngine::getDefaultBufferSize(const QAudioFormat &format) }(); const int sampleRate = format.sampleRate(); - return QJNIObjectPrivate::callStaticMethod("android/media/AudioTrack", - "getMinBufferSize", - "(III)I", - sampleRate, - channelConfig, - audioFormat); + const int minBufferSize = QJNIObjectPrivate::callStaticMethod("android/media/AudioTrack", + "getMinBufferSize", + "(III)I", + sampleRate, + channelConfig, + audioFormat); + return minBufferSize > 0 ? minBufferSize : format.bytesForDuration(DEFAULT_PERIOD_TIME_MS); #else return format.bytesForDuration(DEFAULT_PERIOD_TIME_MS); #endif // Q_OS_ANDROID -- cgit v1.2.1