crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> работа с wav файлом)
korul
  опции профиля:
сообщение 3.3.2014, 22:05
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 3.3.2014
Пользователь №: 4068

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте, у меня такая задача : Есть структура WAV файла и я хочу по нажатию кнопки в кьют из созданного заголовка достать необходимые данные (частота дискр , кол байтов ) и вывести их на lineEdit формы , далее доставать по N отсчетов (для начала пусть будет const 1024 ) и делать с ними дальнейшие преобразования по нажатию уже другой кнопки
вот структура



есть filewave.h ,который подключен
#ifndef WAVFILE_H
#define WAVFILE_H

#include <QtCore/qobject.h>
#include <QtCore/qfile.h>
#include <QtMultimedia/qaudioformat.h>

class WavFile : public QFile
{
public:
     WavFile(QObject *parent = 0);

     bool open(const QString &fileName);
     const QAudioFormat &fileFormat() const;
     qint64 headerLength() const;

private:
     bool readHeader();

private:
     QAudioFormat m_fileFormat;
     qint64 m_headerLength;

};

#endif


есть filewave.cpp

#include "wavfile.h"
#include <QtCore/qendian.h>
#include <QVector>
#include <QDebug>



struct chunk
{
     char        id[4];
     quint32     size;
};

struct RIFFHeader
{
     chunk       descriptor;     // "RIFF"
     char        type[4];        // "WAVE"
};

struct WAVEHeader
{
     chunk       descriptor;
     quint16     audioFormat;
     quint16     numChannels;
     quint32     sampleRate;
     quint32     byteRate;
     quint16     blockAlign;
     quint16     bitsPerSample;
};

struct DATAHeader
{
     chunk       descriptor;
};

struct CombinedHeader
{
     RIFFHeader  riff;
     WAVEHeader  wave;
};

/*WavFile::WavFile(QObject *parent)
     : QFile(parent)
     , m_headerLength(0)
{

}
*/
bool WavFile::open(const QString &fileName)          

// по идее эту функцию должен вызвать в кнопке


{
     close();
     setFileName(fileName);
     return QFile::open(QIODevice::ReadOnly) && readHeader();
}

const QAudioFormat &WavFile::fileFormat() const
{
     return m_fileFormat;
}

qint64 WavFile::headerLength() const
{
return m_headerLength;
}

bool WavFile::readHeader()
{
     seek(0);
     CombinedHeader header;
     bool result = read(reinterpret_cast<char *>(&header), sizeof(CombinedHeader)) == sizeof(CombinedHeader);
     if (result) {
         if ((memcmp(&header.riff.descriptor.id, "RIFF", 4) == 0
             || memcmp(&header.riff.descriptor.id, "RIFX", 4) == 0)
             && memcmp(&header.riff.type, "WAVE", 4) == 0
             && memcmp(&header.wave.descriptor.id, "fmt ", 4) == 0
             && (header.wave.audioFormat == 1 || header.wave.audioFormat == 0)) {

             // Read off remaining header information
             DATAHeader dataHeader;

             if (qFromLittleEndian<quint32>(header.wave.descriptor.size) > sizeof(WAVEHeader)) {
                 // Extended data available
                 quint16 extraFormatBytes;
                 if (peek((char*)&extraFormatBytes, sizeof(quint16)) != sizeof(quint16))
                     return false;
                 const qint64 throwAwayBytes = sizeof(quint16) + qFromLittleEndian<quint16>(extraFormatBytes);
                 if (read(throwAwayBytes).size() != throwAwayBytes)
                     return false;
             }

             if (read((char*)&dataHeader, sizeof(DATAHeader)) != sizeof(DATAHeader))
                 return false;

         /*   // Establish format
             if (memcmp(&header.riff.descriptor.id, "RIFF", 4) == 0)
                 m_fileFormat.setByteOrder(QAudioFormat::LittleEndian);
             else
                 m_fileFormat.setByteOrder(QAudioFormat::BigEndian);

             //int bps = qFromLittleEndian<quint16>(header.wave.bitsPerSample);
          /*   m_fileFormat.setChannels(qFromLittleEndian<quint16>(header.wave.numChannels));
             m_fileFormat.setCodec("audio/pcm");
             m_fileFormat.setFrequency(qFromLittleEndian<quint32>(header.wave.sampleRate));
             m_fileFormat.setSampleSize(qFromLittleEndian<quint16>(header.wave.bitsPerSample));
             m_fileFormat.setSampleType(bps == 8 ? QAudioFormat::UnSignedInt : QAudioFormat::SignedInt);
         } else {
             result = false;
         }*/
     }
     m_headerLength = pos();
     return result;
}
}






И сам вопрос!

У меня кнопка вызывает функцию loadfile() : Задача состоит в том , чтобы из кнопки вызвать
bool WavFile::open(const QString &fileName)
я пытаюсь вот так,но выдает ошибку



void MainWindow::LoadFile()
{

     QString str = QFileDialog::getOpenFileName(0,"Load","","*.wav*");

     if (!str.isEmpty())
     {
         ui->lineEdit->setText(str);

       WavFile::open( QString &str);     // ЗДЕСЬ ошибка, как вызвать эту функцию именно в LoadFile()   ?

     }

   /*  QFile audio_file(str);
         if(audio_file.open(QIODevice::ReadOnly))
         {
             audio_file.seek(44); // skip wav header
             QByteArray audio_data = audio_file.readAll();
             audio_file.close();

             QBuffer* audio_buffer = new QBuffer(&audio_data);
             audio_buffer->size();
         }
*/
}



цель этого ,чтобы информацию из заголовка при нажатии кнопки повставлять в LineEdit ы
а после при нажатии другой кнопки достать сэмплы и делать с ними дальнейшие преобразования


ошибка C:2664, если вот так
Код:
WavFile::open( &str);

попытался вот так
Код:
WavFile::open( str);

тогда ошибка
"класс::функция" : недопустимый вызов нестатической функции-члена
Функция-член, объявленная с модификатором static, осуществила вызов нестатической функции-члена. Нестатическая функция-член также могла быть вызвана извне класса в качестве статической.
Следующий пример приводит к возникновению ошибки C2352:



попробовал вот так,не знаю правильно или нет,но ошибка
 void MainWindow::LoadFile()
{

     QString str = QFileDialog::getOpenFileName(0,"Load","","*.wav*");

     if (!str.isEmpty())
     {
         ui->lineEdit->setText(str);
         QFile sourceFile;
         sourceFile.setFileName(str);
         sourceFile.open(QIODevice::ReadOnly);

         QAudioFormat format;
         ui->lineEdit_2->setText(format.sampleRate);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
korul
  опции профиля:
сообщение 6.3.2014, 18:32
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 3.3.2014
Пользователь №: 4068

Спасибо сказали: 0 раз(а)




Репутация:   0  


РАЗОБРАЛСЯ! Можно закрывать тему!

сделал чуть подругому
сверху в мэйнвиндов добавил структуры
и по нажатию кнопки
bool MainWindow::openFile(const QString &str)
{

    QFile file(str);
    file.open(QIODevice::ReadOnly);
    file.seek(0);

        CombinedHeader header;

    bool result = file.read(reinterpret_cast<char *>(&header), sizeof(CombinedHeader)) == sizeof(CombinedHeader);

    if (result) {
        if ((memcmp(&header.riff.descriptor.id, "RIFF", 4) == 0
            || memcmp(&header.riff.descriptor.id, "RIFX", 4) == 0)
            && memcmp(&header.riff.type, "WAVE", 4) == 0
            && memcmp(&header.wave.descriptor.id, "fmt ", 4) == 0
            && (header.wave.audioFormat == 1 || header.wave.audioFormat == 0)) {

          /*  // Read off remaining header information
            DATAHeader dataHeader;

            if (qFromLittleEndian<quint32>(header.wave.descriptor.size) > sizeof(WAVEHeader)) {
                // Extended data available
                quint16 extraFormatBytes;
                if (file.peek((char*)&extraFormatBytes, sizeof(quint16)) != sizeof(quint16))
                    return false;
                const qint64 throwAwayBytes = sizeof(quint16) + qFromLittleEndian<quint16>(extraFormatBytes);
                if (file.read(throwAwayBytes).size() != throwAwayBytes)
                    return false;
            }

            file.read((char*)&dataHeader, sizeof(DATAHeader)); */
           // ui->lcdNumber->display(header.wave.sampleRate);
        return result;
    }
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.11.2024, 22:16