Zaimplementowałem dźwięki w mojej aplikacjiOpenAL. Wygląda na to, że działa dobrze, dopóki nie zamknę aplikacji i nie spróbuję oczyścić każdego obiektu związanego z dźwiękiem. Zasadniczo mam metodę czyszczenia wyglądającą tak:
public void cleanup(){
//looping through sources and deleting them like this:
alSourceStop(id);
alDeleteSources(id);
//ids of sources and buffers are not the same they are in different classes
//looping through buffers and deleting them like this:
alDeleteBuffers(id);
//destroying context
alcDestroyContext(context);
//closing device
alcCloseDevice(device);
}
Kiedy komentuję alcCloseDevice
obecnie otrzymuję wiadomość w stylu:
AL lib: (EE) alc_cleanup: 1 device not closed
Jeśli zostawię to na swoim miejscu:
A fatal error has been detected by the Java Runtime Environment ... Failed to write core dump ...
i tak dalej
Używam LWJGL 3.1.0 w Windows 7 64-bitowy system operacyjny i wszystkie rzeczy związane z OpenGL i OpenAL są zarządzane przez jeden wątek.
Moja konfiguracja wygląda tak:
device = alcOpenDevice((ByteBuffer)null);
ALCCapabilities caps = ALC.createCapabilities(device);
context = alcCreateContext(device, (IntBuffer)null);
alcMakeContextCurrent(context);
AL.createCapabilities(caps);
urządzenie i kontekst są tworzone bez problemu.
Tworzenie bufora w ten sposób:
id = alGenBuffers();
try(STBVorbisInfo info = STBVorbisInfo.malloc()){
ShortBuffer buffer = /*decoding ogg here without problem*/
alBufferData(id, info.channels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, buffer, info.sample_rate());
}
Ustaw także źródło i słuchacza, ale nie wierzę, że miałoby to jakikolwiek wpływ na to, bez faktycznego utworzenia jakiegokolwiek źródła i urządzenie zamykające słuchacza spowoduje błąd.
Odpowiedzi:
1 dla odpowiedzi № 1Wywołaj, przeanalizuj i wyślij
alGetError()
po każdym wywołaniu openAL w metodzie close. To może rzucić światło na to, co zawodzi.Spróbuj usunąć wszystkie bufory ze źródła przed usunięciem buforów.
alSourcei(sourceID, AL_BUFFER, null)
;