private void MainWindow_Closed(object sender, EventArgs e) { this._dispatcherTimer.Stop(); MyAudioSet1.SafeDestroy(ref this._audioSet); MyAudioHelpers.MyAudioManager.Shutdown(); }
public static void SafeDestroy(ref MyAudioSet1 obj) { if (obj != null) { obj.Destroy(); obj = null; } }
public MainWindow() { InitializeComponent(); //this._freeAudioAssetsDirAbs = System.IO.Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.Personal), FreeAudioAssetsDirRel); this._freeAudioAssetsDirAbs = System.IO.Path.GetFullPath(FreeAudioAssetsDirRel); this.Closed += MainWindow_Closed; this._dispatcherTimer = new System.Windows.Threading.DispatcherTimer(); this._dispatcherTimer.Interval = new TimeSpan(1000 * 1000 * 10 / FramesPerSecond); // 単位は100[ns]。 this._dispatcherTimer.Tick += _dispatcherTimer_Tick; try { // SharpDX の XAudio2 は、デスクトップ版の場合 v2.7 (XAudio2_7.dll) を使う模様。つまり DirectX エンドユーザーランタイムのインストールが必須。 // おそらく Windows 8.x ストア アプリ版の場合は v2.8 を、Windows 10 UWP アプリ版の場合は v2.9 をそれぞれ使ってくれるはず。 // SharpDX には XAudio2 のほか Media Foundation のサポートもあるようなので、 // マネージ アプリケーションで WAV/WMA/MP3 の高パフォーマンス ストリーム再生やミキシングをするのに使えそう……と思ったが、 // C++ と比べてリソース管理や例外発生時の処理が煩雑すぎ。逆に不安感がある。 // メモリの確保・解放など、ローレベルな部分は結局 SharpDX のソースコードを追って、実装を具体的にイメージしておかなければならない。 // C++/CLI や C++/CX で直接ラッパーライブラリを書いて、高レベルな I/F の形で公開し、C# の WPF/WinRT フロントエンドで使うほうがよさそう。 // もし Windows Vista/7 もターゲットにする場合は DirectX SDK June 2010 とエンドユーザーランタイムが必要になるが、 // Windows 8 以降をターゲットにする場合は Windows SDK 8.0 以降があれば開発でき、また追加ランタイムのインストールも不要。 MyAudioHelpers.MyAudioManager.Startup(); this._audioSet = new MyAudioSet1(); this._audioSet._audioManager.SetMasterVolume(0.1f); for (int i = 0; i < MyAudioSet1.SoundEffectsSlotCount; ++i) { var fileFullPath = System.IO.Path.Combine(this._freeAudioAssetsDirAbs, this._seAudioFileNames[i]); var buffer = MyMiscHelpers.MyIOHelper.LoadBinaryFromFile(fileFullPath); // ソース配列のマネージ参照は SharpDX 内部で使われているストリームオブジェクト内で保持しているらしいので、 // ホスト側では寿命管理する必要はないらしい。 //this._seFileOnMemory[i] = buffer; this._audioSet._audioPlayerSEs[i] = this._audioSet.CreateAudioPlayer(buffer); } { var fileFullPath = System.IO.Path.Combine(this._freeAudioAssetsDirAbs, BgmFileName); var buffer = MyMiscHelpers.MyIOHelper.LoadBinaryFromFile(fileFullPath); //this._bgmFileOnMemory = buffer; this._audioSet._audioPlayerBGM = this._audioSet.CreateAudioPlayer(buffer); } this._dispatcherTimer.Start(); } catch (Exception ex) { MessageBox.Show(ex.Message); } }