Skip to content

kaz-jgs/xaudio_drv

Repository files navigation

教材用XAudio2サウンドドライバver 0.1.0 by kaz-jgs

■概要
●
「サウンドプログラミングの入り口に立つための教材用」となることを目指した、シンプルなXAudio2のサウンドドライバです。
自由に使用・流用・転用してもらって構いませんが何が起きても一切責任は負えませんのでご了承ください。

●
Windows用です。XAudio2なので動作環境はWindows XP以降、DirectX 9以降です。
ほかの環境は想定していませんが、改造すればXbox系なら動くかもしれません。

●
特記の無い場合はC++11 + STLで書かれています。
Visual Studioでビルドすることしか想定していないため、ほかのビルドシステムでの使用はサポート対象外です。
なお、C++11を使っているのでVisual Studioは2013以降のみの対応です。
ビルド・デバッグ版の動作にはDirectX SDKが必要です。リリース版もSDKかDirectX再頒布パッケージが必要です。
使用しているDirectXのパッケージのバージョンは2010(June)です。ほかでは動かないかもしれません。

●
あくまでも教材用であり実用は考慮していないので、チュートリアル用途以外の使用は非推奨です。
特に、クラス構成回りは実用性より読みやすさやサウンドプログラムの初歩のわかりやすさを重視したつもりなので、
実用化するなら求められるスペックやツール作成も考慮した上でクラス設計からやり直したほうがいいです。
あとメモリが断片化し放題なのでこのままに近い形で使うならせめてアロケータを導入したほうがいいと思います。



■制限などについて
下記制限は「これ以上実装するととっかかり辛くなるかな」と思って簡略化した or 実装しなかった項目です。
技術的には可能なので興味があれば実装してみてください。
・サウンドデバイスはOSの先頭で認識されたもののみを使います。
・マスタリングボイスのフォーマットはデバイスのデフォルト値で初期化しています。
・出力バスのフォーマットは48kHz STEREOのみです。
・音源トラックのフォーマットは元のwavファイルのフォーマットに固定されます。
・ループポイントはsmplチャンクのループ情報の先頭のみ反映します。
・ループ / 非ループをランタイム側で切り替えられるようにしていません。
・オブジェクト側では複数出力バスを持てるようにしていますが、実際に複数出力バスを設定するインターフェイスを用意していません。
・エフェクト周りは実装していません。
などなど。



■構成について
Drv.h / Drv.cpp
このサウンドドライバを操作するためのグローバルインターフェイス + オブジェクト管理です。
アプリケーション側でこのインターフェイスを用いてサウンドシステムを構築することを想定しています。

class Core(Core.h / Core.cpp)
サウンドドライバの本体です。
XAudio2エンジンの管理やマスタリングボイスの管理、XAudio2ボイスの生成などを行います。
シングルトンです。

class TrackBase(TrackBase.h / TrackBase.cpp)
音量調整やハンドル生成など各トラックオブジェクトに共通の処理を書いています。

class Snd(Snd.h / Snd.cpp)
音源トラックオブジェクトです。class TrackBaseを継承しています。
内部でソースボイス1つの管理と操作を行います。

class Bus(Bus.h / Bus.cpp)
出力バスオブジェクトです。class TrackBaseを継承しています。
内部でサブミックスボイス1つの管理と操作を行います。

class Master(Master.h / Master.cpp)
マスタリングボイス用のトラックオブジェクトです。
マスタリングボイスにclass TrackBaseのオブジェクトと同等の処理を加えたい場合のために用意しています。

class Wave(Wave.cpp / Wave.h)
wavファイルのローダー兼パーサーです。
対象のファイルをメモリマップトファイルとして操作しているので、
バッファの転送時にマッピングアドレスを使えば擬似ストリーミングが可能です。

class SndCallback(SndCallback.h / SndCallback.cpp)
struct IXAudio2VoiceCallbackを継承した、class Sndに持たせるソースボイス用のコールバッククラスです。



■余談
C/C++両対応やdll化などもできるようにとグローバル関数でインターフェイスを実装しましたが、
クラスで実装してアプリケーション側のサウンドシステムに継承してもらった方が綺麗だったかもなぁ、
などと、とあるミドルウェアを触ってて今更思いました。
気が向いたらそっちのバージョンも作るかもしれません。



■免責
最初にも書いたとおり、このプログラムを使用した上で発生した如何なる問題についても作者は責任を負いかねます。
バグ報告や改善要望はいただけるとありがたくはありますが、対応できるかはわかりません。
質問等は受け付けられないと思います。友人知人は直接訊いていただければ答えられるかもしれません。

About

xaudio2 samples for my studying

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published