Название: WinApi и звук
Отправлено: 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; }
Название: Re: WinApi и звук
Отправлено: Alex_cs_gsp от Октябрь 04, 2010, 22:50
Что в уме компилировать, без комментариев? В глаза сильно бросается дублирование кода при обработке ошибок. Я бы вынес проверку mmResult в отдельную ф-ю, или обрабатывал все в одном месте через исключения, или хотя-бы, макрос написал, а так это код сильно засоряет. И честно, не понятно, зачем тут Qt вообще нужен, если полно виндновз зависимых билдов, например, директ саунд.
Название: Re: WinApi и звук
Отправлено: Firefox от Октябрь 05, 2010, 06:56
ну дак тема и не в разделе qt создана.
|