Hat diese Frage auf SO gepostet, aber keine Antworten erhalten. Vielleicht kann mir hier jemand helfen.
Ich hatte kürzlich ein gut funktionierendes Programm, das WAV- und Ogg-Sounds mit OpenAL gestreamt hat. Ich habe mich dann entschlossen, die Quell- und Pufferobjekte in C ++ - Klassen zu abstrahieren. Ich bin bis zur Quellklasse gekommen. Meine Funktion, die die Anzahl der verarbeiteten Puffer zurückgibt, ändert die an übergebene Ganzzahl nicht alGetSourcei
.
int ALSource::GetBuffersProcessed() const {
ALint processed;
alGetSourcei(this->source, AL_BUFFERS_PROCESSED, &processed);
int error = alGetError();
if(error != AL_NO_ERROR)
return -1;
return processed;
}
Ich habe überprüft, dass error
das nie etwas anderes ist AL_NO_ERROR
. Ich generiere die Quelle im Konstruktor:
alGenSources(1, &source);
Dies gibt auch nie einen Fehler.
Das eigentliche Symptom dafür ist, dass processed
es deklariert, aber nicht initialisiert wird. Der endgültige Wert ist der anfängliche Junk-Wert, mit dem er beginnt. (Normalerweise so etwas wie -8834824334).
Wäre dies zu erwartendes Verhalten? Die OpenAL-Spezifikation besagt, dass der Wert von sein sollte, 0 - any
aber nicht wirklich spezifischer ist. Die Programmieranleitung ist dieselbe.
quelle
Antworten:
OK, hier geht die Lösung. Die Hauptursache war ein impliziter Destruktoraufruf, der meinen AL-Kontext zerstörte. Interessant ist, dass ein Fehler in der Windows-Implementierung dazu führt, dass OpenAL stillschweigend fehlschlägt, wenn kein aktueller Kontext vorhanden ist. Also
alGetError
kehrten alle meine Anrufe zurück,AL_NO_ERROR
weil es keinen Kontext gab. Meiner Meinung nach ist es ein böser kleiner Fehler.quelle