c++ - OpenAL - 确定最大来源

标签 c++ audio openal

是否有 API 允许您定义底层声音硬件允许的 OpenAL“源”的最大数量?

在网上搜索,我找到了 2 条建议:

  • 继续生成 OpenAL 源代码,直到出现错误。但是,FreeSL(OpenAL 包装器)中有一条注释指出这“非常糟糕,甚至可能使库崩溃”
  • 假设您只有 16 个;为什么有人会要求更多? (!)

第二个建议甚至被 FreeSL 采纳。

那么,是否有一个通用 API 来定义同时支持的“声音”数量?

感谢您的宝贵时间,

比尔

最佳答案

更新:

我找不到确定设备支持的最大源数量的方法,但我想我已经找到了如何确定上下文支持的最大数量(ALC_MONO_SOURCES)。因此,上下文支持与其父设备相同的数字。

//error checking omitted for brevity
ALCdevice* device = alcOpenDevice(NULL);
ALCcontext* context = alcCreateContext(device,NULL);
ALCint size;
alcGetIntegerv( device, ALC_ATTRIBUTES_SIZE, 1, &size);
std::vector<ALCint> attrs(size);
alcGetIntegerv( device, ALC_ALL_ATTRIBUTES, size, &attrs[0] );
for(size_t i=0; i<attrs.size(); ++i)
{
   if( attrs[i] == ALC_MONO_SOURCES )
   {
      std::cout << "max mono sources: " << attrs[i+1] << std::endl;
   }
}

这在 Ubuntu 10.4 上使用常用的 OpenAL 驱动程序返回 255。


长答案还不错……

基于软件的 OpenAL 驱动程序通常允许无限数量的源。好吧,不是真的无限,最终你最终会最大化 CPU 或 RAM。

大多数基于硬件的 OpenAL 驱动程序仅支持硬件具有的 channel 数。现代至少是 16,可能是 32 或更多,但可以多达 256。可能有支持更多的声卡,但 256 是我见过的最大的。

在 Windows 上,基于 DirectSound 的驱动程序被任意限制为 31 个(为什么不是 32 个?)源。 DirectSound 已被弃用,所以我不知道这是否仍然适用于 Vista 和 Windows 7。

iPhone 支持 32 个来源。

我见过一个软件支持的基于硬件的驱动程序。这意味着它将为每个源提供一个硬件 channel ,直到它们用完为止。然后它会在软件中混合一些声音,然后再将其从硬件中运出。这提供了两全其美,接近无限的来源,同时仍然使用尽可能多的硬件加速。

实际上,如果您使用的是基于硬件的驱动程序,请继续创建它们,直到 alGenSources 失败。我听说这在 iPhone 上不起作用。有一些基于软件的 OpenAL 驱动程序会在 alGenSources 失败之前崩溃。

确实应该有一个 API 来检查资源的最大数量和硬件加速的资源数量。也许在扩展中。

关于c++ - OpenAL - 确定最大来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2871905/

相关文章:

c++ - OSX 替代 <linux/serial.h>

c++ - 函数模板在 clang 中失败

c++ - 是否可以使用 C 中的系统 api 启动终止命令?如果没有其他选择?

c++ - 英特尔引脚 : analysis routine detects ah register instead of rsp (REG_STACK_PTR)

java.lang.NullPointerException 具有现有且正确的文件路径

.net - 计算 .WAV 文件中的 "time to start"

jQuery 切换类

c++ - 如何让用户使用 openAL 选择录音设备?

objective-c - 打开 al 声音在来电后不播放,直到应用程序重新启动

c++ - OpenAL 问题,对 '_imp__alGenBuffers' 的 undefined reference