OSDN Git Service

進行と描画を分離していた箇所のうち、高速進行が不要なものは進行描画メソッドに移行。
[strokestylet/CsWin10Desktop3.git] / StrokeStyleT / ステージ / 曲読込 / 曲読込ステージ.cs
index 369fefa..2a76bd3 100644 (file)
@@ -2,89 +2,93 @@
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Linq;
+using SSTFormat.v2;
 using FDK;
 using FDK.メディア;
-using SSTFormat.v1;
+using SST.曲;
 
 namespace SST.ステージ.曲読込
 {
-       /// <remarks>
-       /// 入力:
-       ///   Func<string> 読込曲のファイルパスを取得する(null 可)
-       ///   StrokeStyleT.ユーザ管理.現在選択されているユーザ(コンフィグ情報)
-       ///   
-       /// 出力:
-       ///   StrokeStyleT.演奏スコア(ファイルパスが null だったならこちらも null になる)
-       /// </remarks>
        class 曲読込ステージ : ステージ
        {
-               public Func<string> 読込曲のファイルパスを取得する = null;
+               public enum フェーズ
+               {
+                       開始,
+                       完了,
+               }
 
-               public enum フェーズ { 初期状態, 読込中, 終了 }
+               public フェーズ 現在のフェーズ
+               {
+                       get;
+                       protected set;
+               }
 
-               public フェーズ 現在のフェーズ { get; protected set; } = フェーズ.初期状態;
 
-               protected override void On活性化( デバイスリソース dr )
+               public 曲読込ステージ()
                {
-                       Log.Info( "曲読込ステージを開始します。" + ( StrokeStyleT.ビュアーモードである ? "(ViewerMode)" : "" ) );
-                       Trace.Assert( null != this.読込曲のファイルパスを取得する, "[バグあり] 活性化の前に外部依存アクションを接続してください。" );
+               }
 
-                       // 未解放なら解放する。念のため。
-                       StrokeStyleT.演奏スコア?.Dispose();
+               protected override void On活性化( グラフィックデバイス gd )
+               {
+                       using( Log.Block( FDKUtilities.現在のメソッド名 ) )
+                       {
+                               if( App.ビュアーモードではない )
+                                       Trace.Assert( App.ユーザ管理.選択されているユーザ.曲ツリー.フォーカスノード is MusicNode );
 
-                       this.現在のフェーズ = フェーズ.読込中;
+                               this.現在のフェーズ = フェーズ.開始;
+                       }
                }
 
-               protected override void Oné\9d\9eæ´»æ\80§å\8c\96( ã\83\87ã\83\90ã\82¤ã\82¹ã\83ªã\82½ã\83¼ã\82¹ dr )
+               protected override void Oné\9d\9eæ´»æ\80§å\8c\96( ã\82°ã\83©ã\83\95ã\82£ã\83\83ã\82¯ã\83\87ã\83\90ã\82¤ã\82¹ gd )
                {
-                       Log.Info( "曲読込ステージを終了します。" );
+                       using( Log.Block( FDKUtilities.現在のメソッド名 ) )
+                       {
+                       }
                }
 
-               public override void é\80²è¡\8cæ\8f\8fç\94»ã\81\99ã\82\8b( ã\83\87ã\83\90ã\82¤ã\82¹ã\83ªã\82½ã\83¼ã\82¹ dr )
+               public override void é\80²è¡\8cæ\8f\8fç\94»ã\81\99ã\82\8b( ã\82°ã\83©ã\83\95ã\82£ã\83\83ã\82¯ã\83\87ã\83\90ã\82¤ã\82¹ gd )
                {
+                       Debug.Assert( this.活性化している );
+
                        switch( this.現在のフェーズ )
                        {
-                               case フェーズ.読込中:
+                               case フェーズ.開始:
+                                       #region " *** "
+                                       //----------------
                                        {
-                                               // SSTFファイルを読み込んでスコアを構築。
-                                               string 選択曲ファイルパス = this.読込曲のファイルパスを取得する();
+                                               var node = ( App.ビュアーモードではない ) ?
+                                                       (MusicNode) App.ユーザ管理.選択されているユーザ.曲ツリー.フォーカスノード :        // (A) 通常モード
+                                                       App.ビュアー用ノード;                                                        // (B) ビュアーモード時
 
-                                               if( 選択曲ファイルパス.Nullでも空でもない() )
-                                               {
-                                                       var user = StrokeStyleT.ユーザ管理.現在選択されているユーザ;
+                                               string 選択曲ファイルパス = node.曲ファイルパス;
+                                               Trace.Assert( 選択曲ファイルパス.Nullでも空でもない() );
 
-                                                       StrokeStyleT.演奏スコア = new スコア(
-                                                               SST.フォルダ.絶対パスに含まれるフォルダ変数を展開して返す( 選択曲ファイルパス ),
-                                                               user.Rideは左,
-                                                               user.Chinaは左,
-                                                               user.Splashは左 );
+                                               // スコアを読み込む。
+                                               using( Log.Block( "曲の読み込み" ) )
+                                               {
+                                                       App.演奏スコア = new スコア( SST.IO.Folder.絶対パスに含まれるフォルダ変数を展開して返す( 選択曲ファイルパス ) );
 
-                                                       // サウンドデバイス遅延を全チップの発声時刻へ反映する。
-                                                       float 作成時遅延ms = StrokeStyleT.演奏スコア.Header.サウンドデバイス遅延ms;
-                                                       if( 0f < 作成時遅延ms )
+                                                       // ã\82µã\82¦ã\83³ã\83\89ã\83\87ã\83\90ã\82¤ã\82¹é\81\85延ã\82\92å\8f\96å¾\97ã\81\97ã\80\81å\85¨ã\83\81ã\83\83ã\83\97ã\81®ç\99ºå£°æ\99\82å\88»ã\81¸å\8f\8dæ\98 ã\81\99ã\82\8bã\80\82
+                                                       float 作成時遅延ms = App.演奏スコア.Header.サウンドデバイス遅延ms;
+                                                       if( 0 < 作成時遅延ms )
                                                        {
-                                                               float 再生時遅延ms = (float) ( StrokeStyleT.サウンドデバイス.遅延sec * 1000.0 );
+                                                               float 再生時遅延ms = (float) ( App.サウンドデバイス.遅延sec * 1000.0 );
                                                                long 加算分ms = (long) ( 作成時遅延ms - 再生時遅延ms );  // 例: 作成時遅延 7ms, 再生時遅延 10ms の場合、発声時刻に 7-10 = -3ms 加算する(3ms 早く発声させる)。
 
                                                                Log.Info( $"作成時遅延={作成時遅延ms}ms, 再生時遅延={再生時遅延ms}ms => 加算分 = {加算分ms}ms" );
 
-                                                               foreach( var chip in StrokeStyleT.演奏スコア.チップリスト )
+                                                               foreach( var chip in App.演奏スコア.チップリスト )
                                                                        chip.発声時刻ms += 加算分ms;
                                                        }
-                                                       else
-                                                       {
-                                                               Log.WARNING( $"この曲ファイルには 作成時遅延(SoundDevice.Delay) の指定がありません。演奏時に音ズレを起こす可能性があります。" );
-                                                       }
-                                               }
-                                               else
-                                               {
-                                                       // ビュアーモードの起動直後ならこちら。
-                                                       StrokeStyleT.演奏スコア = null;
-                                               }
 
-                                               // フェーズ終了。
-                                               this.現在のフェーズ = フェーズ.終了;
+                                                       this.現在のフェーズ = フェーズ.完了;
+                                               }
                                        }
+                                       //----------------
+                                       #endregion
+                                       break;
+
+                               case フェーズ.完了:
                                        break;
                        }
                }