OpenAL - 确定最大来源

时间:2010-05-20 07:56:15

标签: c++ audio openal

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

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

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

第二项建议甚至被FreeSL采用。

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

感谢您的时间,

比尔

3 个答案:

答案 0 :(得分:11)

<强>更新

我找不到确定设备支持的最大源数的方法,但我想我已经找到了如何确定上下文支持的最大值(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;
   }
}

使用库存OpenAL驱动程序在Ubuntu 10.4上返回255。


答案很长很好......

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

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

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

iPhone支持32个来源。

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

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

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

答案 1 :(得分:8)

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

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

时收到错误消息
  

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

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

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

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

答案 2 :(得分: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个),因此最大源并不总是相同的作为最大并发游戏的事情。