Я работаю над звуковым движком для игры, которую я делаю. Однако, когда я играю свои аудиоклипы, они выходят в основном нормально, но искажены и искажены. Я генерировал синусоидальную волну, которая должна давать чистый тон, но он все еще имеет это искажение — поэтому я думаю, что это на конце OpenAL.
Дело в том, что я ничего не делаю с OpenAL.
Во-первых, я генерирую 48000 образцов синусоиды
#include <math.h>
#define PI 3.14159265
float amplitude = .5f;
float frequency = 440;
float phase = 0.f;
float time = 0.f;
int sampleRate = 48000;
float dt = 1.0f / sampleRate;
float sineWave[48000];
fox_for(sample, sampleRate) { // standard macro for for loop
float val = amplitude * sin(2 * PI * frequency * time + phase);
sineWave[sample] = val;
time += dt;
}
И все хорошо. Куча плавает в [-.5, .5], в виде синусоидальной волны. Затем я делаю стандартные шаги OpenAL: Генерация источника и буфера. Свяжите данные с буфером, а буфер с источником, а затем воспроизведите звук.
// Open device and context
if (ALCdevice *device = alcOpenDevice(NULL)) {
if (ALCcontext *context = alcCreateContext(device, NULL)) {
alcMakeContextCurrent(context);
} else {
gameLog.writeStr("ALC context opening failed");
}
} else {
gameLog.writeStr("ALC device opening failed");
}
// Generate a source, set its properties to default explicitly
ALuint source;
alGenSources(1, &source);
alSourcef(source, AL_PITCH, 1.0f);
alListener3f(AL_POSITION, 0.0f, 0.0f, 0.0f);
alSource3f(source, AL_POSITION, 0.0f, 0.0f, 0.0f);
alSourcef(source, AL_GAIN, 0.5f);
alSource3f(source, AL_POSITION, 0.f, 0.f, 0.f);
alSource3f(source, AL_VELOCITY, 0.f, 0.f, 0.f);
// Fill buffers with sine wave data
ALuint testBuf;
alGenBuffers(1, &testBuf);
alBufferData(testBuf, AL_FORMAT_MONO16, &sineWave[0], 48000 * sizeof(float), 48000);
// Play sound
alSourcei(source, AL_BUFFER, testBuf);
alSourcePlay(source);
И я получаю то, что отчетливо примечание на 440 Гц, но нечеткое и довольно искаженное. Моей первой мыслью было, что формат AL_FORMAT_MONO16 может быть причиной того, что числа с плавающей точкой (которые являются 64-битными) интерпретируются как последовательности 16-битных чисел. Но если бы это было так, я бы предположил, что звук будет чрезвычайно искажен и неузнаваем.
В моей игре данные читаются как необработанные байты с использованием libvorbisfile, а формат и частота определяются данными заголовка, анализируемыми из файла .ogg. Следовательно, я не думаю, что проблема в неправильном формате или частоте.
Если у кого-то есть опыт работы с OpenAL, я был бы очень признателен, если вы видите проблему или подсказку, чтобы помочь в отладке. Спасибо!
Ваши аудиоданные отформатированы неправильно. От документация, 16-разрядные данные представляют собой целые данные со знаком, от -32768 до +32767.
Вы все еще слышите что-то узнаваемое как синусоидальную волну, потому что верхняя половина ваших поплавков подобна синусоидальной. Вы можете услышать это, даже если каждая другая выборка по существу случайна.
Других решений пока нет …