OpenAL - alGetSourcei und AL_BUFFERS_PROCESSED geben Junk


7

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 errordas 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 processedes 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 - anyaber nicht wirklich spezifischer ist. Die Programmieranleitung ist dieselbe.


Ich musste das zweimal lesen, um herauszufinden, was Sie fragten. Überlegen Sie, die Frage zu überarbeiten, um dies deutlicher zu machen.
Deft_code

@caspin, mit welchen Teilen hast du Probleme?
Anthony

Antworten:


3

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 alGetErrorkehrten alle meine Anrufe zurück, AL_NO_ERRORweil es keinen Kontext gab. Meiner Meinung nach ist es ein böser kleiner Fehler.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.