Вот и все.У меня есть функция для настройки контекста и устройства 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);
}