this is some new code...how can I put the recording into a infinite loop? do I have to use threads?

Code:
#include <windows.h>
#pragma comment (lib, "winmm.lib")
#include <mmsystem.h>
#include <iostream>
#include <stdlib.h> // Define "system" function
#include <string>
#define system_buf_len 32768

void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2);
bool addbuffer(WAVEHDR *pWaveHdr);


int main()
{
	// Definisco la struttura WAVEFORMATEX
	WAVEFORMATEX waveFormat;
	waveFormat.wFormatTag      = WAVE_FORMAT_PCM;
	waveFormat.wBitsPerSample  = 16;
	waveFormat.nChannels       = 1;
	waveFormat.nSamplesPerSec  = 44100;
	waveFormat.nBlockAlign     = (waveFormat.nChannels * waveFormat.wBitsPerSample) / 8;
	waveFormat.nAvgBytesPerSec = (waveFormat.nSamplesPerSec * waveFormat.nBlockAlign);
	waveFormat.cbSize          = 0;

	MMRESULT mmres;   // ...
	HWAVEIN phvi;     // Handle for the input device
	UINT uDevice = 0; // Device id "Gruppo Microfoni"

	// waveInOpen
	mmres = waveInOpen(&phvi,
					uDevice,
					(LPWAVEFORMATEX)&waveFormat,
					(DWORD)waveInProc,
					0,
					CALLBACK_FUNCTION
					);

	// Prepare Buffer

	int i=0;
	int num_buff = 20;
	WAVEHDR *buffer = (WAVEHDR *) malloc(sizeof(WAVEHDR)*num_buff);
	for (i=0; i<num_buff; i++)
	{
		buffer[i].lpData          = (LPSTR) malloc(system_buf_len);
		buffer[i].dwBufferLength  = system_buf_len;
		buffer[i].dwBytesRecorded = 0;
		buffer[i].dwUser          = 0;
		buffer[i].dwFlags         = 0;
		buffer[i].dwLoops         = 0;

		waveInPrepareHeader(phvi, &buffer[i], sizeof(WAVEHDR));
		waveInAddBuffer(phvi, &buffer[i], sizeof(WAVEHDR));
	}
	//waveInStart;
	waveInStart(phvi);

	//waveInClose;
	waveInClose(phvi);
	system("pause");
	return 0;
}

void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
	WAVEHDR* pWaveHdr;
	switch(uMsg)
	{
	case MM_WIM_DATA:
		pWaveHdr = ((WAVEHDR*)dwParam1);
		if (pWaveHdr && hwi)
		{
			if (pWaveHdr->dwFlags && WHDR_DONE == WHDR_DONE)
			{
				pWaveHdr->dwFlags = 0;
				waveInUnprepareHeader(hwi, pWaveHdr, sizeof(WAVEHDR));
				if (pWaveHdr->dwBytesRecorded > 0)
				{
					addbuffer(pWaveHdr);
				}
				delete[] pWaveHdr->lpData;
				pWaveHdr->lpData = NULL;
			}
		}
		break;

	case MM_WIM_OPEN:
		std::cout << "MM_WIN_OPEN" << std::endl;
		break;
	case MM_WIM_CLOSE:
		std::cout << "MM_WIN_CLOSE" << std::endl;
		break;
	}
}

bool addbuffer(WAVEHDR *pWaveHdr)
{
	std::cout << pWaveHdr->dwBytesRecorded << std::endl;
	std::cout << pWaveHdr->lpData << std::endl;
	return true;
}
thanks