Почему-то вылетает приложение при считывании нескольких переменных из потока (вот они — в секции private):
#ifndef CWAVE_H
#define CWAVE_H
#include <QBuffer>
#include <QByteArray>
#include <QDataStream>
#include <QDebug>
class CWave
{
public:
CWave();
qint8 loadWave(QByteArray fileData);
private:
quint16 compressionCode;
quint16 numberOfChannels;
quint32 sampleRate;
quint32 averageBytesPerSecond;
quint16 blockAlign;
quint16 significantBitsPerSample;
};
#endif // CWAVE_H
Если я закоментирую считывание переменных sampleRate и averageBytesPerSecond, то программа отрабатывает нормально, с ними же вылетает (см. вывод ниже)
#include "cwave.h"
CWave::CWave()
{
}
qint8 CWave::loadWave(QByteArray fileData)
{
QBuffer buffer(&fileData);
buffer.open(QIODevice::ReadOnly);
QDataStream stream(&buffer);
stream.setByteOrder(QDataStream::LittleEndian);
quint32 chunkID;
quint32 chunkDataSize;
quint32 riffType;
stream.setByteOrder(QDataStream::BigEndian);
stream >> chunkID;
stream.setByteOrder(QDataStream::LittleEndian);
stream >> chunkDataSize;
stream.setByteOrder(QDataStream::BigEndian);
stream >> riffType;
qDebug() << chunkID << chunkDataSize << riffType;
if(chunkID != 0x52494646 || riffType != 0x57415645) // not RIFF or WAVE
return -1;
if(chunkDataSize != buffer.size()-8)
return -2;
while(!stream.atEnd())
{
stream.setByteOrder(QDataStream::BigEndian);
stream >> chunkID;
stream.setByteOrder(QDataStream::LittleEndian);
stream >> chunkDataSize;
qDebug() << chunkID << chunkDataSize;
switch(chunkID)
{
case 0x666D7420: //fmt
// вот тут вот проблема какая-то
stream >> compressionCode;
stream >> numberOfChannels;
stream >> sampleRate;
stream >> averageBytesPerSecond;
stream >> blockAlign;
stream >> significantBitsPerSample;
qDebug() << compressionCode << numberOfChannels << sampleRate << averageBytesPerSecond << blockAlign << significantBitsPerSample;
if(chunkDataSize > 16)
//buffer.seek(buffer.pos() + chunkDataSize - 16);
qDebug() << stream.skipRawData(chunkDataSize - 16);
break;
case 0x64617461: //data
//break;
default:
//buffer.seek(buffer.pos() + chunkDataSize);
qDebug() << stream.skipRawData(chunkDataSize);
}
}
buffer.close();
stream.unsetDevice();
return 0;
}
Использование:
void MainWindow::loadFile(QString fileName)
{
QFile file(fileName);
if (!file.open(QFile::ReadOnly)) {
QMessageBox::warning(this, tr("Error!"),
tr("Cannot read file %1:\n%2.")
.arg(fileName)
.arg(file.errorString()));
return;
}
QByteArray fileData = file.readAll();
file.close();
qint8 returnValue = wave.loadWave(fileData);
switch(returnValue)
{
case -1:
QMessageBox::warning(this, tr("Not a wave!"),
tr("Wrong file type."));
break;
case -2:
QMessageBox::warning(this, tr("Not a wave!"),
tr("Wrong file size."));
break;
case 0:
qDebug() << "success!";
break;
}
}
Вывод:
Starting /home/robotex/workspace/speech-build-desktop/speech...<br/>
1380533830 221018 1463899717 <br/>
1718449184 16 <br/>
1 1 8000 16000 2 16 <br/>
1684108385 220982 <br/>
220982 <br/>
success! <br/>
The program has unexpectedly finished.
Причем, когда я сделал переменную compressionCode типа quint32, то программа вылетела с ошибкой:
pure virtual method called<br/>
terminate called without an active exception<br/>
The program has unexpectedly finished.
В чем может быть проблема?