20

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

在网上搜索,我发现了 2 条建议:

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

FreeSL 甚至采用了第二个建议。

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

感谢您的时间,

账单

4

3 回答 3

13

更新:

我找不到确定设备支持的最大源数的方法,但我想我已经找到了如何确定上下文支持的最大数量(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 驱动程序只支持与硬件通道一样多的源。现代至少是 16,可能是 32 或更多,但可以多达 256。可能有支持更多的声卡,但 256 是我见过的最大的。

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

iPhone 支持 32 个来源。

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

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

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

于 2010-07-08T13:09:41.057 回答
8

您可以创建源数量与允许同时播放的源数量alGenSources()无关。

iPad 4(我测试过的唯一设备)上,您可以同时播放的最大声音数是32。如果您尝试播放第 33 个声音,则会在alSourcePlay()

AL 错误:-1 - AL_INVALID(一般错误)

而且声音不播放。但是源可以存在,可以移动,并且可以为其设置各种设置。它只是在其他 32 个播放声音之一完成播放之前不会播放。

我已经成功地在 iPad 4 上创建了多达 2048 个源,只使用了一个循环。这并不意味着我可以同时播放2048 个声音。

所以我的回答是:自己测试硬件平台并在最大同时 SFX 中编写代码。

于 2013-10-16T18:08:01.830 回答
4

您可以通过以下方式查询最大来源:

ALCint nummono, numstereo;
alcGetIntegerv(device, ALC_MONO_SOURCES, 1, &nummono);
alcGetIntegerv(device, ALC_STEREO_SOURCES, 1, &numstereo);

但这不是标准的或在 openAL 1.1 的规范中(可能会在 1.2 中添加),一些驱动程序(openAL 实现)可以回答这个查询而有些不能,所以如果你很幸运你会得到答案,但如果没有,除了调用alGenSources()直到返回错误之外,没有其他解决方案。

而且您应该注意到,某些实现的行为不同,AFAIK 例如在 Apple iPhone 上它们可以创建最大 256 个源,但您不能同时播放 256 个源(限制为 64 个),因此最大源并不总是与最大源相同并发播放。

于 2010-07-29T00:23:21.430 回答