T
Die Klasse
class DirectXAudio
{
private:
IDirectMusicPerformance8* lpPerformance;
IDirectMusicLoader8 *lpLoader;
IDirectMusicSegment8 *lpSegBackgroundMusic;
IDirectMusicSegment8 *lpSegSoundEffects[10];
char *bgMusic;
char *sndEffects[10];
int nrEffects;
public:
~DirectXAudio();
void Init(HWND hWnd);
void AddBackgroundMusic(char *Name);
void AddSoundEffect(char *Name);
void PlayBackgroundMusic(void);
void PlaySoundEffect(char *Name);
};
Die Methoden:
void DirectXAudio::Init(HWND hWnd)
{
CoInitialize(0);
CoCreateInstance(CLSID_DirectMusicPerformance,0,CLSCTX_INPROC,IID_IDirectMusicPerformance8,(LPVOID*)&lpPerformance);
CoCreateInstance(CLSID_DirectMusicLoader,0,CLSCTX_INPROC,IID_IDirectMusicLoader8,(LPVOID*)&lpLoader);
lpPerformance->InitAudio(0,0,hWnd,DMUS_APATH_DYNAMIC_STEREO,64,DMUS_AUDIOF_ALL,0);
WCHAR wstrString[MAX_PATH];
MultiByteToWideChar(CP_ACP,0,"c:\\Sounds",-1,wstrString,MAX_PATH);
lpLoader->SetSearchDirectory(GUID_DirectMusicAllTypes,wstrString,FALSE);
}
void DirectXAudio::AddBackgroundMusic(char *Name)
{
WCHAR wstrFileName[MAX_PATH];
MultiByteToWideChar(CP_ACP,0,Name,-1,wstrFileName,MAX_PATH);
if(FAILED(lpLoader->LoadObjectFromFile(CLSID_DirectMusicSegment,IID_IDirectMusicSegment8,wstrFileName,(LPVOID*)&lpSegBackgroundMusic)))
{
Error("Datei konnte nicht gefunden werden.");
}
lpSegBackgroundMusic->Download(lpPerformance);
}
void DirectXAudio::AddSoundEffect(char *Name)
{
if(nrEffects >= 10)
{
MessageBox(NULL,"Maximale Anzahl an Sounds erreicht","AddSound", MB_OK );
return;
}
WCHAR wstrFileName[MAX_PATH];
MultiByteToWideChar(CP_ACP,0,Name,-1,wstrFileName,MAX_PATH);
if (FAILED(lpLoader->LoadObjectFromFile(CLSID_DirectMusicSegment,IID_IDirectMusicSegment8,wstrFileName,(LPVOID*) &lpSegSoundEffects[nrEffects])))
{
MessageBox( NULL, "Fehler beim Laden der Datei","AddSound", MB_OK );
return;
}
lpSegSoundEffects[nrEffects]->Download(lpPerformance);
sndEffects[nrEffects] = strdup(Name);
nrEffects++;
}
void DirectXAudio::PlayBackgroundMusic(void)
{
lpPerformance->PlaySegmentEx(lpSegBackgroundMusic,0,0,DMUS_SEGF_SECONDARY,0,0,0,0);
}
void DirectXAudio::PlaySoundEffect(char *Name)
{
for(int i=0;i<nrEffects;i++)
{
if(0 == strcmp(sndEffects[i],Name))
{
break;
}
}
if(i>=nrEffects)
{
MessageBox( NULL, "Soundeffekt nicht vorhanden","PlaySoundEffect", MB_OK );
return;
}
lpPerformance->PlaySegmentEx(lpSegSoundEffects[i],NULL,NULL,DMUS_SEGF_SECONDARY,0,NULL,NULL,NULL);
}
DirectXAudio::~DirectXAudio()
{
for(int i=0;i<nrEffects;i++)
{
if(sndEffects[i])
{
delete sndEffects[i];
}
if(lpSegSoundEffects[i])
{
lpSegSoundEffects[i]->Release();
lpSegSoundEffects[i] = NULL;
}
}
if(lpSegBackgroundMusic)
{
lpSegBackgroundMusic->Release();
lpSegBackgroundMusic = NULL;
}
if(lpPerformance)
{
lpPerformance->Stop(NULL,NULL,0,0);
lpPerformance->CloseDown();
lpPerformance->Release();
lpPerformance = NULL;
}
if(lpLoader)
{
lpLoader->Release();
lpLoader = NULL;
}
CoUninitialize();
}
Und in der WinMain hab ich dann entsprechend:
DAudioObjekt.Init(hWnd);
DAudioObjekt.AddBackgroundMusic("01_demo.wav");
DAudioObjekt.PlayBackgroundMusic();
EDIT:
Ich hatte schon von den vollständigen Pfad angegeben und ich habe esauch aus der Entwicklungsumgebung heraus nicht abspielen können.
Es gibt ja auch keine Fehlermeldung,dass keine Sounddatei gefunden wurde.
if(FAILED(lpLoader->LoadObjectFromFile(CLSID_DirectMusicSegment,IID_IDirectMusicSegment8,wstrFileName,(LPVOID*)&lpSegBackgroundMusic)))
{
Error("Datei konnte nicht gefunden werden.");
}
EDIT2: Nach jedem PC Neustart funktioniert es beim ersten Start des Programms perfekt.