WAV Dateien werden nur einmal abgespielt.
-
Folgendes Problem:
Ich habe ein Programm geschrieben,welches eine Hintergrundmusik hat.
Es funktionierte Perfekt und ich habe es dann wieder geschlossen.
Kurz danach habe ich das Programm noch einmal gestartet und aus irgendeinen Grund wurde die WAV Datei nicht abgespielt und genauso sieht es auch bei den nächsten Versuchen aus.
Der Code müsste ja eigentlich richtig sein,da die WAV Datei im ersten Versuch abgespielt wurde.
Hat jemand eine Idee woran das liegen könnte?Edit: Ich habe das ganze mit DirectX Audio gemacht.
-
Zum glück kennen wir deinen Quellcode in und auswendig!
-
Ich rate mal ins Blaue: beim ersten mal hast du das Programm aus deiner Entwicklungsumgebung heraus gestart und später über den Explorer
Lösung: kopier die wav-Datei zu deiner exe ins Verzeichnis oder gib den vollständigen Pfad an.
-
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.