Hallihallo,
ich habe ein kleines Problem. Und zwar sieht das so aus, dass ich eine kleine Klasse programmiert habe, die mit OpenAL eine wav-Datei lädt und abspielt. Nun wird in der main eine wav-Datei geladen, und nach dem erstellen der exe-Datei wird diese auch abgespielt.
Kommen wir nun zum Problem: Wenn ich die zu ladende wav-Datei ändere, z.B. "wavdata/Battle1.wav" in "wavdata/Gun1.wav" ändere, und die exe-Datei komplett neu erstellen lasse, passiert immer noch das gleiche wie beim ersten durchlauf. Es wird immer die gleiche Datei wiedergegeben, obwohl das Programm eigentlich neu übersetzt wurde und egal wie oft es neu übersetzt oder vorher bereinigt wurde...
Besitzt Visual Studio 2008 irgendwo einen Cache, den man von Hand löschen muss? Oder könnte es auch am Code an sich liegen?
Grüße Christian
Cache unter Visual Studio 2008 leeren
Re: Cache unter Visual Studio 2008 leeren
Entweder am Code, oder die Dateien sind gleich ;). Und nein, Visual Studio hat keinen Cache, der wie auch immer mit deinem Programm interagiert. Bitte den betreffenden Code posten. :)loller hat geschrieben:Oder könnte es auch am Code an sich liegen?
Re: Cache unter Visual Studio 2008 leeren
Das die Dateien gleich sind, das kann nicht sein, da ich wie bereits geschrieben, das Projekt auch mehrmals bereinigt habe, so dass keine exe-Datei mehr da war. Bitte nicht erschrecken, hier der etwas wust kommentierte Code. :lol:
main.cpp
Hier noch ein Ausschnitt aus den Methoden der Klassen (Konstruktor, Destruktor, laden und abspielen + die klasse an sich):
Kann es sein, dass mir da irgendwo ein fehler beim laden unterlaufen ist, oder ich etwas nicht mehr richtig frei gebe?
EDIT:
Ich habe noch ein paar Debugausgaben eingebaut. Diese zeigen, dass der übergebene Pfad stimmt. Allerdings wird irgendwie trotzdem immer das falsche wiedergegeben...
main.cpp
Code: Alles auswählen
void vInitOpenAL(void)
{
cout << "Initialising OpenAL!" << endl;
alutInit(NULL, 0);
cout << "Clearing error bit!" << endl;
alGetError();
}
void vKillOpenAL(void)
{
alutExit();
}
int main(int argc, char *argv[])
{
CSound *mySound = NULL, *secSound = NULL;
vInitOpenAL();
// kill OpenAL when exiting the program
atexit(vKillOpenAL);
mySound = new CSound();
secSound = new CSound();
// Load .wav-Files and give the possibility play it
if(mySound->bLoadWAV("wavdata/Gun2.wav", false))
{
mySound->vPlaySound();
}
if(secSound->bLoadWAV("wavdata/Gun2.wav", false))
{
secSound->vPlaySound();
}
getchar();
delete mySound;
delete secSound;
return(0);
}
Code: Alles auswählen
class CSound
{
private:
// Sound Buffer und Source
ALuint m_Buffer;
ALuint m_Source;
// Position und Velocity
ALfloat m_SourcePos[3];
ALfloat m_SourceVel[3];
public:
CSound();
~CSound();
bool bLoadWAV(const string sPath, bool bLoop = false);
void vPlaySound(void);
void vPauseSound();
void vStopSound();
void vSetSourcePosition(ALfloat x, ALfloat y, ALfloat z);
void vSetSourceVelocity(ALfloat x, ALfloat y, ALfloat z);
};
CSound::CSound()
{
cout << "Constructor called!" << endl;
// generate source and buffer
alGenSources(1, &m_Source);
alGenBuffers(1, &m_Buffer);
// set position and velocity
vSetSourcePosition(0.0f, 0.0f, 0.0f);
vSetSourceVelocity(0.0f, 0.0f, 0.0f);
}
CSound::~CSound()
{
cout << "Destructor called!" << endl;
// Delete buffers and source
alDeleteBuffers(1, &m_Buffer);
alDeleteSources(1, &m_Source);
}
bool CSound::bLoadWAV(const string sPath, bool bLoop)
{
// error flag löschen
alGetError();
ALenum error;
ALenum format;
ALsizei size;
ALsizei freq;
ALboolean loop;
ALvoid* data;
alutLoadWAVFile("wavdata/Battle.wav", &format, &data, &size, &freq, &loop);
if ((error = alGetError()) != AL_NO_ERROR)
{
cout << "[ERROR] alutLoadWAVFile exciting_sound.wav : " << error;
return(false);
}
alBufferData(m_Buffer, format, data, size, freq);
alutUnloadWAV(format, data, size, freq);
alSourcei (m_Source, AL_BUFFER, m_Buffer );
if((error = alGetError()) == AL_INVALID_NAME)
cout << "[ERROR] AL_INVALID_NAME!" << endl;
alSourcef (m_Source, AL_PITCH, 1.0f );
alSourcef (m_Source, AL_GAIN, 1.0f );
alSourcefv(m_Source, AL_POSITION, m_SourcePos );
alSourcefv(m_Source, AL_VELOCITY, m_SourceVel );
alSourcei (m_Source, AL_LOOPING, bLoop );
if((error = alGetError()) != AL_NO_ERROR)
{
cout << "[ERROR] Unknown error occured : " << error;
return(false);
}
return(true);
}
void CSound::vPlaySound(void)
{
ALenum error;
alGetError();
// spielen
cout << "m_Source = " << m_Source << "\tm_Buffer = " << m_Buffer << endl;
alSourcePlay(m_Source);
// Fehler aufgetreten? => Anzeigen!
if((error = alGetError()) != AL_NO_ERROR)
{
cout << "[ERROR] Unknown error occured : " << error;
}
}
void CSound::vSetSourcePosition(ALfloat x, ALfloat y, ALfloat z)
{
// set position
m_SourcePos[0] = x;
m_SourcePos[1] = y;
m_SourcePos[2] = z;
// Apply changes
alSourcefv(m_Source, AL_POSITION, m_SourcePos );
}
void CSound::vSetSourceVelocity(ALfloat x, ALfloat y, ALfloat z)
{
// set velocity
m_SourceVel[0] = x;
m_SourceVel[1] = y;
m_SourceVel[2] = z;
// Apply changes
alSourcefv(m_Source, AL_VELOCITY, m_SourceVel );
}
EDIT:
Ich habe noch ein paar Debugausgaben eingebaut. Diese zeigen, dass der übergebene Pfad stimmt. Allerdings wird irgendwie trotzdem immer das falsche wiedergegeben...
Re: Cache unter Visual Studio 2008 leeren
Du verwendest in CSound::bLoadWAV den Parameter sPath nicht, sondern hast den Pfad hardkodiert. ;)
Re: Cache unter Visual Studio 2008 leeren
oh je... das ist mir ja mal überhaupt nicht aufgefallen...
Habe das ganze noch etwas erweitert, damit die als "deprecated" markierten Funktionen nicht mehr genutzt werden. :)
Danke für die Hilfe.
Habe das ganze noch etwas erweitert, damit die als "deprecated" markierten Funktionen nicht mehr genutzt werden. :)
Danke für die Hilfe.