Russian Qt Forum
Ноябрь 24, 2024, 02:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: WinApi и звук  (Прочитано 4154 раз)
Firefox
Гость
« : Октябрь 04, 2010, 18:48 »

Здравствуйте. пишу первый раз программку для записи звука с микрофона. формат wave. получается создаёться файл но прослушать даже не могу пишет что не может воспроизвести. подскажите мне мои ошибки пожалуйста.
Код:
хидер
#ifndef RECORD_H
#define RECORD_H

#include <QtGui/QWidget>
#include <QtGui>
#include "ui_record.h"
#include "Windows.h"
#include "mmsystem.h"
#include <QMessageBox>
#include <QFile>
#include <QByteArray>
#include "mmreg.h"
#include <dsound.h>
#include "msacm.h"
#define SIG_RIFF        quint32(('R' << 24) | ('I' << 16) | ('F' << 8) | ('F'))
#define SIG_WAVE        quint32(('W' << 24) | ('A' << 16) | ('V' << 8) | ('E'))
#define SIG_FACT        quint32(('f' << 24) | ('a' << 16) | ('c' << 8) | ('t'))
#define SIG_FMT         quint32(('f' << 24) | ('m' << 16) | ('t' << 8) | (' '))
#define SIG_DATA        quint32(('d' << 24) | ('a' << 16) | ('t' << 8) | ('a'))
class record : public QWidget
{
Q_OBJECT

public:
record(QWidget *parent = 0, Qt::WFlags flags = 0);
~record();
bool start_r(WAVEFORMATEX* format1);
WAVEFORMATEX* format;
bool StartRecordingToFile();
bool CreateWaveFile();
bool Write(BYTE *buffer);


private:
Ui::recordClass ui;
protected:
HWAVEIN m_hRecord;
DWORD m_ThreadID;
WAVEFORMATEX *m_Format;
LPWAVEHDR pwh;



private slots:
void on_pushButton_clicked(bool bn);
};

срр
#include "record.h"
bool flag_record=0;
record::record(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
ui.setupUi(this);
m_hRecord=NULL;

//заполнение структуры WAVEFORMATEX
format= new WAVEFORMATEX;
format->wFormatTag=WAVE_FORMAT_PCM;
format->nChannels=1;
format->nSamplesPerSec=22050;
format->nAvgBytesPerSec=44100;
format->nBlockAlign=2;
format->wBitsPerSample=16;

}

record::~record()
{

}
bool record::start_r(WAVEFORMATEX* format1)
{
    LPTSTR m_FileName=L"sound1.wav";
    HMMIO m_pFile;
    MMRESULT mmReturn = 0;
    m_pFile = ::mmioOpen(m_FileName,NULL, MMIO_CREATE|MMIO_WRITE|MMIO_EXCLUSIVE | MMIO_ALLOCBUF); // открытие файля
    if(m_pFile == NULL)
    {
        //m_Mode = FILE_ERROR;
        return FALSE;
    }
    MMCKINFO    m_MMCKInfoParent;
    ZeroMemory(&m_MMCKInfoParent, sizeof(MMCKINFO)); // выделение памяти
    m_MMCKInfoParent.cksize=0;
    m_MMCKInfoParent.fccType = mmioFOURCC('W','A','V','E');
    MMRESULT mmResult;
    mmResult= ::mmioCreateChunk( m_pFile,&m_MMCKInfoParent, MMIO_CREATERIFF);// создание блока RIFF и WAVE
    if(mmResult!=MMSYSERR_NOERROR)
    {
        ::MessageBox(NULL,L"Ошибка при создании сегмента wave", L"Ошибка",MB_OK|MB_SYSTEMMODAL);
        mmReturn=::mmioClose(m_pFile,NULL);
        return false;
    }
    MMCKINFO    m_MMCKInfoChild;
    ZeroMemory(&m_MMCKInfoChild, sizeof(MMCKINFO));
    m_MMCKInfoChild.ckid=mmioFOURCC('f','m','t',' ');
    m_MMCKInfoChild.cksize =sizeof(WAVEFORMATEX) ;
    mmResult= ::mmioCreateChunk( m_pFile,&m_MMCKInfoChild, NULL);// создание блока f'mt
    if(mmResult!=MMSYSERR_NOERROR)
    {
        ::MessageBox(NULL,L"Ошибка при создании сегмента fmt", L"Ошибка",MB_OK|MB_SYSTEMMODAL);
        mmReturn=::mmioClose(m_pFile,NULL);
        return false;
    }
    int cksize=sizeof(WAVEFORMATEX);

    mmResult = ::mmioWrite(m_pFile, (char*)&m_Format, cksize); // запись размера блока fmt
    if (mmResult!=cksize)
    {
        ::MessageBox(NULL,L"Ошибка при создании сегмента fmt и записи его содержмого", L"Ошибка",MB_OK|MB_SYSTEMMODAL);
        mmReturn=::mmioClose(m_pFile,NULL);
        return false;
    }
    if(mmioAscend(m_pFile,&m_MMCKInfoChild,0)!=MMSYSERR_NOERROR)
    {
        ::MessageBox(NULL,L"Ошибка при зактытии сегмента fmt", L"Ошибка",MB_OK|MB_SYSTEMMODAL);
        mmReturn=::mmioClose(m_pFile,NULL);
        return false;
    }
    m_MMCKInfoChild.ckid=mmioFOURCC('f','a','c','t');
    m_MMCKInfoChild.cksize =sizeof(DWORD);
    mmResult= ::mmioCreateChunk( m_pFile,&m_MMCKInfoChild, NULL);
    if(mmResult!=MMSYSERR_NOERROR)
    {
        ::MessageBox(NULL,L"Ошибка при создании сегмента fact", L"Ошибка",MB_OK|MB_SYSTEMMODAL);
        mmReturn=::mmioClose(m_pFile,NULL);
        return false;
    }
    mmResult = ::mmioWrite(m_pFile, (char*)&m_Format, sizeof(DWORD));
    if (mmResult!=sizeof(DWORD))
    {
        ::MessageBox(NULL,L"Ошибка при создании сегмента fact и записи его содержмого",L"Ошибка",MB_OK|MB_SYSTEMMODAL);
        mmReturn=::mmioClose(m_pFile,NULL);
        return false;
    }
    if(mmioAscend(m_pFile,&m_MMCKInfoChild,0)!=MMSYSERR_NOERROR)
    {
        ::MessageBox(NULL,L"Ошибка при зактытии сегмента fact", L"Ошибка",MB_OK|MB_SYSTEMMODAL);
        mmReturn=::mmioClose(m_pFile,NULL);
        return false;
    }
    m_MMCKInfoChild.ckid=mmioFOURCC('d','a','t','a');
    m_MMCKInfoChild.cksize =0;
    mmResult= ::mmioCreateChunk( m_pFile,&m_MMCKInfoChild, NULL);
    if(mmResult!=MMSYSERR_NOERROR)
    {
        ::MessageBox(NULL,L"Ошибка при создании сегмента data", L"Ошибка",MB_OK|MB_SYSTEMMODAL);
        mmReturn=::mmioClose(m_pFile,NULL);
        return false;
    }
    m_ThreadID =GetCurrentThreadId();
   
    mmReturn = waveInOpen( &m_hRecord, WAVE_MAPPER, format1, m_ThreadID, NULL, CALLBACK_THREAD);
    if(mmReturn)
    {
        QMessageBox::warning(0,"error","error opening");
        return false;
    }
   
    double counter=0;
   
        DWORD inBuffSize=22050/16;
        BYTE *inbuff;
        BYTE *inbuff1;
        inbuff=new BYTE[inBuffSize];
        inbuff1=new BYTE[inBuffSize];
        if(inbuff<=0)
        {
            ::MessageBox(NULL,L"Ошибка выделения памяти под буфер", L"Ошибка",MB_OK|MB_SYSTEMMODAL);
            mmReturn=::mmioClose(m_pFile,NULL);
            return false;
        }
        if(inbuff1<=0)
        {
            ::MessageBox(NULL,L"Ошибка выделения памяти под буфер", L"Ошибка",MB_OK|MB_SYSTEMMODAL);
            mmReturn=::mmioClose(m_pFile,NULL);
            return false;
        }
        ACMSTREAMHEADER ash;
        WAVEHDR  has;
        memset(&has,0,sizeof(has));
        has.lpData=(LPSTR)inbuff;
        has.dwFlags=NULL;
        has.dwBufferLength=22050/16;
        mmResult=::waveInPrepareHeader(m_hRecord,&has,sizeof(has));
        if(mmResult!=MMSYSERR_NOERROR)
        {
            ::MessageBox(NULL,L"Ошибка при создании буфера", L"Ошибка",MB_OK|MB_SYSTEMMODAL);
            mmReturn=::mmioClose(m_pFile,NULL);
            return false;
        }
        mmReturn = ::waveInAddBuffer(m_hRecord, &has, sizeof(WAVEHDR));
        if(mmResult!=MMSYSERR_NOERROR)
        {
            ::MessageBox(NULL,L"Ошибка при создании буфера", L"Ошибка",MB_OK|MB_SYSTEMMODAL);
            mmReturn=::mmioClose(m_pFile,NULL);
            return false;
        }
   
    if(ui.pushButton->isChecked())
    {
        mmReturn = ::waveInStart(m_hRecord);
        mmioWrite(m_pFile,has.lpData,has.dwBytesRecorded);
    }
    else
    {
        ;   
    }
    mmReturn = ::waveInReset(m_hRecord);
    mmReturn = ::waveInClose(m_hRecord);
    mmReturn=::mmioClose(m_pFile,NULL); 
}
void record::on_pushButton_clicked(bool bn)
{
    if(bn==true)
    {
        flag_record=1;
        start_r(format);   
    }
    else flag_record=0;
« Последнее редактирование: Октябрь 11, 2010, 12:34 от Firefox » Записан
Alex_cs_gsp
Гость
« Ответ #1 : Октябрь 04, 2010, 22:50 »

Что в уме компилировать, без комментариев? В глаза сильно бросается дублирование кода при обработке ошибок. Я бы вынес проверку mmResult  в отдельную ф-ю, или обрабатывал все в одном месте через исключения, или хотя-бы, макрос написал, а так это код сильно засоряет. И честно, не понятно, зачем тут Qt вообще нужен, если полно виндновз зависимых билдов, например, директ саунд.
« Последнее редактирование: Октябрь 04, 2010, 22:57 от Alex_cs_gsp » Записан
Firefox
Гость
« Ответ #2 : Октябрь 05, 2010, 06:56 »

ну дак тема и не в разделе qt создана.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 20.