2011-07-29 4 views
2

これはかなりです。私は、OpenALのコンテキストとデバイスを設定し、WAVファイルをバッファにロードし、そのバッファをalBufferDataへのファイルのデータと共に渡す機能を持っています。次に、alSourcePlay(source)を呼び出すと、音が出なくなります。関数全体がコンパイルされて正常に動作しますが、デバッグを行うと、alListener3f(AL_ORIENTATION、0、0、-1)を呼び出した後、alGetError()関数がAL_ILLEGAL_ENUMを返すことがわかりました。確かにAL_ORIENTATIONは有効なOpenAL列挙型ですか? http://enigma-dev.org/forums/index.php?topic=730.0ALARIEREGAL_ENUM after alListener3f(AL_ORIENTATION、0、0、-1)

はここに私のコード(言い訳混乱、必死のデバッグ...)です:私はここにチュートリアルを追ってきた

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); 
} 

答えて

2

私はしばらく前にこの答えを見つけて、私はしましたここでそれに答えるために覚えています:列挙型は、ではなくalListenerfvメソッドで使用されます。そして、3つの整数の代わりにベクトルをとります。私はそれを見つけるのにどれくらいの時間がかかるのか驚いています!

関連する問題