colpa mia per questo ultimo errore! (risolto)
Ora invece sono alle prese nella costruzione di un buffer più complesso rispetto a quello singolo che c'è nel seguente codice:
codice:
// Create Event:
HANDLE hevent = CreateEvent(NULL,0,0,NULL);
// Define WAVEFORMATEX Structure:
WAVEFORMATEX wf
(...);
// waveInOpen:
HWAVEIN hwi;
waveInOpen(&hwi,0,(LPWAVEFORMATEX)&wf,(DWORD)hevent,0,CALLBACK_EVENT);
// Define WAVEHDR Structure:
WAVEHDR buff;
ZeroMemory(&buff, sizeof(buff));
buff.lpData = (LPSTR) malloc(system_buf_len);
buff.dwBufferLength = system_buf_len;
buff.dwBytesRecorded = 0;
buff.dwUser = 0;
buff.dwFlags = 0;
buff.dwLoops = 0;
// Start Recording:
waveInPrepareHeader(hwi, &buff, sizeof(WAVEHDR));
waveInAddBuffer(hwi, &buff, sizeof(WAVEHDR));
waveInStart(hwi);
// Loop...
while(1)
{
WaitForSingleObject(hevent, INFINITE);
if(buff.dwFlags & WHDR_DONE)
{
save_buffer(&buff);
waveInAddBuffer(hwi, &buff, sizeof(WAVEHDR));
}
if(stop_thread_flag)
break;
}
waveInUnprepareHeader(hwi, &buff, sizeof(WAVEHDR));
waveInClose(hwi);
Ovvero viene creato un buffer WAVEHDR unico che viene passato a waveInPrepareHeader e waveInAddBuffer. Una volta iniziata la registrazione passeremo di nuovo il buffer alla waveInAddBuffer.
Per avere un'applicazione più performante mi sarebbe piaciuto passare più buffer alle waveInPrepareHeader e waveInAddBuffer prima di iniziare la registrazione.
Ad esempio:
codice:
// Define WAVEHDR Structure:
int num_buffers = 3;
WAVEHDR buff[num_buffers];
for (int k = 0; k<num_buffers; k++)
{
buff[k].lpData = (LPSTR) malloc(system_buf_len);
buff[k].dwBufferLength = system_buf_len;
buff[k].dwBytesRecorded = 0;
buff[k].dwUser = 0;
buff[k].dwFlags = 0;
buff[k].dwLoops = 0;
waveInPrepareHeader(hwi, &buff[k], sizeof(WAVEHDR));
waveInAddBuffer(hwi, &buff[k], sizeof(WAVEHDR));
}
waveInStart(hwi);
// Loop...
while(1)
{
WaitForSingleObject(hevent, INFINITE);
if(buff.dwFlags & WHDR_DONE)
{
save_buffer(&buff);
waveInAddBuffer(hwi, &buff, sizeof(WAVEHDR));
}
if(stop_thread_flag)
break;
}
waveInUnprepareHeader(hwi, &buff, sizeof(WAVEHDR));
waveInClose(hwi);
Il problema però è che nonso come "catturare il primo" buffer pronto (segnalato pronto) per usarlo e poi ripassarlo alla waveInAddBuffer dato che ora mi arriva un'array di buffers!
Come fareste voi?
grazie