F
Firefox
Пишу на С++ с использованием библиотеки qt4.3.3. так что код немного от стандартного С++ отличается. (это если будут возникать вопросы о каких-либо незнакомых вещах)
Добрый день. мне необходимо записать звук с микрофона в какой-либо буфер, а из буфера в файл.
пыталась сделать следующее, но в буфер информация не заносится, мне так кажется, потому что файл пустой записывается
C++:// срр файл #include "sound_2.h" using namespace std; int fact; #define N2 44100 //WAVEFORMATEX pcmWaveFormat; 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; // number of samples 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)); } // H_IN=mmioOpen(L"Sound1.wav",NULL,MMIO_CREATE|MMIO_WRITE|MMIO_ALLOCBUF ); //mmioWrite(H_IN,lpDst,sizeof(lpDst)); //waveInUnprepareHeader(h_out,&whdr,sizeof(whdr)); // mmioClose(H_IN,NULL); } 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 ); // Write the PCMWAVEFORMAT structure //---------------------------------------------- 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; // Write the PCMWAVEFORMAT structure 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; // cannot write file, probably if (mmioAscend(H_IN, &ckOut, 0) != 0) cout<<"error writing size of fmt 2 "<<endl; // cannot write file, probably 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));// запись информации в файл /*for (int lSamples =2*N2; lSamples > 0; lSamples--) { if (mmioinfoOut.pchNext == mmioinfoOut.pchEndWrite) { mmioinfoOut.dwFlags |= MMIO_DIRTY; if (mmioAdvance(hmmioOut, &mmioinfoOut, MMIO_WRITE) != 0) cout<<"error write "<<endl; } *(mmioinfoOut.pchNext)++ =pDataEcho[2*N2-lSamples]; }*/ } 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); } //********************************* // h файл #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 // SOUND_2_H
Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab