DXAudio Probleme
-
Ich hatte vor in mein Spiel eine wav Datei als Hintergrund Musik einzubauen.
Wenn ich das Spiel starte läuft alles wunderbar.
Wenn ich das Programm jedoch beende und wieder starte, bekomme ich jedes mal wenn ich irgendeine DX Anwendung öffne einen Fehler der Art "Programm.exe hat einen Fehler in Unbekannt ausgelöst". Das lässt sich nur durch Reboot beheben.
Der Fehler erscheint allerdings nicht, wenn ich keinen Sound implantiere bzw wenn ich eine midi Datei benutzeBin relativ ratlos
-
Mit Deinen Zeigern zuviel gelöscht bzw. irgendwas nicht releast oder so...
Zeig mal was Code!
Benutzt Du Win9X ??
-
jep ich benutze Win ME
Es ist gut möglich, dass ich irgendwas nicht released habe...ich habe allerdings auch noch nicht alzuviel Erfahurng mit DX.
Das hier ist die Klasse, mit der ich DAudio initialisiere und Sound abspiele:#include "dxaudioclass.h"
void DirectXAudio::Init(void)
{
nrEffects = 0;CoInitialize(NULL);
CoCreateInstance(CLSID_DirectMusicPerformance, NULL,
CLSCTX_INPROC, IID_IDirectMusicPerformance8,
(void**)&lpPerformance );CoCreateInstance(CLSID_DirectMusicLoader, NULL,
CLSCTX_INPROC, IID_IDirectMusicLoader8,
(void**)&lpLoader);lpPerformance->InitAudio(
NULL,
NULL,
NULL,
DMUS_APATH_DYNAMIC_STEREO,
64,
DMUS_AUDIOF_ALL,
NULL
);// Suchpfad auswählen
WCHAR wstrSearchPath[MAX_PATH];
MultiByteToWideChar( CP_ACP, 0, "C:\", -1, wstrSearchPath, MAX_PATH );// Suchpfad setzen
lpLoader->SetSearchDirectory(GUID_DirectMusicAllTypes,
wstrSearchPath,
FALSE
);}
void DirectXAudio::AddBackgroundMusic(char* Name)
{
// Name der Datei
WCHAR wstrFileName[MAX_PATH];MultiByteToWideChar(CP_ACP,0,Name,-1,wstrFileName,MAX_PATH);
if (FAILED(lpLoader->LoadObjectFromFile(
CLSID_DirectMusicSegment,
IID_IDirectMusicSegment8,
wstrFileName,
(LPVOID*) &lpSegBackgroundMusic)))
{
MessageBox( NULL, "Fehler beim Laden der Datei",
"AddBackgroundMusic", MB_OK );
}// Segment hinzufügen
lpSegBackgroundMusic->Download( lpPerformance );
}void DirectXAudio::AddSound(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;
}// Segment hinzufügen
lpSegSoundEffects[nrEffects]->Download(lpPerformance);sndEffects[nrEffects] = strdup(Name);
nrEffects++;}
void DirectXAudio::PlayBackgroundMusic(void)
{
lpPerformance->PlaySegmentEx(
lpSegBackgroundMusic,
NULL,
NULL,
DMUS_SEGF_SECONDARY,
0,
NULL,
NULL,
NULL
);
}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], // abzuspielendes Segment
NULL,
NULL,
0, // im sekundären Buffer
0, // Stelle, an der gestartet werden soll
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();
}
-
jep ich benutze Win ME
Es ist gut möglich, dass ich irgendwas nicht released habe...ich habe allerdings auch noch nicht alzuviel Erfahurng mit DX.