// cpp#include "new_rec.h"#include <windows.h>#include <dsound.h>#include <math.h>char * g_szWindowClass = "analogizer32";HWND g_hWnd;LPDIRECTSOUNDCAPTURE8 g_pDSCapture = NULL;LPDIRECTSOUNDCAPTUREBUFFER8 g_pDSCaptureBuffer = NULL;BITMAPINFO g_BI;long * g_pDIB;HANDLE g_hThread;BOOL g_bThreadExit;PCMWAVEFORMAT pcmWaveFormat; HMMIO hmmioOut ; // handle to open output WAVE fileMMCKINFO ckOutRIFF; MMCKINFO ckOut; MMIOINFO mmioinfoOut; char *DataS;int writtenByte=0;NEW_REC::NEW_REC(QWidget *parent, Qt::WFlags flags) : QWidget(parent, flags){ ui.setupUi(this); t_time=new QTimer(this); connect(t_time,SIGNAL(timeout()),SLOT(rec_thread())); pcmWaveFormat.wf.wFormatTag=WAVE_FORMAT_PCM; pcmWaveFormat.wf.nChannels=1; pcmWaveFormat.wf.nSamplesPerSec=8000; pcmWaveFormat.wBitsPerSample=8; pcmWaveFormat.wf.nBlockAlign=pcmWaveFormat.wf.nChannels * (pcmWaveFormat.wBitsPerSample / 8); pcmWaveFormat.wf.nAvgBytesPerSec=pcmWaveFormat.wf.nSamplesPerSec * pcmWaveFormat.wf.nBlockAlign; char *pDataEcho = new char[pcmWaveFormat.wf.nAvgBytesPerSec]; }NEW_REC::~NEW_REC(){}void NEW_REC::rec_thread(){ char *p = NULL; DWORD s = W; char *p2 = NULL; DWORD s2 = W; g_pDSCaptureBuffer->Lock( 0, 0, (LPVOID *)&p, &s, (LPVOID *)&p2,&s2, DSCBLOCK_ENTIREBUFFER ); for(int i=writtenByte+1;i<s+writtenByte-1;i++) DataS+=p[i-writtenByte]; writtenByte+=s; int k=strlen(p); if (mmioGetInfo(hmmioOut, &mmioinfoOut, 0) != 0) ::MessageBox(NULL,L"Ошибка при записи данных2", L"Ошибка",MB_OK|MB_SYSTEMMODAL); ckOut.cksize = sizeof(pcmWaveFormat)/**10*/; for (int lSamples =1; lSamples<k-1 ; lSamples++) { if (mmioinfoOut.pchNext == mmioinfoOut.pchEndWrite) { mmioinfoOut.dwFlags |= MMIO_DIRTY; if (mmioAdvance(hmmioOut, &mmioinfoOut, MMIO_WRITE) != 0) ::MessageBox(NULL,L"Ошибка при записи данных1", L"Ошибка",MB_OK|MB_SYSTEMMODAL); } *(mmioinfoOut.pchNext)++ =p[lSamples] ; } mmioinfoOut.dwFlags |= MMIO_DIRTY; if (mmioAdvance(hmmioOut, &mmioinfoOut, MMIO_WRITE) != 0) { ::MessageBox(NULL,L"Ошибка при считывании данных data", L"Ошибка",MB_OK|MB_SYSTEMMODAL); ::mmioClose(hmmioOut,NULL); //return false; } if (mmioSetInfo(hmmioOut, &mmioinfoOut, 0) != 0) ::MessageBox(NULL,L"Ошибка при записи данных3", L"Ошибка",MB_OK|MB_SYSTEMMODAL); g_pDSCaptureBuffer->Unlock( p, s, NULL, NULL );}bool NEW_REC::createFileWav(){ //---------------------------------------------- LPTSTR m_FileName=L"Sound_out.wav"; hmmioOut = mmioOpen(L"Sound_out.wav", NULL, MMIO_ALLOCBUF | MMIO_WRITE | MMIO_CREATE ); if (hmmioOut == NULL) { ::MessageBox(NULL,L"Ошибка при открытии файла wave", L"Ошибка",MB_OK|MB_SYSTEMMODAL); return false; } // Write the PCMWAVEFORMAT structure ckOutRIFF.fccType = mmioFOURCC('W', 'A', 'V', 'E'); if (mmioCreateChunk(hmmioOut, &ckOutRIFF, MMIO_CREATERIFF) != 0) { ::MessageBox(NULL,L"Ошибка при создании сегмента wave", L"Ошибка",MB_OK|MB_SYSTEMMODAL); ::mmioClose(hmmioOut,NULL); return false; } ckOut.ckid = mmioFOURCC('f', 'm', 't', ' '); if (mmioCreateChunk(hmmioOut, &ckOut, 0) != 0) { ::MessageBox(NULL,L"Ошибка при создании сегмента fmt", L"Ошибка",MB_OK|MB_SYSTEMMODAL); ::mmioClose(hmmioOut,NULL); return false; } if (mmioWrite(hmmioOut, (HPSTR) &pcmWaveFormat, sizeof(pcmWaveFormat)) != sizeof(pcmWaveFormat)) { ::MessageBox(NULL,L"Ошибка при создании сегмента fmt и записи его содержмого", L"Ошибка",MB_OK|MB_SYSTEMMODAL); ::mmioClose(hmmioOut,NULL); return false; } if (mmioAscend(hmmioOut, &ckOut, 0) != 0) { ::MessageBox(NULL,L"Ошибка при зактытии сегмента fmt", L"Ошибка",MB_OK|MB_SYSTEMMODAL); ::mmioClose(hmmioOut,NULL); return false; } ckOut.ckid = mmioFOURCC('d', 'a', 't', 'a'); if (mmioCreateChunk(hmmioOut, &ckOut, 0) != 0) { ::MessageBox(NULL,L"Ошибка при создании сегмента data", L"Ошибка",MB_OK|MB_SYSTEMMODAL); ::mmioClose(hmmioOut,NULL); return false; } return true;}void NEW_REC::ds_init(){ //memset(pDataEcho,0,/*dwDataSize+*/sizeof(pDataEcho)); //обнулим его ::DirectSoundCaptureCreate8( NULL, &g_pDSCapture, NULL ); WAVEFORMATEX wfx; wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = 1; wfx.nSamplesPerSec = 8000; wfx.wBitsPerSample = 8; wfx.nBlockAlign = wfx.nChannels * (wfx.wBitsPerSample / 8); wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; wfx.cbSize = 0; DSCBUFFERDESC dsbd; ZeroMemory( &dsbd, sizeof( DSCBUFFERDESC ) ); dsbd.dwSize = sizeof( DSCBUFFERDESC ); dsbd.dwBufferBytes = 8000; dsbd.lpwfxFormat = &wfx; createFileWav(); LPDIRECTSOUNDCAPTUREBUFFER pDSCB; g_pDSCapture->CreateCaptureBuffer( &dsbd, &pDSCB, NULL ); pDSCB->QueryInterface( IID_IDirectSoundCaptureBuffer8, (LPVOID *)&g_pDSCaptureBuffer ); DWORD WriteC; HRESULT rez; rez=pDSCB->GetCurrentPosition(0,&WriteC); pDSCB->Release(); g_pDSCaptureBuffer->Start(DSCBSTART_LOOPING);}bool NEW_REC::ds_close(){ if (mmioAscend(hmmioOut, &ckOut, 0) != 0) { ::MessageBox(NULL,L"Ошибка при закрытии блока данных data", L"Ошибка",MB_OK|MB_SYSTEMMODAL); ::mmioClose(hmmioOut,NULL); return false; } if (mmioAscend(hmmioOut, &ckOutRIFF, 0) != 0) { ::MessageBox(NULL,L"Ошибка при закрытии блока RIFF", L"Ошибка",MB_OK|MB_SYSTEMMODAL); ::mmioClose(hmmioOut,NULL); return false; } if (hmmioOut != NULL) mmioClose(hmmioOut, 0); g_pDSCaptureBuffer->Stop(); return true;}void NEW_REC::on_pushButton_clicked(){ ds_init(); t_time->start(950);}void NEW_REC::on_pushButton_2_clicked(){ t_time->stop(); ds_close();}void NEW_REC::on_play_clicked(){ ::IDirectSound8 *pDirectSound; // определим интерфес ::IDirectSoundBuffer *pSoundBuffer; //Определим указатель на звуковой буфер DX-а ::DSBUFFERDESC dsBuffer = DSBUFFERDESC(); //Структура формата буфера //Заполни ее DWORD sizeData=8000; dsBuffer.dwBufferBytes =sizeData ; //Сколько инфы (в байтах) dsBuffer.dwFlags = DSBCAPS_STATIC; //Флаг буфера, у нас буфер как статичный (может быть поточным) dsBuffer.dwSize = sizeof(DSBUFFERDESC); //Размер структуры, как любят ребята из Microsoft dsBuffer.lpwfxFormat = &WaveFormat; //Формат буфера, мы как раз запишим туда сведения из Wav-Format pDirectSound->CreateSoundBuffer(&dsBuffer,&pSoundBuffer,NULL); //Создадим буфер void *pDst = 0; DWORD dwSize = 0; pSoundBuffer->Lock(0,0,&pDst,&dwSize,0,0,DSBLOCK_ENTIREBUFFER);//Заблокируем буфер memcpy(pDst,DataS,dwSize); //Запишим нашу pData в него pSoundBuffer->Unlock(pDst,dwSize,0,0); //Разблокируем pSoundBuffer->Play(0,0,0); //Начнем грать DWORD hrStatus = 0; do { pSoundBuffer->GetStatus(&hrStatus); //В цикле получаем статус } while (hrStatus == DSBSTATUS_PLAYING); //выполнять : Пока статус "Грает" pDirectSound->Release(); //Освободим интерфейс pDirectSound = NULL;}// .h#ifndef NEW_REC_H#define NEW_REC_H#include <QtGui/QWidget>#include "ui_new_rec.h"#include <windows.h>#include "mmsystem.h"#include <dsound.h>#include <math.h>#include "initguid.h"#include <QTimer>#include <QSound>//#include "main.h"#define BUFFER_SAMPLES (256)#define BUFFER_BYTES (BUFFER_SAMPLES << 1)#define W (BUFFER_SAMPLES)#define H (34)#define N2 8000class NEW_REC : public QWidget{ Q_OBJECTpublic: NEW_REC(QWidget *parent = 0, Qt::WFlags flags = 0); ~NEW_REC(); char *pDataEcho; int dwDataSize; QTimer *t_time; WAVEFORMATEX WaveFormat; bool createFileWav(); void ds_init(); bool ds_close();private: Ui::NEW_RECClass ui;private slots: void on_play_clicked(); void on_pushButton_2_clicked(); void on_pushButton_clicked(); void rec_thread();};#endif // NEW_REC_H