【发布时间】:2023-03-17 14:26:02
【问题描述】:
我正在将应用程序从 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错误条件。枚举值的存在并不能保证扩展对当前上下文的适用性。非零返回仅表示实现知道此扩展的存在。
我认为我正确使用了该功能。 OpenAL 的 Mac OS X 实现中是否存在错误? Mac OS X 上是否通过 OpenAL 支持 5.1 输出?是否通过 Core Audio 支持(如果这是真的,可以选择移植到 Core Audio)?我应该将我的音频从 5.1 转换为另一种格式(3.1、立体声、...)吗?
【问题讨论】:
标签: macos audio core-audio openal