C++ C++;OpenAL不会播放WAV文件

C++ C++;OpenAL不会播放WAV文件,c++,audio,openal,C++,Audio,Openal,因此,我编写了一个方法,用于接受.wav文件的文件路径,完成缓冲区和源的创建,并播放声音。显然,当我运行程序时,实际上不会播放任何声音。我的错误检查都没有触发,所以文件没有问题。在过去的几个小时里,我搜遍了谷歌,结果空手而归,所以我想在这里问一下。代码如下: FILE* fp = NULL; fp = fopen("audioFile.wav", "rb"); char type[4]; DWORD size, chunkSize; short formatType, channels; D

因此,我编写了一个方法,用于接受.wav文件的文件路径,完成缓冲区和源的创建,并播放声音。显然,当我运行程序时,实际上不会播放任何声音。我的错误检查都没有触发,所以文件没有问题。在过去的几个小时里,我搜遍了谷歌,结果空手而归,所以我想在这里问一下。代码如下:

FILE* fp = NULL;

fp = fopen("audioFile.wav", "rb");

char type[4];
DWORD size, chunkSize;
short formatType, channels;
DWORD sampleRate, avgBytesPerSec;
short bytesPerSample, bitsPerSample;
DWORD dataSize;

fread(type, sizeof(char), 4, fp);
if (type[0] != 'R' || type[1] != 'I' || type[2] != 'F' || type[3] != 'F')
    fatalError("OpenAL Error: No RIFF");

fread(&size, sizeof(DWORD), 1, fp);
fread(type, sizeof(char), 4, fp);
if (type[0] != 'W' || type[1] != 'A' || type[2] != 'V' || type[3] != 'E')
    fatalError("OpenAL Error: Not a WAVE file");

fread(type, sizeof(char), 4, fp);
if (type[0] != 'f' || type[1] != 'm' || type[2] != 't' || type[3] != ' ')
    fatalError("OpenAL Error: Not a fmt");

fread(&chunkSize, sizeof(DWORD), 1, fp);
fread(&formatType, sizeof(short), 1, fp);
fread(&channels, sizeof(short), 1, fp);
fread(&sampleRate, sizeof(DWORD), 1, fp);
fread(&avgBytesPerSec, sizeof(DWORD), 1, fp);
fread(&bytesPerSample, sizeof(short), 1, fp);
fread(&bitsPerSample, sizeof(short), 1, fp);

fread(type, sizeof(char), 4, fp);
if (type[0] != 'd' || type[1] != 'a' || type[2] != 't' || type[3] != 'a')
    fatalError("OpenAL Error: Missing DATA");

fread(&dataSize, sizeof(DWORD), 1, fp);

ALCdevice* device;
ALCcontext* context;

device = alcOpenDevice(NULL);
if (!device)
    fatalError("OpenAL Error: No sound device detected");

context = alcCreateContext(device, NULL);
alcMakeContextCurrent(context);
if (!context)
    fatalError("OpenAL Error: No sound context");

unsigned char* buf = new unsigned char[dataSize];
fread(buf, sizeof(BYTE), dataSize, fp);

ALuint source;
ALuint buffer;
ALuint frequency = sampleRate;
ALenum format = 0;

alGenBuffers(1, &buffer);
alGenSources(1, &source);

if (bitsPerSample == 8)
{
    if (channels == 1)
        format = AL_FORMAT_MONO8;
    else if (channels == 2)
        format = AL_FORMAT_STEREO8;
}
else if (bitsPerSample == 16)
{
    if (channels == 1)
        format = AL_FORMAT_MONO16;
    else if (channels == 2)
        format = AL_FORMAT_STEREO16;
}

alBufferData(buffer, format, buf, dataSize, frequency);

ALfloat SourcePos[] = { 0.0f, 0.0f, 0.0f };
ALfloat SourceVel[] = { 0.0f, 0.0f, 0.0f };
ALfloat ListenerPos[] = { 0.0f, 0.0f, 0.0f };
ALfloat ListenerVel[] = { 0.0f, 0.0f, 0.0f };
ALfloat ListenerOri[] = { 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f };

// Listener
alListenerfv(AL_POSITION, ListenerPos);
alListenerfv(AL_VELOCITY, ListenerVel);
alListenerfv(AL_ORIENTATION, ListenerOri);

// Source
alSourcei(source, AL_BUFFER, buffer);
alSourcef(source, AL_PITCH, 1.0f);
alSourcef(source, AL_GAIN, 1.0f);
alSourcefv(source, AL_POSITION, SourcePos);
alSourcefv(source, AL_VELOCITY, SourceVel);
alSourcei(source, AL_LOOPING, AL_FALSE);

alSourcePlay(source);

fclose(fp);
delete[] buf;

alDeleteSources(1, &source);
alDeleteBuffers(1, &buffer);
alcMakeContextCurrent(NULL);
alcDestroyContext(context);
alcCloseDevice(device);

另外,我知道我检查RIFF、WAVE和其他方面的方法是新手,但我只是在学习OpenAL并计划改进这些检查。我只是想在我担心之前让它正常工作:D.你关闭主程序太快了。alSourcePlay开始在后台播放您的声音,这意味着您必须等待声音播放,然后关闭程序。试着在alSourcePlay之后延迟一下,我想这会有帮助:)好吧,等我有机会的时候我会尝试一下。感谢您的回复!:3它起作用了吗?想知道:)@HannesHauptmann很抱歉在未来这么久才回复,但是我重新启动了这个项目,所以我还没有得到音频。当我有机会再次实施时,我会确保让您知道您的解决方案是否有效。