Ich benutze OpenAL, um Sounds abzuspielen. Ich versuche, eine Fire-and-Forget-Play-Funktion zu implementieren, die eine Puffer-ID verwendet und einer Quelle aus einem Pool zuweist, den ich zuvor zugewiesen habe, und sie wiedergibt. Es gibt jedoch ein Problem mit der Objektlebensdauer.
In OpenGL lösen Löschfunktionen entweder automatisch die Bindung von Objekten (z. B. Texturen) oder löschen das Objekt automatisch, wenn es schließlich nicht mehr gebunden ist (z. B. Shader), und daher ist das Löschen in der Regel einfach zu verwalten. Schlägt jedoch alDeleteBuffers
stattdessen einfach fehl, AL_INVALID_OPERATION
wenn der Puffer noch an eine Quelle gebunden ist.
Gibt es eine idiomatische Methode zum "Löschen" von OpenAL-Puffern, die es ihnen ermöglicht, das Abspielen zu beenden und dann automatisch die Bindung zu lösen und sie wirklich zu löschen? Muss ich die Pufferverwaltung tiefer in den Quellpool einbinden (z. B. erfordert das Löschen eines Puffers auch das Überprüfen aller zugewiesenen Quellen)?
Gibt es in ähnlicher Weise eine idiomatische Möglichkeit, Puffer nach Beendigung des Spiels zu lösen (aber nicht zu löschen)? Es wäre schön, wenn ich auf der Suche nach einer freien Quelle nur sehen müsste, ob überhaupt ein Puffer angeschlossen ist, und nicht den Quellstatus überprüfen müsste.
(Ich verwende C ++, obwohl Ansätze für C auch in Ordnung sind. Ansätze, die eine GCd-Sprache voraussetzen und Finalizer verwenden, sind wahrscheinlich nicht anwendbar.)