Salve,

dato che ho scritto troppi posts sull'argomento meglio publicare un'ultimo che racchiuda il codice (bare bones) di quello che vorrei fare e di come dovrebbe essere in linea di massima l'architettura per il funzionamento del programma.

Il programma è un progetto per console Win32 che una volta lanciato andrà avanti all'infinito finchè non si chiudera la console stessa.

Il programma deve catturare l'audio da un'input di device selezionato e salvare il contenuto del buffer (n bytes alla volta, ogni volta che il buffer riempieto, viene salvato) Si suppone quindi che ogni volta verrà aperto in modalità append un file (binary).

Il programma al suo interno lancia un Thread che si occupa della registrazione tramite le API WaveForm. Il programma quindi termina quando il "thread" termina (WaitForSingleObject(INFINITE))

Il Thread, si occupa della registrazione usando la waveInOpen() che comunica con il sistema tramite la CALLBACK_EVENT.

Il thread perciò è in un loop infinito (ogni volta fornisce un buffer al sistema)

codice:
while(1)
{
   WaitForSingleEvent(evento, INFINITE);
   ...process buffer...
   ...waveInAddBuffer()
   break if stop_thread_flag = true;
}
Il nuovo codice che ho scritto è disponibile quì (TXT):

http://theartofweb.net/cpp/registratore.txt

di quì posto solo la funzione collegata a CreateThread():

codice:
DWORD WINAPI start_recorder(const LPVOID lpParam)
{
	// get the params:
	PARAMETRI p;
	p = *((PARAMETRI*)lpParam);

	// Define WAVEFORMATEX Structure:
	WAVEFORMATEX wf;
	wf.wFormatTag      = p.wFormatTag;
	wf.wBitsPerSample  = p.wBitsPerSample;
	wf.nChannels       = p.nChannels;
	wf.nSamplesPerSec  = p.nSamplesPerSec;
	wf.nBlockAlign     = (wf.nChannels * wf.wBitsPerSample) / 8;
	wf.nAvgBytesPerSec = (wf.nSamplesPerSec * wf.nBlockAlign);
	wf.cbSize          = 0;

	// WaveInOpen
	HWAVEIN hwi;
	if(waveInOpen(&hwi,p.uDevice,(LPWAVEFORMATEX)&wf,NULL,0,NULL) != MMSYSERR_NOERROR)
	{
		printf("cannot open waveIn!\n");
	}

	// Define WAVEHDR Structure:
	WAVEHDR *buff         = new (WAVEHDR);
	buff->lpData          = (LPSTR) malloc(system_buf_len);
	buff->dwBufferLength  = system_buf_len;
	buff->dwBytesRecorded = 0;
	buff->dwUser          = 0;
	buff->dwFlags         = 0;
	buff->dwLoops         = 0;

	if (waveInPrepareHeader(hwi, buff, sizeof(WAVEHDR)) == MMSYSERR_NOERROR)
	{
		printf("waveInPrepareHeader: OK!\n");
	} else {
		printf("waveInPrepareHedare: ERROR!\n");
		return -1;
	}

	if(waveInAddBuffer(hwi, buff, sizeof(WAVEHDR)) == MMSYSERR_NOERROR)
	{
		printf("waveInAddBuffer: OK!\n");
	} else {
		printf("waveInAddBuffer: ERROR!\n");
		return -1;
	}

	if(waveInStart(hwi) == MMSYSERR_NOERROR)
	{
		printf("waveInStart: OK!\n");
	} else {
		printf("waveInStart: ERROR!\n");
		return -1;
	}

	waveInClose(hwi);

	return 0;
}
Nel codice manca ancora di definire un evento con CreateEvent() e passare alla waveInOpen() il suo handle. Dato che non so in quale parte del programma chiamare la CreateEvent!

grazie