Poste esta pergunta no SO, mas não obteve respostas. Talvez alguém possa me ajudar aqui.
Recentemente, tive um programa que funcionava bem que transmitia sons WAV e Ogg com o OpenAL. Decidi então abstrair os objetos de origem e de buffer nas classes C ++. Cheguei até a classe de origem. Minha função que retorna o número de buffers processados não está alterando o número inteiro passado 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;
}
Eu verifiquei que error
nunca é outra coisa senão AL_NO_ERROR
. Eu gero a fonte no construtor:
alGenSources(1, &source);
Isso também nunca gera nenhum erro.
O sintoma atual disso é que processed
é declarado, mas não inicializado. Seu valor final é o valor inicial de lixo eletrônico com o qual ele começa. (Geralmente algo como -8834824334).
Esse seria um comportamento esperado? A especificação OpenAL afirma que o valor deve ser de, 0 - any
mas não é realmente mais específico do que isso. O guia dos programadores é o mesmo.
fonte
Respostas:
OK, aqui está a solução. A causa raiz foi uma chamada implícita de destruidor que destruiu meu contexto de AL. O interessante é que um erro na implementação do Windows faz com que o OpenAL falhe silenciosamente quando não há um contexto atual. Então, todas as minhas chamadas
alGetError
retornaramAL_NO_ERROR
porque não havia contexto. É um inseto desagradável, na minha opinião.fonte