OpenAL Soft 在发布模式下崩溃(调试工作正常)
OpenAL Soft crashes in release mode (debug works fine)
我用 C++ 创建了一个小示例程序,试图用 OpenAL Soft 播放声音。程序在发布模式下编译时崩溃,在调试模式下编译时它可以工作。我在 OS X 上使用 1.17.2.
我收到此错误消息:
SoundTest(28958,0x70000021d000) malloc: *** error for object 0x7fbdd26062c8: incorrect checksum for freed object - object was probably modified after being freed.
这是完整的示例程序:
#include <iostream>
#include <AL/alc.h>
#include <AL/al.h>
#include <cmath>
using namespace std;
int main() {
// Reset error state just to be sure
alGetError();
ALCdevice *device = alcOpenDevice(NULL);
if (device == NULL) {
cout << "Error creating device" << endl;
return 1;
}
ALCcontext *context = alcCreateContext(device, NULL);
if (!alcMakeContextCurrent(context)) {
cout << "Failed to make context current" << endl;
return 1;
}
ALuint buffer;
// Set up sound buffer
alGenBuffers((ALuint)1, &buffer);
// Fill buffer with sine-wave
float freq = 440.f;
int seconds = 4;
unsigned sample_rate = 22050;
size_t buf_size = seconds * sample_rate;
short *samples;
samples = new short[buf_size];
for(int i=0; i<buf_size; ++i) {
samples[i] = (short) (32760 * sin((2.f * float(M_PI) * freq) / sample_rate * i ));
}
alBufferData(buffer, AL_FORMAT_MONO16, samples, buf_size, sample_rate);
ALuint source;
// Set up sound source
alGenSources((ALuint)1, &source);
alSourcef(source, AL_PITCH, 1);
alSourcef(source, AL_GAIN, 1);
alSource3f(source, AL_POSITION, 0, 0, 0);
alSource3f(source, AL_VELOCITY, 0, 0, 0);
alSourcei(source, AL_LOOPING, AL_FALSE);
alSourcei(source, AL_BUFFER, buffer);
// Start playing
alSourcePlay(source);
// Wait until the sound stops playing
ALenum state;
do {
alGetSourcei(source, AL_SOURCE_STATE, &state);
} while (state == AL_PLAYING);
// Clean up
alDeleteSources(1, &source);
alcMakeContextCurrent(NULL);
alcDestroyContext(context);
alcCloseDevice(device);
return 0;
}
如果其他人遇到同样的问题,请look at this。问题现已解决。
我用 C++ 创建了一个小示例程序,试图用 OpenAL Soft 播放声音。程序在发布模式下编译时崩溃,在调试模式下编译时它可以工作。我在 OS X 上使用 1.17.2.
我收到此错误消息:
SoundTest(28958,0x70000021d000) malloc: *** error for object 0x7fbdd26062c8: incorrect checksum for freed object - object was probably modified after being freed.
这是完整的示例程序:
#include <iostream>
#include <AL/alc.h>
#include <AL/al.h>
#include <cmath>
using namespace std;
int main() {
// Reset error state just to be sure
alGetError();
ALCdevice *device = alcOpenDevice(NULL);
if (device == NULL) {
cout << "Error creating device" << endl;
return 1;
}
ALCcontext *context = alcCreateContext(device, NULL);
if (!alcMakeContextCurrent(context)) {
cout << "Failed to make context current" << endl;
return 1;
}
ALuint buffer;
// Set up sound buffer
alGenBuffers((ALuint)1, &buffer);
// Fill buffer with sine-wave
float freq = 440.f;
int seconds = 4;
unsigned sample_rate = 22050;
size_t buf_size = seconds * sample_rate;
short *samples;
samples = new short[buf_size];
for(int i=0; i<buf_size; ++i) {
samples[i] = (short) (32760 * sin((2.f * float(M_PI) * freq) / sample_rate * i ));
}
alBufferData(buffer, AL_FORMAT_MONO16, samples, buf_size, sample_rate);
ALuint source;
// Set up sound source
alGenSources((ALuint)1, &source);
alSourcef(source, AL_PITCH, 1);
alSourcef(source, AL_GAIN, 1);
alSource3f(source, AL_POSITION, 0, 0, 0);
alSource3f(source, AL_VELOCITY, 0, 0, 0);
alSourcei(source, AL_LOOPING, AL_FALSE);
alSourcei(source, AL_BUFFER, buffer);
// Start playing
alSourcePlay(source);
// Wait until the sound stops playing
ALenum state;
do {
alGetSourcei(source, AL_SOURCE_STATE, &state);
} while (state == AL_PLAYING);
// Clean up
alDeleteSources(1, &source);
alcMakeContextCurrent(NULL);
alcDestroyContext(context);
alcCloseDevice(device);
return 0;
}
如果其他人遇到同样的问题,请look at this。问题现已解决。