OSDN Git Service

インストーラでインストールした SSTFEditor を起動するとメッセージが規定(英語)になるミスを修正。
[strokestylet/CsWin10Desktop3.git] / StrokeStyleT / ステージ / 演奏 / ドラムサウンド.cs
index e01eafc..7e67ea5 100644 (file)
@@ -13,53 +13,59 @@ namespace SST.ステージ.演奏
                public ドラムサウンド()
                {
                }
+
                protected override void On活性化( デバイスリソース dr )
                {
-                       this.KitXmlを読み込む();
+                       this._KitXmlを読み込む();
                }
+
                protected override void On非活性化( デバイスリソース dr )
                {
-                       this.すべてのコンテキストを初期化する();
+                       this._すべてのコンテキストを初期化する();
                }
+
                public void 発声する( SSTFormat.チップ種別 chipType, float 音量0to1 )
                {
-                       if( false == this.チップtoコンテキスト.ContainsKey( chipType ) )
-                               return; // コンテキスト未登録のチップなら何もしない。
-                       var context = this.チップtoコンテキスト[ chipType ];
-
-                       // 現在発声中のサウンドを全部止めるチップ種別の場合は止める。
-                       if( 0 != chipType.排他発声グループID() ) // ID = 0 は対象外。
+                       lock( this._スレッド間同期 )
                        {
-                               // 同じ排他発声グループIDを持つコンテキストの Sounds[] を select する。
-                               var 停止するサウンド群 =
-                                       from kvp in this.チップtoコンテキスト
-                                       where ( kvp.Key.排他発声グループID() == chipType.排他発声グループID() )
-                                       select kvp.Value.Sounds;
-
-                               // 集めた Sounds[] をすべて停止する。
-                               foreach( var sounds in 停止するサウンド群 )
-                                       foreach( var sound in sounds )
-                                               sound.再生を停止する();
-                       }
+                               if( false == this._チップtoコンテキスト.ContainsKey( chipType ) )
+                                       return; // コンテキスト未登録のチップなら何もしない。
+                               var context = this._チップtoコンテキスト[ chipType ];
 
-                       // 再生する。
-                       if( null != context.Sounds[ context.次に再生するSound番号 ] )
-                       {
-                               context.Sounds[ context.次に再生するSound番号 ].音量 = 音量0to1;
-                               context.Sounds[ context.次に再生するSound番号 ].再生を開始する();
-                       }
+                               // 現在発声中のサウンドを全部止めるチップ種別の場合は止める。
+                               if( 0 != chipType.排他発声グループID() ) // ID = 0 は対象外。
+                               {
+                                       // 消音対象のコンテキストの Sounds[] を select する。
+                                       var 停止するサウンド群 =
+                                               from kvp in this._チップtoコンテキスト
+                                               where ( chipType.直前のチップを消音する( kvp.Key ) )
+                                               select kvp.Value.Sounds;
+
+                                       // 集めた Sounds[] をすべて停止する。
+                                       foreach( var sounds in 停止するサウンド群 )
+                                               foreach( var sound in sounds )
+                                                       sound.Stop();
+                               }
 
-                       // サウンドローテーション。
-                       context.次に再生するSound番号++;
-                       if( context.次に再生するSound番号 >= ドラムサウンド.多重度 )
-                               context.次に再生するSound番号 = 0;
+                               // 再生する。
+                               if( null != context.Sounds[ context.次に再生するSound番号 ] )
+                               {
+                                       context.Sounds[ context.次に再生するSound番号 ].Volume = 音量0to1;
+                                       context.Sounds[ context.次に再生するSound番号 ].Play();
+                               }
+
+                               // サウンドローテーション。
+                               context.次に再生するSound番号++;
+                               if( context.次に再生するSound番号 >= ドラムサウンド._多重度 )
+                                       context.次に再生するSound番号 = 0;
+                       }
                }
 
-               protected const int 多重度 = 2;
-               protected readonly string KitXmlファイルパス = @"$(Static)\sounds\Kit.xml";
-               protected class Cコンテキスト : IDisposable
+               private const int _多重度 = 2;
+
+               private class Cコンテキスト : IDisposable
                {
-                       public FDK.メディア.サウンド.WASAPI排他.Sound[] Sounds = new FDK.メディア.サウンド.WASAPI排他.Sound[ ドラムサウンド.多重度 ];
+                       public FDK.メディア.サウンド.WASAPI.Sound[] Sounds = new FDK.メディア.サウンド.WASAPI.Sound[ ドラムサウンド._多重度 ];
                        public int 次に再生するSound番号 = 0;
 
                        public void Dispose()
@@ -68,35 +74,41 @@ namespace SST.ステージ.演奏
                                {
                                        for( int i = 0; i < this.Sounds.Length; i++ )
                                        {
-                                               StrokeStyleT.Wasapiデバイス.サウンドをミキサーから削除する( this.Sounds[ i ] );
+                                               this.Sounds[ i ].Stop();
                                                FDK.Utilities.解放する( ref this.Sounds[ i ] );
                                        }
                                }
                        }
                };
-               protected Dictionary<SSTFormat.チップ種別, Cコンテキスト> チップtoコンテキスト = null;
 
-               private void すべてのコンテキストを初期化する()
+               private Dictionary<SSTFormat.チップ種別, Cコンテキスト> _チップtoコンテキスト = null;
+
+               private readonly string _KitXmlファイルパス = @"$(Static)\sounds\Kit.xml";
+
+               private readonly object _スレッド間同期 = new object();
+
+               private void _すべてのコンテキストを初期化する()
                {
                        // すでに存在しているなら解放する。
-                       if( null != this.チップtoコンテキスト )
+                       if( null != this._チップtoコンテキスト )
                        {
-                               foreach( var kvp in this.チップtoコンテキスト )
+                               foreach( var kvp in this._チップtoコンテキスト )
                                        ( (Cコンテキスト) kvp.Value ).Dispose();
                        }
 
                        // 生成する。
-                       this.チップtoコンテキスト = new Dictionary<SSTFormat.チップ種別, Cコンテキスト>();
+                       this._チップtoコンテキスト = new Dictionary<SSTFormat.チップ種別, Cコンテキスト>();
                }
-               private void KitXmlを読み込む()
+
+               private void _KitXmlを読み込む()
                {
-                       this.すべてのコンテキストを初期化する();
+                       this._すべてのコンテキストを初期化する();
 
-                       string ファイルパス = FDK.フォルダ.絶対パスに含まれるフォルダ変数を展開して返す( this.KitXmlファイルパス );
+                       string ファイルパス = FDK.フォルダ.絶対パスに含まれるフォルダ変数を展開して返す( this._KitXmlファイルパス );
 
                        if( false == File.Exists( ファイルパス ) )
                        {
-                               FDK.Log.WARNING( $"Kit ファイルが存在しません。ドラムサウンドは生成されません。[{this.KitXmlファイルパス}]" );
+                               FDK.Log.WARNING( $"Kit ファイルが存在しません。ドラムサウンドは生成されません。[{this._KitXmlファイルパス}]" );
                                return;
                        }
 
@@ -130,35 +142,33 @@ namespace SST.ステージ.演奏
                                                                                if( File.Exists( サウンドファイルパス ) )
                                                                                {
                                                                                        // すでに辞書に存在してるなら、解放して削除する。
-                                                                                       if( this.チップtoコンテキスト.ContainsKey( チップ種別 ) )
+                                                                                       if( this._チップtoコンテキスト.ContainsKey( チップ種別 ) )
                                                                                        {
-                                                                                               this.チップtoコンテキスト[ チップ種別 ]?.Dispose();
-                                                                                               this.チップtoコンテキスト.Remove( チップ種別 );
+                                                                                               this._チップtoコンテキスト[ チップ種別 ]?.Dispose();
+                                                                                               this._チップtoコンテキスト.Remove( チップ種別 );
                                                                                        }
 
                                                                                        // コンテキストを作成する。
                                                                                        var context = new Cコンテキスト() {
-                                                                                               Sounds = new FDK.メディア.サウンド.WASAPI排他.Sound[ ドラムサウンド.多重度 ],
+                                                                                               Sounds = new FDK.メディア.サウンド.WASAPI.Sound[ ドラムサウンド._多重度 ],
                                                                                                次に再生するSound番号 = 0,
                                                                                        };
-                                                                                       for( int i = 0; i < context.Sounds.Length; i++ )
-                                                                                       {
-                                                                                               // 多重度分のサウンドを生成しつつ、ミキサーにも登録。
-                                                                                               context.Sounds[ i ] = new FDK.メディア.サウンド.WASAPI排他.Sound( サウンドファイルパス );
-                                                                                               StrokeStyleT.Wasapiデバイス.サウンドをミキサーに追加する( context.Sounds[ i ] );
-                                                                                       }
 
+                                                                                       // 多重度分のサウンドを生成する。
+                                                                                       for( int i = 0; i < context.Sounds.Length; i++ )
+                                                                                               context.Sounds[ i ] = StrokeStyleT.サウンドデバイス.CreateSound( サウンドファイルパス );
+                                                                                       
                                                                                        // コンテキストを辞書に追加する。
-                                                                                       this.チップtoコンテキスト.Add( チップ種別, context );
+                                                                                       this._チップtoコンテキスト.Add( チップ種別, context );
                                                                                }
                                                                                else
                                                                                {
-                                                                                       FDK.Log.WARNING( $"サウンドファイル {FDK.フォルダ.絶対パスをフォルダ変数付き絶対パスに変換して返す( サウンドファイルパス )} が存在しません。[{this.KitXmlファイルパス}]" );
+                                                                                       FDK.Log.WARNING( $"サウンドファイル {FDK.フォルダ.絶対パスをフォルダ変数付き絶対パスに変換して返す( サウンドファイルパス )} が存在しません。[{this._KitXmlファイルパス}]" );
                                                                                }
                                                                        }
                                                                        else
                                                                        {
-                                                                               FDK.Log.WARNING( $"未知の要素 {Sound要素のName属性.Value} をスキップします。[{this.KitXmlファイルパス}]" );
+                                                                               FDK.Log.WARNING( $"未知の要素 {Sound要素のName属性.Value} をスキップします。[{this._KitXmlファイルパス}]" );
                                                                        }
                                                                        break;
                                                        }
@@ -170,7 +180,7 @@ namespace SST.ステージ.演奏
                        }
                        catch( Exception e )
                        {
-                               FDK.Log.ERROR( $"Kitファイルの読み込みに失敗しました。{e.Message}[{this.KitXmlファイルパス}]" );
+                               FDK.Log.ERROR( $"Kitファイルの読み込みに失敗しました。{e.Message}[{this._KitXmlファイルパス}]" );
                        }
                }
        }