хидер#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_OBJECTpublic: 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;}