diff options
Diffstat (limited to 'src/multimedia/audio/qwavedecoder.cpp')
-rw-r--r-- | src/multimedia/audio/qwavedecoder.cpp | 75 |
1 files changed, 25 insertions, 50 deletions
diff --git a/src/multimedia/audio/qwavedecoder.cpp b/src/multimedia/audio/qwavedecoder.cpp index 8d6173443..452363ddc 100644 --- a/src/multimedia/audio/qwavedecoder.cpp +++ b/src/multimedia/audio/qwavedecoder.cpp @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qwavedecoder.h" @@ -92,7 +56,7 @@ bool QWaveDecoder::open(QIODevice::OpenMode mode) if (canOpen && enoughDataAvailable()) handleData(); else - connect(device, SIGNAL(readyRead()), SLOT(handleData())); + connect(device, &QIODevice::readyRead, this, &QWaveDecoder::handleData); return canOpen; } @@ -127,6 +91,10 @@ qint64 QWaveDecoder::pos() const return device->pos(); } +void QWaveDecoder::setIODevice(QIODevice * /* device */) +{ +} + QAudioFormat QWaveDecoder::audioFormat() const { return format; @@ -175,7 +143,8 @@ qint64 QWaveDecoder::headerLength() qint64 QWaveDecoder::readData(char *data, qint64 maxlen) { - if (!haveFormat || format.bytesPerSample() == 0) + const int bytesPerSample = format.bytesPerSample(); + if (!haveFormat || bytesPerSample == 0) return 0; if (bps == 24) { @@ -199,15 +168,15 @@ qint64 QWaveDecoder::readData(char *data, qint64 maxlen) return l; } - qint64 nSamples = maxlen / format.bytesPerSample(); - maxlen = nSamples * format.bytesPerSample(); + qint64 nSamples = maxlen / bytesPerSample; + maxlen = nSamples * bytesPerSample; int read = device->read(data, maxlen); if (!byteSwap || format.bytesPerFrame() == 1) return read; - nSamples = read / format.bytesPerSample(); - switch (format.bytesPerSample()) { + nSamples = read / bytesPerSample; + switch (bytesPerSample) { case 2: bswap2(data, nSamples); break; @@ -305,7 +274,7 @@ bool QWaveDecoder::writeDataLength() void QWaveDecoder::parsingFailed() { Q_ASSERT(device); - device->disconnect(SIGNAL(readyRead()), this, SLOT(handleData())); + disconnect(device, &QIODevice::readyRead, this, &QWaveDecoder::handleData); emit parsingError(); } @@ -408,8 +377,8 @@ void QWaveDecoder::handleData() } format.setSampleFormat(fmt); - format.setSampleRate(/*qFromBigEndian<quint32>*/(wave.sampleRate)); - format.setChannelCount(/*qFromBigEndian<quint16>*/(wave.numChannels)); + format.setSampleRate(rate); + format.setChannelCount(channels); state = QWaveDecoder::WaitingForDataState; } @@ -417,7 +386,7 @@ void QWaveDecoder::handleData() if (state == QWaveDecoder::WaitingForDataState) { if (findChunk("data")) { - device->disconnect(SIGNAL(readyRead()), this, SLOT(handleData())); + disconnect(device, &QIODevice::readyRead, this, &QWaveDecoder::handleData); chunk descriptor; device->read(reinterpret_cast<char *>(&descriptor), sizeof(chunk)); @@ -431,7 +400,7 @@ void QWaveDecoder::handleData() dataSize = device->size() - headerLength(); haveFormat = true; - connect(device, SIGNAL(readyRead()), SIGNAL(readyRead())); + connect(device, &QIODevice::readyRead, this, &QIODevice::readyRead); emit formatKnown(); return; @@ -474,9 +443,15 @@ bool QWaveDecoder::findChunk(const char *chunkId) if (qstrncmp(descriptor.id, chunkId, 4) == 0) return true; + // A program reading a RIFF file can skip over any chunk whose chunk + // ID it doesn't recognize; it simply skips the number of bytes specified + // by ckSize plus the pad byte, if present. See Multimedia Programming + // Interface and Data Specifications 1.0. IBM / Microsoft. August 1991. pp. 10-11. + const quint32 sizeWithPad = descriptor.size + (descriptor.size & 1); + // It's possible that bytes->available() is less than the chunk size // if it's corrupt. - junkToSkip = qint64(sizeof(chunk) + descriptor.size); + junkToSkip = qint64(sizeof(chunk) + sizeWithPad); // Skip the current amount if (junkToSkip > 0) |