Есть проблема: нужно воспроизвести два wav файла одновременно.PlaySound не подходит.
Следовательно нужно через waveOutOpen.
Ниже выдерка из кода.Не могу понять в чем ошибка.Компилится без ошибок,
а звука нет.Кто может выручите.Может у кого есть пример кода?
вызов такой:
WaveFile player(TEXT("player.wav"));
player.Play(false);
А вот сами функции и выдержки кода:
#include <windows.h>
#include <stdio.h>
char *lpfile;
int file_size;
WAVEFORMATEX wfex;
HWAVEOUT hwo;
WAVEHDR whdr;
WaveFile::WaveFile(LPCTSTR szFileName)
{
TCHAR PathName[MAX_PATH];
TCHAR FullName[MAX_PATH];
ULONG HighByt;
GetModuleFileName(NULL, PathName,MAX_PATH );
PathName[lstrlen(PathName) - 8] = TEXT('\0');
wsprintf(FullName, TEXT("%s%s"), PathName, szFileName);
hFile = CreateFile(FullName, GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
file_size=GetFileSize (hFile, NULL) ;
lpfile = new char [file_size];
// 'Copy' the file to memory
ReadFile(hFile,&lpfile , sizeof(lpfile), &HighByt, NULL);
CloseHandle(hFile);
ZeroMemory(&wfex,sizeof(WAVEFORMATEX));
// Fill WAVEFORMATEX with the data from the file
wfex.wFormatTag =WAVE_FORMAT_PCM;
wfex.nChannels =1;
wfex.nSamplesPerSec =44100;
wfex.nBlockAlign =wfex.wBitsPerSample/8*wfex.nChannels;
wfex.nAvgBytesPerSec =wfex.nSamplesPerSec*wfex.nBlockAlign;
wfex.wBitsPerSample =16;
return;
}
WAVEHDR* WaveFile::Play(bool loop)
{
WAVEHDR *whdr = new WAVEHDR;
ZeroMemory((void*)whdr, sizeof(WAVEHDR));
whdr->lpData = lpfile+HEADER_SIZE;
whdr->dwBufferLength = file_size-HEADER_SIZE;
whdr->dwUser = true;
whdr->dwFlags = 0;
// Find a waveOut device and open it
for(UINT devid = 0; devid < waveOutGetNumDevs(); devid++)
{
if(devid == waveOutGetNumDevs())
// Error, no free devices found
return NULL;
waveOutOpen(&hwo, WAVE_MAPPER, &wfex,NULL, NULL, CALLBACK_NULL);
// Usable device found, stop searching
break;
}
waveOutSetVolume(hwo, 0xFFFFFFFF);
waveOutPrepareHeader(hwo, whdr, sizeof(WAVEHDR));
waveOutWrite(hwo, whdr, sizeof(WAVEHDR));
do {}
while (!(whdr->dwFlags & WHDR_DONE)); // inefficient busy wait!
waveOutUnprepareHeader(hwo, whdr, sizeof(whdr));
//Close the WAVE device.
waveOutClose(hwo);
return whdr;
}