Название: Создать пользовательское событие
Отправлено: Firefox от Февраль 24, 2011, 22:26
Здравствуйте. мне надо создать событие, которое будет происходить когда буфер будет полностью заполнен информацией. сама не создавала пользовательских событий раньше. и пока каша в голове. подскажите хоть последовательность как создавать событие и как объяснить компьютеру "когда буфер заполнен"... почитала поняла что надо в EventFilter() создать событие но как его описать не поняла. и в каком месте программы его следует посылать программе тоже не понятно.
Название: Re: Создать пользовательское событие
Отправлено: Пантер от Февраль 24, 2011, 23:11
А сигналы/слоты не подходят?
Название: Re: Создать пользовательское событие
Отправлено: Firefox от Февраль 25, 2011, 00:00
думаю нет. мне надо при записи звука когда заполнится буфер его заблокировать и скинуть содержимое в файл
Название: Re: Создать пользовательское событие
Отправлено: Пантер от Февраль 25, 2011, 00:02
Не пойму почему сигналы/слоты не катят? Приведи примерную схему классов и их взаимодействия.
Название: Re: Создать пользовательское событие
Отправлено: Firefox от Февраль 25, 2011, 00:13
может я не права. использую директ саунд. класов нет особою ща прогу выложу там по таймеру делается но таймер он не точный поэтому его нельзя использовать. хочу заменить
Название: Re: Создать пользовательское событие
Отправлено: Firefox от Февраль 25, 2011, 00:17
// 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 file MMCKINFO 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 8000
class NEW_REC : public QWidget { Q_OBJECT
public: 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
надо таймер заменить на что-то более надежное
|