Я в процессе переноса приложения из Windows на Mac OS X. Он использует OpenAL для обработки звука, но я получаю странное поведение при инициализации звукового движка в Mac OS X (код работает на MacBook Pro).
Вот код:
int InitSoundEngine(void* data[NB_BUFFERS], size_t data_size[NB_BUFFERS])
{
ALCdevice *device;
ALCcontext *context;
ALenum format;
ALuint buffers[NB_BUFFERS];
device = alcOpenDevice(NULL);
if (device == NULL)
goto failed;
context = alcCreateContext(device, NULL);
if (context == NULL)
goto failed;
alcMakeContextCurrent(context);
format = alGetEnumValue("AL_FORMAT_51CHN16");
if (format == 0)
goto failed;
alGenBuffers(NB_BUFFERS, buffers);
if (alGetError() != AL_NO_ERROR)
goto failed;
for (int i = 0; i < NB_BUFFERS; ++ i)
{
alBufferData(buffers[i], format, data[i], data_size[i], 48000);
if (alGetError() != AL_NO_ERROR)
goto failed;
}
return NO_ERROR;
failed:
/* Cleanup omitted for brievety */
return INITIALIZATION_FAILED;
}
Сбой при вызове alBufferData
с ошибкой AL_INVALID_VALUE
.Прослеживая код, мы обнаружили, что alGetEnumValue("AL_FORMAT_51CHN16")
возвращает 0xfffffffful
, и подозреваем, что это корень проблемы.
alGetEnumValue
говорит:
ALuint alGetEnumValue(const ALchar *enumName);
Возвращает 0
, если перечисление не может быть найдено, и устанавливает условие ошибки AL_INVALID_VALUE
.Наличие значения enum не гарантирует применимость расширения к текущему контексту.Ненулевой возврат указывает лишь на то, что реализация знает о существовании этого расширения.
Я думаю, что я использую функцию правильно.Есть ли ошибка в реализации OpenAL в Mac OS X?Поддерживается ли вывод 5.1 через OpenAL в Mac OS X?Поддерживается ли он через Core Audio (возможно, перенос на Core Audio, если это правда)?Должен ли я конвертировать аудио из 5.1 в другой формат (3.1, стерео, ...)?