首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenAL -确定最大源

OpenAL -确定最大源
EN

Stack Overflow用户
提问于 2010-05-20 07:56:14
回答 3查看 8.5K关注 0票数 20

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

在互联网上,我发现了两条建议:

  • 继续生成OpenAL源,直到出现错误为止。然而,在library"
  • assume (OpenAL包装器)中有一条注释指出,这“非常糟糕,甚至可能使您只有16的OpenAL崩溃;为什么会有人要求更多?(!)

?”

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

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

谢谢您抽时间见我,

帐单

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-08 13:09:41

更新:

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

代码语言:javascript
复制
//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驱动程序在Ubuntu10.4上返回255。

很长的答案有点..。

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

大多数基于硬件的OpenAL驱动程序只支持尽可能多的资源,因为硬件有通道。现代来说,这至少是16,可能是32或更多,但可以多达256。也许有支持更多的声卡,但256是我看过的最大的。

基于DirectSound的驱动程序被任意限制为31 (为什么不是32?)资料来源。DirectSound已经被否决了,所以我不知道这是否仍然适用于Vista和Windows7。

iPhone支持32个源。

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

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

应该有一个API来检查最大的源数和硬件加速的源数。也许是在延伸区。

票数 13
EN

Stack Overflow用户

发布于 2013-10-16 18:08:01

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

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

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

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

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

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

票数 8
EN

Stack Overflow用户

发布于 2010-07-29 00:23:21

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

代码语言:javascript
复制
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上,他们可以创建256个源max,但不能同时播放256个源(限制在64),因此max源与max并发播放并不总是一样的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2871905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档