/ / Błąd krytyczny podczas zamykania urządzenia za pomocą aclCloseDevice - java, lwjgl, openal

Błąd krytyczny podczas zamykania urządzenia za pomocą aclCloseDevice - java, lwjgl, openal

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 № 1
  • Wywoł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);