I have this one file (below) that I use to play wave files, it works great, but after a couple of minutes of heavy sound playing, qwave::Play() calls make no sound, that is, until I restart the appliction. Is there a way I can prevent that? If it means being limited on the amount of sounds playing at one time, that's okay.
At first I thought there was a mem leak, but I clean up after my self just fine. And when free devices run out, they should clear up agian once others are done playing.
Code:
// Start of qwave.h file, by Quaytrix (yal).
<windows.h>
<quaytrix_lib.h>
#define OFFSET_FORMATTAG 20
#define OFFSET_CHANNELS 22
#define OFFSET_SAMPLESPERSEC 24
#define OFFSET_AVGBYTESPERSEC 28
#define OFFSET_BLOCKALIGN 32
#define OFFSET_BITSPERSAMPLE 34
#define OFFSET_WAVEDATA 44
#define HEADER_SIZE OFFSET_WAVEDATA
class qwave
{
private:
char *lpfile;
DWORD file_size;
WAVEFORMATEX wfex;
HWAVEOUT hwo;
public:
DWORD id;
WAVEHDR* Play(int);
void Stop(WAVEHDR*);
int Load(char*);
void SetVolume(DWORD);
void Unload();
};
void CALLBACK WaveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
switch(uMsg)
{
case WOM_OPEN:
break;
case WOM_DONE:
{
WAVEHDR *whdr = (WAVEHDR*)dwParam1;
if(whdr->dwUser)
waveOutWrite(hwo, whdr, sizeof(WAVEHDR));
else
{
waveOutUnprepareHeader(hwo, whdr, sizeof(WAVEHDR));
free(whdr);
}
}
break;
case WOM_CLOSE:
break;
}
}
int qwave::Load(char *pszFile)
{
file_size = QLib_GetFile(pszFile, lpfile);
wfex.wFormatTag = *((WORD* )(lpfile + OFFSET_FORMATTAG ));
wfex.nChannels = *((WORD* )(lpfile + OFFSET_CHANNELS ));
wfex.nSamplesPerSec = *((DWORD*)(lpfile + OFFSET_SAMPLESPERSEC ));
wfex.nAvgBytesPerSec = *((DWORD*)(lpfile + OFFSET_AVGBYTESPERSEC));
wfex.nBlockAlign = *((WORD* )(lpfile + OFFSET_BLOCKALIGN ));
wfex.wBitsPerSample = *((WORD* )(lpfile + OFFSET_BITSPERSAMPLE ));
return TRUE;
}
void qwave::Unload()
{
waveOutClose(hwo);
free(lpfile);
lpfile = NULL;
}
WAVEHDR* qwave::Play(int loop = FALSE)
{
WAVEHDR *whdr = (WAVEHDR*)malloc(sizeof(WAVEHDR));
ZeroMemory((void*)whdr, sizeof(WAVEHDR));
whdr->lpData = lpfile+HEADER_SIZE;
whdr->dwBufferLength = file_size-HEADER_SIZE;
whdr->dwUser = (DWORD)loop;
for(UINT devid = 0; devid < waveOutGetNumDevs(); devid++)
{
if(devid == waveOutGetNumDevs())
return NULL;
if(waveOutOpen(&hwo, WAVE_MAPPER, &wfex, (DWORD)WaveOutProc, 0, CALLBACK_FUNCTION) == MMSYSERR_NOERROR)
break;
}
if(waveOutPrepareHeader(hwo, whdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
return NULL;
if(waveOutWrite(hwo, whdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
return NULL;
return whdr;
}
void qwave::Stop(WAVEHDR *whdr)
{
if(whdr)
whdr->dwUser = (DWORD)FALSE;
}
void qwave::SetVolume(DWORD vol)
{
waveOutSetVolume(hwo, vol);
}
// End of qwave.h file.
Thanks for any help.