2010-05-20 53 views
16

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

搜索互联网,我发现2点建议:

  • 保持生成OpenAL的来源,直到你得到一个错误。然而,在FreeSL(OpenAL包装)中有一个说明,说这是“非常糟糕的,甚至可能导致图书馆崩溃”
  • 假设你只有16;为什么有人会需要更多? (!)

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

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

谢谢您的时间,

比尔

+0

是不是OpenAL提供尽可能多的来源,因为它是需要的,事件,如果它将被渲染软? OpenAL文档只有一个提示(在创建时给出)关于应用程序可能具有多少来源的提示。我认为你应该由性能需求来配置这个配置。 – Arpegius 2010-06-02 00:19:49

回答

10

更新:

我不能找到一种方法来确定哪些源的最大数量的设备支持,但我想我已经找到了如何确定上下文支持的最大值(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或内存最大化。

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

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

iPhone支持32个来源。

我看到一个基于硬件的驱动程序是软件支持的。这意味着它会给每个源硬件通道,直到它们耗尽。然后,在将软件从硬件上卸下之前,它会在软件中混合一些声音。这给了两个世界中最好的,接近​​无限的来源,同时仍然尽可能多地使用硬件加速。

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

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

+2

我的X-FI可以同时播放1024个源文件。 – uray 2010-07-29 00:13:40

+2

好的答案,但善良的伤心:(截至2012年,这仍然是最好的呢? – 2012-03-13 05:56:02

+1

X-FI是一个伟大的卡 – bobobobo 2013-10-16 17:14:05

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()之外,没有其他解决方案,直到它返回错误。你应该注意到,一些实现的行为有所不同,例如在Apple iPhone上的AFAIK,他们可以创建256个源代码,但不能同时播放256个源代码(限于64个代码),因此最大代码不一定是与最大并发播放相同的东西。

+0

'ALC_STEREO_SOURCES'和'ALC_MONO_SOURCES'是通过上下文创建请求功能的参数 - 而不是查询[本书中的更多内容](https://books.google.pl/books?id=xtrEvAdSOWEC&pg=PT345&lpg=PT345&dq=alcCreateContext+ALC_MONO_SOURCES&source=bl&ots=f9HL4eMzUy&sig=y7EzhnmRA0P_BJDz4bH69CPMbUo&hl=pl&sa=X&ei=PHMUVbX4EtPUap-ogqAB&ved= 0CDUQ6AEwAw#v = onepage&q = alcCreateContext%20ALC_MONO_SOURCES&f = false) – 2015-03-26 21:35:21

+0

@KrzysztofPrzygoda:其实在这个答案中提出的建议工作得很好(至少在我的机器上) – Tara 2015-09-23 09:45:32

+0

也许吧,但这只是运气罢了 – 2015-09-23 09:57:12

8

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

在iPad 4(我已经测试的唯一设备),则可以有同时播放的声音的最大数目是32 。如果您尝试播放声音33,你alSourcePlay()

AL ERROR: -1 - AL_INVALID (general error)

得到一个错误,而且声音不发挥。但来源可以存在,可以移动,并为其设置各种设置。直到其他32个播放声音中的一个完成播放,它才会播放。

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

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

+0

注意如果你有32个声音播放,然后你'alSourceStop()',然后'alSourcePlay()',你仍然得到-1错误,所以_actua l你在iOS上应该同时播放的声音的最大数量是31。 – bobobobo 2013-10-17 21:38:53