2010-05-20 52 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