Задать вопрос
@Robotex

Qt4: приложение вылетает при попытке считать из QDataStream переменную quint32?

Почему-то вылетает приложение при считывании нескольких переменных из потока (вот они — в секции 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.



В чем может быть проблема?
  • Вопрос задан
  • 3186 просмотров
Подписаться 2 Оценить 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы