Russian Qt Forum
Апрель 24, 2024, 03:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создать пользовательское событие  (Прочитано 4624 раз)
Firefox
Гость
« : Февраль 24, 2011, 22:26 »

Здравствуйте. мне надо создать событие, которое будет происходить когда буфер будет полностью заполнен информацией. сама не создавала пользовательских событий раньше. и пока каша в голове. подскажите хоть последовательность как создавать событие и как объяснить компьютеру "когда буфер заполнен"... почитала поняла что надо   в EventFilter() создать событие но как его описать не поняла. и в каком месте программы его следует посылать программе тоже не понятно.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Февраль 24, 2011, 23:11 »

А сигналы/слоты не подходят?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Firefox
Гость
« Ответ #2 : Февраль 25, 2011, 00:00 »

думаю нет. мне надо при записи звука когда заполнится буфер его заблокировать и скинуть содержимое в файл
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Февраль 25, 2011, 00:02 »

Не пойму почему сигналы/слоты не катят? Приведи примерную схему классов и их взаимодействия.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Firefox
Гость
« Ответ #4 : Февраль 25, 2011, 00:13 »

может я не права. использую директ саунд. класов нет особою ща прогу выложу там по таймеру делается но таймер он не точный поэтому его нельзя использовать. хочу заменить
Записан
Firefox
Гость
« Ответ #5 : Февраль 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

надо таймер заменить на что-то более надежное
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.073 секунд. Запросов: 22.