0

iOS 5 以降、OpenAL でリバーブ効果がサポートされていますが、この機能を使用する良い例が見つかりませんでした。ObjectAL のソース コードへのリンクがいくつか見つかりましたが、複雑すぎてリバーブ エフェクトの使用法を理解できません。では、OpenAL を使用して iOS アプリにリバーブ効果を追加するにはどうすればよいでしょうか。

4

1 に答える 1

1

ObjectAL のコードベースはかなり複雑になっていますが、OpenAL 側では、ほとんどの場合、実際には C API の 1 つの大きなラッパーにすぎません。リバーブの主要な Objective-C API エントリ ポイントは次のとおりです。

https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/OpenAL/ALListener.m#L194

https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/OpenAL/ALSource.m#L808

自分で実装したい場合は、最初に +[ALWrapper initialize] で行うように拡張機能をバインドする必要があります: https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ ObjectAL/OpenAL/ALWrapper.m#L1363

コアでは、すべてのリバーブ機能は、alcASASetListener() および alcASASetSource() への呼び出しを使用して実行されます。これらの関数を ALWrapper で検索すると、Objective-C で呼び出しがラップされているだけで (さらにいくつかのエラー処理も)、ALSource と ALListener がそれをラップしていることがわかります。最低レベルでは、これらの種類の呼び出しの集まりです。

alcASASetSource(ALC_ASA_REVERB_SEND_LEVEL, sourceID, &value, sizeof(value));

したがって、コードは常に次の 2 つのパスのいずれかに従います。

  • ALSource -> ALWrapper -> alcASASetSource() への生の C 呼び出し
  • ALListener -> ALWrapper -> alcASASetListener() への生の C 呼び出し

グローバル コントロール (リスナーを介して制御) は次のとおりです。

  • リバーブのオン/オフ (グローバル)
  • グローバル リバーブ レベル (リバーブ効果の大きさ)
  • ルームタイプ(ALC_ASA_REVERB_ROOM_TYPE_Cathedralなど各種プリセットあり)
  • EQ ゲイン、帯域幅、周波数 (基本的なフィルタリング、物理的なイコライザーを使用するのと同じ方法で使用 - 使用したとしても、これほど多くは使用しないでしょう)

ローカル コントロール (ソース経由で制御) は次のとおりです。

  • リバーブ センド レベル (このソースに影響するリバーブの量)
  • リバーブ オクルージョン (ドアや薄い壁など、音が部分的に通過できる、リスナーとソースの間の物理オブジェクトをシミュレートします)
  • リバーブの障害物 (リスナーとソースの間の音を伝えない物理的なオブジェクトをシミュレートし、コンクリートの柱のように周囲を回る音だけが聞こえるようにします)

ここにも小さなデモを書きました: https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectALDemo/Demos/ReverbDemo.m

私が知る限り、Apple は多くのドキュメントを公開していません。そのため、レポを複製し、デモをビルドし、すべてがどのように連携するかを感じるまで API をいじってみるのが最善の策です。次に、ObjectAL を使用して行った内容を実際の alcASASetListener() およびその仲間への呼び出しに変換する必要がありますが、最終的には単なるラッパー コードであるため、これらはかなり直接的な変換になるはずです。

于 2012-10-08T21:30:16.973 に答える