Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenAL不播放声音_C++_Audio_3d_Openal - Fatal编程技术网

C++ OpenAL不播放声音

C++ OpenAL不播放声音,c++,audio,3d,openal,C++,Audio,3d,Openal,我一直在与OpenAL合作,但我无法让它工作。我认为错误应该在OpenAL或我的解析器中。 OpenAL: /* has been initialized */ device = alcOpenDevice(NULL); if (!device) { /* HANDLE ERROR */ } context = alcCreateContext(device, NULL); if (!context) { /* HANDLE ERROR */ } /* source has been cre

我一直在与OpenAL合作,但我无法让它工作。我认为错误应该在OpenAL或我的解析器中。

OpenAL:

/* has been initialized */
device = alcOpenDevice(NULL);
if (!device) { /* HANDLE ERROR */ } 
context = alcCreateContext(device, NULL);
if (!context) { /* HANDLE ERROR */ }

/* source has been created */
alGenSources(1, &sourceID);
alSourcef(sourceID, AL_GAIN, 1);
alSourcef(sourceID, AL_PITCH, 1);
alSource3f(sourceID, AL_POSITION, 0, 0, 15);

/* listener has been set up */
alListenerf(AL_GAIN, 1);
alListener3f(AL_POSITION, 0, 0, 15);

/* audio buffer has been created */

/* WAV PARSER CODE GOES UP HERE */
ALuint audioBuffer;
alGenBuffers(1, &audioBuffer);
alBufferData(audioBuffer, format, buffer, dataSize, sampleRate);

/* a sound has been played (or tried to, at least) */
alSourcei(sourceID, AL_BUFFER, audioID);
alSourcePlay(sourceID);
alSourcei(sourceID, AL_BUFFER, 0);    
我怀疑OpenAL的原因是因为
alGenSources
alGenBuffers
似乎总是超出
3435973836
而不是合理的数字1或0。但是,当我执行
algerorer()
时,从来没有错误

解析器:
为了简洁起见,我将尝试用注释替换某些代码块并修剪代码

FILE* file = fopen(fileName.c_str(), "rb");
char type[5];
type[4] = '\0';
// check to make sure the file is valid using 'fread(type, sizeof(char), 4, file)'
// then compare strcmp(type, "RIFF") != 0
// this is repeated for "RIFF", "WAVE", and "fmt "

// the following variables were all declared earlier in the method
fread(&chunkSize, sizeof(int), 1, file);
fread(&formatType, sizeof(short), 1, file);
fread(&channels, sizeof(short), 1, file);
fread(&sampleRate, sizeof(int), 1, file);
fread(&avgBytesPerSec, sizeof(int), 1, file);
fread(&bytesPerSample, sizeof(short), 1, file);
fread(&bitsPerSample, sizeof(short), 1, file);
// check to see if we're at the audio data now using fread and strcmp
// strcmp(type, "data") != 0

fread(&dataSize, sizeof(int), 1, file);
unsigned char* buffer = new unsigned char[dataSize];
fread(buffer, sizeof(char), dataSize, file);

ALenum format = bitsPerSample == 8 ? (channels == 1 ? AL_FORMAT_MONO8 : AL_FORMAT_STEREO8) : (channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16);
// audio buffer creation here
(Un)幸运的是,我的解析器也没有打印出任何错误消息。在这一点上,我被卡住了

  • 我的解析器似乎正在工作
  • OpenAL初始化时没有任何问题
  • 已设置源和侦听器
  • 试图播放音频缓冲区
这里的问题是什么

编辑

我已经花了好几个小时来处理代码,但仍然不知道如何继续。我也不知道如何调试,因为我没有从OpenAL或我的解析器中得到任何错误。任何帮助都将不胜感激

我今天也遇到了同样的问题,在谷歌上找到了这篇文章。经过两个多小时的搜索,我终于找到了工作,让我为未来的谷歌回答这个问题

如果OpenAL初始化,但生成的缓冲区不从1开始,则可能设备未设置。下面是我找到的一个方便的教程,它演示了如何显式选择有效的设备,而不是说alcOpenDevice(NULL):

我使用了list_audio_devices()函数,得到了“OpenAL Soft”,并将其传递给alcOpenDevice(),我能够为源和缓冲区生成缓冲区

在我使用OpenAL之后,我尝试编写解析器,但遇到了更多的麻烦。让我帮助任何想做的人。wav解析也

这个链接非常详细地展示了一个标准的.wav文件是如何布局的:使用它,我可以轻松地编写解析器

我使用的另外两种资源是: 及 . 它们显示了如何读取.wav文件,但有一些错误。主要问题是他们读取chunkSize的顺序错误。但如果需要,它们可以用来显示简单的fread()函数。使用上面的Micorsoft WaveFormat链接进行正确的格式设置

最后一件事,我花了很长时间来解决。确保您的fopen_s()read参数设置为“rb”,而不是“r”!否则,fread()会过早地找到文件的结尾,而不会读取音频块的所有数据,从而返回一个小于chunkSize的值

在这些修复之后,我听到了声音!虽然我没有立即注意到它,因为我正在逐步完成我的代码。有一次,我在单步执行时听到了一个刺耳的声音,然后让代码运行,声音正常播放


我希望这有帮助。干杯。

我今天也有同样的问题,在谷歌上找到了这篇文章。经过两个多小时的搜索,我终于找到了工作,让我为未来的谷歌回答这个问题

如果OpenAL初始化,但生成的缓冲区不从1开始,则可能设备未设置。下面是我找到的一个方便的教程,它演示了如何显式选择有效的设备,而不是说alcOpenDevice(NULL):

我使用了list_audio_devices()函数,得到了“OpenAL Soft”,并将其传递给alcOpenDevice(),我能够为源和缓冲区生成缓冲区

在我使用OpenAL之后,我尝试编写解析器,但遇到了更多的麻烦。让我帮助任何想做的人。wav解析也

这个链接非常详细地展示了一个标准的.wav文件是如何布局的:使用它,我可以轻松地编写解析器

我使用的另外两种资源是: 及 . 它们显示了如何读取.wav文件,但有一些错误。主要问题是他们读取chunkSize的顺序错误。但如果需要,它们可以用来显示简单的fread()函数。使用上面的Micorsoft WaveFormat链接进行正确的格式设置

最后一件事,我花了很长时间来解决。确保您的fopen_s()read参数设置为“rb”,而不是“r”!否则,fread()会过早地找到文件的结尾,而不会读取音频块的所有数据,从而返回一个小于chunkSize的值

在这些修复之后,我听到了声音!虽然我没有立即注意到它,因为我正在逐步完成我的代码。有一次,我在单步执行时听到了一个刺耳的声音,然后让代码运行,声音正常播放


我希望这有帮助。干杯。

你在等声音响起吗?OpenAL不会等到声音播放到最后,所以为了测试的目的,需要延迟。我不太清楚你说的等待声音播放是什么意思。我要求在初始化代码中播放声音(在游戏循环开始之前),这样就有足够的时间播放声音。您是否在等待声音播放?OpenAL不会等到声音播放到最后,所以为了测试的目的,需要延迟。我不太清楚你说的等待声音播放是什么意思。我要求在初始化代码中播放声音(在游戏循环开始之前),这样就有足够的时间播放。这是我做的一个实现,它100%工作。