OpenAL AL_ILLEGAL_ENUM после alListener3f (AL_ORIENTATION, 0, 0, -1) - PullRequest
2 голосов
/ 29 июля 2011

Вот и все.У меня есть функция для настройки контекста и устройства OpenAL, загрузки файла WAV в буфер и передачи этого буфера вместе с данными из файла в alBufferData.Затем я пытаюсь вызвать alSourcePlay (источник), и звук не выходит.Вся функция компилируется и работает нормально, но после отладки я обнаружил, что функция alGetError () вернула AL_ILLEGAL_ENUM после моего вызова alListener3f (AL_ORIENTATION, 0, 0, -1).Конечно, AL_ORIENTATION является действительным перечислением OpenAL?Я следовал этому уроку: http://enigma -dev.org / forums / index.php? Topic = 730.0

Вот мой код (извините за беспорядок, неистовая отладка ...):

void initOpenAL() {

ALenum errorNum = alGetError();
// initialise OpenAL
ALCdevice* device = alcOpenDevice(NULL);
ALCcontext* context = alcCreateContext(device, NULL);
alcMakeContextCurrent(context);

errorNum = alGetError();

alListener3f(AL_POSITION, 0, 0, 0);

errorNum = alGetError();

alListener3f(AL_VELOCITY, 0, 0, 0);

errorNum = alGetError();

alListener3f(AL_ORIENTATION, 0, 0, -1);

errorNum = alGetError(); // this is where alGetError == AL_INVALID_ENUM

alGenSources(1, &source);

errorNum = alGetError();

alSourcef(source, AL_PITCH, 1);
alSourcef(source, AL_GAIN, 2);
alSource3f(source, AL_POSITION, 0, 0, 0);
alSource3f(source, AL_VELOCITY, 0, 0, 0);
alSourcei(source, AL_LOOPING, AL_FALSE);

errorNum = alGetError();

ALuint buffer;
alGenBuffers(1, &buffer);
alSourcei(source, AL_BUFFER, buffer);

errorNum = alGetError();

FILE* file;
file = fopen("../../arcade.wav", "r");
if (file == NULL) {
    printf("File access error\n");
    exit(1);
}

char xbuffer[5];
if (fread(xbuffer, sizeof(char), 4, file) != 4 || strcmp(xbuffer, "RIFF") != 0)
    throw "Not a WAV file";

file_read_int32_le(xbuffer, file);
if (fread(xbuffer, sizeof(char), 4, file) != 4 || strcmp(xbuffer, "WAVE") != 0)
    throw "Not a WAV file!";

if (fread(xbuffer, sizeof(char), 4, file) != 4 || strcmp(xbuffer, "fmt ") != 0)
    throw "Invalid WAV file!";

printf("char size: %i", sizeof(char));

errorNum = alGetError();

file_read_int32_le(xbuffer, file);
short audioFormat = file_read_int16_le(xbuffer, file);
short channels = file_read_int16_le(xbuffer, file);
int sampleRate = file_read_int32_le(xbuffer, file);
int byteRate = file_read_int32_le(xbuffer, file);
file_read_int16_le(xbuffer, file);
short bitsPerSample = file_read_int16_le(xbuffer, file);

if (fread(xbuffer, sizeof(char), 4, file) != 4 || strcmp(xbuffer, "data") != 0)
    throw "Invalid WAV file";

int dataChunkSize = file_read_int32_le(xbuffer, file)+4;
unsigned char* bufferData = file_allocate_and_read_bytes(file, (size_t)dataChunkSize);

printf("Error before alBufferData: %x\n", alGetError());

float duration = float(dataChunkSize)/byteRate;
alBufferData(buffer, GetFormatFromInfo(channels, bitsPerSample), bufferData, dataChunkSize, sampleRate);
free(bufferData);
fclose(file);

errorNum = alGetError();

printf("Error after alBufferData, before alSourcePlay: %x\n");

alSourcePlay(source);
errorNum = alGetError();
if (errorNum != AL_NO_ERROR) {
    printf("Error starting playback: %x", errorNum);
}
fgetc(stdin);
}

1 Ответ

2 голосов
/ 16 марта 2012

Я нашел ответ на это некоторое время назад, и я только что вспомнил, чтобы ответить на него здесь: перечисление AL_ORIENTATION используется в методе alListenerfv, а не alListener3f.И он берет вектор вместо 3-х целых.Я поражен, сколько времени понадобилось, чтобы это выяснить!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...