#include "sound_2.h"
using namespace std;
int fact;
#define N2 44100
DWORD r_buff[1024];
WAVEHDR whdr;
HWAVEIN h_out;
HMMIO H_IN;
bool Param_record=0;
MMCKINFO ckOutRIFF;
MMCKINFO ckOut;
PCMWAVEFORMAT pcmWaveFormat;
MMIOINFO mmioinfoOut;
long lSamples;
sound_2::sound_2(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
ui.setupUi(this);
CreateWaveFile();
Tim=new QTimer(this);
connect(Tim,SIGNAL(timeout()),SLOT(WriteDataToFile()));
Tim->start(200);
}
sound_2::~sound_2()
{
}
void sound_2::func(bool param)
{
MMRESULT MRez;
MRez=waveInOpen( (LPHWAVEIN)&h_out, WAVE_MAPPER,(LPCWAVEFORMATEX)&pcmWaveFormat, NULL, NULL, CALLBACK_THREAD);
char* lpDst;
ZeroMemory(&whdr,sizeof(whdr));
lpDst=new char[1024];
whdr.lpData=(LPSTR)lpDst;
whdr.dwFlags= WHDR_BEGINLOOP;
for(int i=0;i<3;i++)
{
waveInPrepareHeader (h_out,&whdr,sizeof(whdr));
waveInAddBuffer(h_out,&whdr,sizeof(whdr));
}
}
void sound_2::WriteDataToFile()
{
if (Param_record==1)
{
waveInUnprepareHeader(h_out,&whdr,sizeof(whdr));
writeWaveFile();
waveInPrepareHeader (h_out,&whdr,sizeof(whdr));
waveInAddBuffer(h_out,&whdr,sizeof(whdr));
}
}
void sound_2::CreateWaveFile()
{
H_IN=mmioOpen(L"Sound1.wav",NULL,MMIO_CREATE|MMIO_WRITE|MMIO_ALLOCBUF );
pcmWaveFormat.wf.wFormatTag=WAVE_FORMAT_PCM;
pcmWaveFormat.wf.nChannels=1;
pcmWaveFormat.wf.nBlockAlign=2;
pcmWaveFormat.wf.nSamplesPerSec=N2;
pcmWaveFormat.wf.nAvgBytesPerSec=N2*2;
pcmWaveFormat.wBitsPerSample=16;
if (H_IN == NULL)
cout<<"error opening out file "<<endl;
ckOutRIFF.fccType = mmioFOURCC('W', 'A', 'V', 'E');
if (mmioCreateChunk(H_IN, &ckOutRIFF, MMIO_CREATERIFF) != 0)
cout<<"error creating out file wave "<<endl;
ckOut.ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioCreateChunk(H_IN, &ckOut, 0) != 0)
cout<<"error creating out file fmt "<<endl;
if (mmioWrite(H_IN, (HPSTR) &pcmWaveFormat, sizeof(pcmWaveFormat))
!= sizeof(pcmWaveFormat))
cout<<"error writing size of fmt "<<endl;
if (mmioAscend(H_IN, &ckOut, 0) != 0)
cout<<"error writing size of fmt 2 "<<endl;
ckOut.ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioCreateChunk(H_IN, &ckOut, 0) != 0)
cout<<"error creating out file data "<<endl;
}
void sound_2::writeWaveFile()
{
mmioWrite(H_IN,whdr.lpData,sizeof(whdr.lpData));
}
void sound_2::on_pushButton_clicked(bool nn)
{
if (nn==true)
{
func(true);
waveInStart(h_out);
Param_record=1;
}
}
void sound_2::on_pushButton_2_clicked()
{
Param_record=0;
waveInReset(h_out);
if (mmioGetInfo(H_IN, &mmioinfoOut, 0) != 0)
cout<<"error writing data in file "<<endl;
ckOut.cksize = sizeof(pcmWaveFormat)*10;
mmioinfoOut.dwFlags |= MMIO_DIRTY;
if (mmioSetInfo(H_IN, &mmioinfoOut, 0) != 0)
cout<<"error end "<<endl;
if (mmioAscend(H_IN, &ckOut, 0) != 0)
cout<<"error end "<<endl;
if (mmioAscend(H_IN, &ckOutRIFF, 0) != 0)
cout<<"error end "<<endl;
if (H_IN != NULL)
mmioClose(H_IN, 0);
waveInClose(h_out);
}
#ifndef SOUND_2_H
#define SOUND_2_H
#include <QtGui/QWidget>
#include "ui_sound_2.h"
#include "Windows.h"
#include "mmsystem.h"
#include <iostream>
#include <QFile>
#include <QTimer>
class sound_2 : public QWidget
{
Q_OBJECT
public:
sound_2(QWidget *parent = 0, Qt::WFlags flags = 0);
~sound_2();
QTimer *Tim;
void func(bool param);
void CreateWaveFile();
void writeWaveFile();
private:
Ui::sound_2Class ui;
WAVEFORMATEX wf;
private slots:
void on_pushButton_2_clicked();
void on_pushButton_clicked(bool nn);
void WriteDataToFile();
};
#endif