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.
Thanks for any help.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.



LinkBack URL
About LinkBacks


