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.