20

基盤となるサウンドハードウェアで許可されるOpenAL「ソース」の最大数を定義できるAPIはありますか?

インターネットを検索して、2つの推奨事項を見つけました:

  • エラーが発生するまで、OpenALソースを生成し続けます。ただし、FreeSL(OpenALラッパー)には、これは「非常に悪く、ライブラリをクラッシュさせる可能性さえある」という注記があります。
  • 16個しかないと仮定します。なぜ誰もがもっと必要とするのでしょうか?(!)

2番目の推奨事項は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;
   }
}

これにより、標準のOpenALドライバーを使用してUbuntu10.4で255が返されます。


長い答えはちょっと...

ソフトウェアベースのOpenALドライバーは、通常、無限の数のソースを許可します。まあ、実際には無限ではありませんが、最終的にはCPUまたはRAMのいずれかを最大にします。

ほとんどのハードウェアベースのOpenALドライバーは、ハードウェアにチャネルがある数のソースのみをサポートします。現代では、それは少なくとも16、おそらく32以上ですが、256にもなる可能性があります。おそらくそれ以上をサポートするサウンドカードがありますが、256は私が今まで見た中で最大です。

Windowsでは、DirectSoundベースのドライバーは任意に31(なぜ32ではないのですか?)ソースに制限されています。DirectSoundは非推奨になっているため、これがVistaとWindows7にまだ適用されるかどうかはわかりません。

iPhoneは32のソースをサポートしています。

ソフトウェアでバックアップされたハードウェアベースのドライバーを見たことがあります。つまり、各ソースに、なくなるまでハードウェアチャネルが与えられます。次に、ハードウェアから出荷する前に、ソフトウェアでいくつかのサウンドをミックスします。これにより、可能な限り多くのハードウェアアクセラレーションを使用しながら、無限のソースに近い両方の長所が得られます。

実際には、ハードウェアベースのドライバーを使用している場合は、alGenSourcesが失敗するまでドライバーを作成し続けてください。これはiPhoneでは機能しないと聞きました。alGenSourcesが失敗する前にクラッシュするソフトウェアベースのOpenALドライバーがいくつかあります。

ハードウェアアクセラレーションされたソースの最大数とソースの数をチェックするためのAPIが本当に必要です。多分拡張機能にあります。

于 2010-07-08T13:09:41.057 に答える
8

を介して作成できるソースの数は、同時に再生できるソースの数alGenSources()とは関係ありません。

iPad 4(私がテストした唯一のデバイス)では、同時に再生できる音声の最大数は32です。33番目のサウンドを再生しようとすると、エラーが発生します。alSourcePlay()

ALエラー:-1-AL_INVALID(一般エラー)

そして、音が鳴りません。ただし、ソースは存在することも、移動することも、さまざまな設定を行うこともできます。他の32の再生音のいずれかが再生を終了するまで再生されません。

ループを使用するだけで、iPad4で最大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()エラーが返されるまで呼び出す以外に解決策はありません。

また、一部の実装では動作が異なることに注意してください。たとえば、Apple iPhoneでは256ソースを同時に作成できますが、256ソースを同時に再生することはできないため(64に制限)、最大ソースは常に最大と同じではありません。同時プレイ。

于 2010-07-29T00:23:21.430 に答える