OSDN Git Service

ビュアーメッセージキューを実装。
authorくまかみ工房 <kumakamikoubou@gmail.com>
Tue, 18 Oct 2016 07:53:24 +0000 (16:53 +0900)
committerくまかみ工房 <kumakamikoubou@gmail.com>
Tue, 18 Oct 2016 07:53:24 +0000 (16:53 +0900)
StrokeStyleT/StrokeStyleT.cs
StrokeStyleT/StrokeStyleT.csproj
StrokeStyleT/ステージ/演奏/ビュアーステージ.cs
StrokeStyleT/ステージ/演奏/ビュアーメッセージ.cs [new file with mode: 0644]
StrokeStyleT/ステージ/演奏/ビュアーメッセージキュー.cs [new file with mode: 0644]

index d726b8f..441a9a4 100644 (file)
@@ -21,20 +21,8 @@ namespace SST
                public static SST.曲.曲ツリー管理 曲ツリー管理 => ( StrokeStyleT.bs_曲ツリー管理 );
                public static SSTFormat.スコア 演奏スコア { get; set; } = null;
                public static SST.設定.Config Config => ( StrokeStyleT.bs_Config );
-
-               /// <summary>
-               /// ビュアーモード用のプロパティ。(static)
-               /// 各プロパティの値は、起動時のコマンドライン引数を解析して得られる。
-               /// </summary>
-               public class ViewerMode
-               {
-                       public bool ビュアーモードである => ( this.曲ファイルパス.Nullでも空でもない() );
-                       public string 曲ファイルパス { get; set; } = null;
-                       public int 演奏開始小節番号 { get; set; } = 0;
-                       public bool 演奏停止 { get; set; } = false;
-                       public bool ドラム音を使う { get; set; } = false;
-               }
-               public static ViewerMode ビュアーモード => ( StrokeStyleT.bs_ビュアーモード );
+               public static bool ビュアーモードである { get; set; } = false;
+               public static SST.ステージ.演奏.ビュアーメッセージキュー ビュアーメッセージキュー => ( StrokeStyleT.bs_ビュアーメッセージキュー );
 
                public static void すべての入力デバイスをポーリングする()
                {
@@ -65,8 +53,7 @@ namespace SST
                        {
                                Debug.Assert( null == this.デバイスリソース, "デバイスリソースの作成前であること。" );
 
-                               StrokeStyleT.bs_ビュアーモード = this.コマンドライン引数を解析する(
-                                       Environment.GetCommandLineArgs().Skip( 1 ) );   // 最初の要素は exe ファイル名なのでスキップする。
+                               this.コマンドライン引数を解析する( Environment.GetCommandLineArgs().Skip( 1 ) );   // 最初の要素は exe ファイル名なのでスキップする。
 
                                this.MainForm.Text = $"StrokeStyle<T> {System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()}";
                                this.設計画面サイズdpx = new SharpDX.Size2F( 1920, 1080 );     // 設計画面サイズdpx(固定)
@@ -255,7 +242,7 @@ namespace SST
                                                case nameof( ステージ.ステージ ):
                                                        #region " ビュアーモード → ビュアーステージへ。"
                                                        //----------------
-                                                       if( StrokeStyleT.ビュアーモード.ビュアーモードである )
+                                                       if( StrokeStyleT.ビュアーモードである )
                                                        {
                                                                this.ビュアーステージ.活性化する( this.デバイスリソース );
                                                                this.現在のステージ = this.ビュアーステージ;
@@ -478,10 +465,9 @@ namespace SST
 
                        lock( this.スレッド間同期 )
                        {
-                               if( StrokeStyleT.ビュアーモード.ビュアーモードである )
+                               if( StrokeStyleT.ビュアーモードである )
                                {
-                                       this.新しいビュアーモード = this.コマンドライン引数を解析する( eventArgs.CommandLine );
-                                       this.ビュアーモードアクションを実行せよ.状態 = FDK.同期.TriStateEvent.状態種別.ON;
+                                       this.コマンドライン引数を解析する( eventArgs.CommandLine );
                                }
                                else
                                {
@@ -505,10 +491,6 @@ namespace SST
 
                private SST.ステージ.ステージ 現在のステージ = null;
 
-               // ビュアーモード連携。
-               private ViewerMode 新しいビュアーモード = null;
-               private FDK.同期.TriStateEvent ビュアーモードアクションを実行せよ = new FDK.同期.TriStateEvent( FDK.同期.TriStateEvent.状態種別.OFF );
-
                #region " バックストア。"
                //----------------
                private static SST.フォルダ bs_フォルダ = null;
@@ -519,7 +501,7 @@ namespace SST
                private static SST.ユーザ.ユーザ管理 bs_ユーザ管理 = null;
                private static SST.曲.曲ツリー管理 bs_曲ツリー管理 = null;
                private static SST.設定.Config bs_Config = null;
-               private static SST.StrokeStyleT.ViewerMode bs_ビュアーモード = new ViewerMode();
+               private static readonly SST.ステージ.演奏.ビュアーメッセージキュー bs_ビュアーメッセージキュー = new ステージ.演奏.ビュアーメッセージキュー();
                //----------------
                #endregion
 
@@ -528,44 +510,47 @@ namespace SST
                /// </summary>
                /// <param name="args">コマンドライン引数の列挙。exeファイル名は含まない。</param>
                /// <return>引数を反映したビュアーモード変数。</return>
-               private ViewerMode コマンドライン引数を解析する( IEnumerable<string> args )
+               private void コマンドライン引数を解析する( IEnumerable<string> args )
                {
                        FDK.Log.BeginInfo( $"{FDK.Utilities.現在のメソッド名}" );
 
-                       var vmode = new ViewerMode() {
-                               曲ファイルパス = null,
-                               演奏停止 = false,
-                               演奏開始小節番号 = 0,
-                               ドラム音を使う = false,
-                       };
-
                        try
                        {
                                if( 0 == args.Count() )
                                {
-                                       FDK.Log.Info( "引数は指定されていません。" );      // ビュアーモードではない。
-                                       return vmode;
+                                       FDK.Log.Info( "引数は指定されていません。" );    // ビュアーモードではない。
+                                       return;
                                }
 
+                               StrokeStyleT.ビュアーモードである = true;
+
                                try
                                {
+                                       // 新しいメッセージを生成する。
+                                       var msg = new ステージ.演奏.ビュアーメッセージ() {
+                                               種別 = ステージ.演奏.ビュアーメッセージ.E種別.演奏開始,          // 規定値は「演奏開始」
+                                               曲ファイルパス = null,
+                                               演奏開始小節番号 = 0,
+                                               ドラム音を発声する = false,    // 規定値は false
+                                       };
+
                                        // オプションを定義する。
                                        var optionSet = new Mono.Options.OptionSet() {
                                                "Usage: StrokeStyleT [File] [OPTIONS]+",
                                                "  File\t\t\t\tビュアーモードで表示する曲ファイル名です。",
-                                               { "p=|part=", "ビュアーモードで起動し、指定された小節番号から演奏を開始します。小節番号を省略すると、先頭から再生します。", (int v) => { vmode.演奏開始小節番号 = v; }  },
-                                               { "s|stop", "ビュアーモードで演奏中であれば、演奏を停止します。", v => { vmode.演奏停止 = ( v != null ); } },
-                                               { "d|drums", "ビュアーモードで、チップヒット時に内蔵のドラム音を再生します。", v => { vmode.ドラム音を使う = ( v != null ); } },
+                                               { "p=|part=", "ビュアーモードで起動し、指定された小節番号から演奏を開始します。小節番号を省略すると、先頭から再生します。", (int v) => { msg.演奏開始小節番号 = v; }  },
+                                               { "s|stop", "ビュアーモードで演奏中であれば、演奏を停止します。", v => { if ( v != null ) { msg.種別 = ステージ.演奏.ビュアーメッセージ.E種別.演奏停止; } } },
+                                               { "d|drums", "ビュアーモードで、チップヒット時に内蔵のドラム音を再生します。", v => { if( v != null ) { msg.ドラム音を発声する = true; } } },
                                        };
 
                                        // オプションを解析する。
                                        List<string> ファイルパスs = optionSet.Parse( args );
 
                                        // 解析結果。
-                                       if( vmode.演奏停止 )
+                                       if( msg.種別 == ステージ.演奏.ビュアーメッセージ.E種別.演奏停止 )
                                        {
                                                // (A) 演奏停止(曲ファイルパスは省略可。)
-                                               FDK.Log.Info( "演奏停止" );
+                                               FDK.Log.Info( "ビュアーメッセージ: 演奏停止" );
                                        }
                                        else
                                        {
@@ -574,11 +559,11 @@ namespace SST
                                                {
                                                        if( File.Exists( ファイルパスs[ 0 ] ) )
                                                        {
-                                                               vmode.曲ファイルパス = ファイルパスs[ 0 ];
+                                                               msg.曲ファイルパス = ファイルパスs[ 0 ];
                                                        }
                                                        else
                                                        {
-                                                               vmode.曲ファイルパス = null;    // ファイルが存在しなかったら null 。
+                                                               msg.曲ファイルパス = null;    // ファイルが存在しなかったら null 。
                                                                throw new Mono.Options.OptionException( $"ファイルが存在しません。[{FDK.フォルダ.絶対パスをフォルダ変数付き絶対パスに変換して返す( ファイルパスs[ 0 ] )}]", "File" );
                                                        }
                                                }
@@ -587,17 +572,20 @@ namespace SST
                                                        throw new Mono.Options.OptionException( "ファイルの指定がありません。", "File" );
                                                }
 
-                                               FDK.Log.Info( $"曲ファイルパス: {vmode.曲ファイルパス}" );
-                                               FDK.Log.Info( $"開始小節番号: {vmode.演奏開始小節番号}" );
-                                               FDK.Log.Info( $"ドラム音: {vmode.ドラム音を使う}" );
+                                               FDK.Log.Info( "ビュアーメッセージ: 演奏開始" );
+                                               FDK.Log.Info( $"曲ファイルパス: {msg.曲ファイルパス}" );
+                                               FDK.Log.Info( $"開始小節番号: {msg.演奏開始小節番号}" );
+                                               FDK.Log.Info( $"ドラム音: {msg.ドラム音を発声する}" );
                                        }
+
+                                       // キューへ格納。
+                                       StrokeStyleT.ビュアーメッセージキュー.格納する( msg );
+                                       FDK.Log.Info( "ビュアーメッセージを送信しました。" );
                                }
                                catch( Mono.Options.OptionException e )
                                {
                                        FDK.Log.ERROR( $"{e.Message}" );
                                }
-
-                               return vmode;
                        }
                        finally
                        {
index 0094932..18a5815 100644 (file)
@@ -92,7 +92,9 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="ステージ\演奏\ビュアーメッセージキュー.cs" />
     <Compile Include="ステージ\演奏\ビュアーステージ.cs" />
+    <Compile Include="ステージ\演奏\ビュアーメッセージ.cs" />
     <Compile Include="曲\タイトルテクスチャ.cs" />
     <Compile Include="ステージ\選曲\曲パネルビュー.cs" />
     <Compile Include="設定\Config.cs" />
index ed867e7..80b811a 100644 (file)
@@ -2,17 +2,56 @@
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Linq;
+using FDK.メディア;
 
 namespace SST.ステージ.演奏
 {
        class ビュアーステージ : ステージ
        {
-               public enum フェーズ
+               public enum フェーズ { 停止中, 演奏中, 終了 }
+               public フェーズ 現在のフェーズ { get; protected set; } = フェーズ.停止中;
+
+               protected override void On活性化( デバイスリソース dr )
                {
-                       初期状態,
-                       演奏中,
-                       終了,
+                       FDK.Log.Info( "ビュアーステージを開始します。" );
+
+                       this.現在のフェーズ = フェーズ.停止中;            // 初期状態は停止
+                       this.活性化した直後である = true;
                }
-               public フェーズ 現在のフェーズ { get; protected set; } = フェーズ.初期状態;
+               public override void 進行描画する( デバイスリソース dr )
+               {
+                       #region " メッセージの受信と処理。"
+                       //----------------
+                       var queue= StrokeStyleT.ビュアーメッセージキュー;
+
+                       if( 0 < queue.メッセージ数 )
+                       {
+                               var msg = queue.取り出す();
+
+                               switch( msg.種別 )
+                               {
+                                       case ビュアーメッセージ.E種別.演奏開始:
+                                               
+                                               // todo: 演奏開始
+
+                                               break;
+
+                                       case ビュアーメッセージ.E種別.演奏停止:
+                                               
+                                               // todo: 演奏停止
+
+                                               break;
+                               }
+                       }
+                       //----------------
+                       #endregion
+
+                       if( this.現在のフェーズ != フェーズ.演奏中 )
+                               return;
+
+
+               }
+
+               protected bool 活性化した直後である = false;
        }
 }
diff --git a/StrokeStyleT/ステージ/演奏/ビュアーメッセージ.cs b/StrokeStyleT/ステージ/演奏/ビュアーメッセージ.cs
new file mode 100644 (file)
index 0000000..6ce6d18
--- /dev/null
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+
+namespace SST.ステージ.演奏
+{
+       /// <summary>
+       /// アプリからビュアーステージへ渡すメッセージの定義。
+       /// </summary>
+       class ビュアーメッセージ
+       {
+               public enum E種別 { 未定, 演奏開始, 演奏停止 };
+               public E種別 種別 = E種別.未定;
+
+               // 以下は、種別 = 演奏開始 のときのみ有効。
+               public string 曲ファイルパス = null;
+               public int 演奏開始小節番号 = 0;
+               public bool ドラム音を発声する = false;
+       }
+}
diff --git a/StrokeStyleT/ステージ/演奏/ビュアーメッセージキュー.cs b/StrokeStyleT/ステージ/演奏/ビュアーメッセージキュー.cs
new file mode 100644 (file)
index 0000000..92a37e6
--- /dev/null
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+
+namespace SST.ステージ.演奏
+{
+       /// <summary>
+       /// アプリからビュアーステージへメッセージを渡すためのキュー。
+       /// </summary>
+       class ビュアーメッセージキュー
+       {
+               public int メッセージ数
+               {
+                       get
+                       {
+                               lock( this.スレッド間同期 )
+                               {
+                                       return this.キュー.Count;
+                               }
+                       }
+               }
+               public ビュアーメッセージ 取り出す()
+               {
+                       lock( this.スレッド間同期 )
+                       {
+                               return ( 0 < this.キュー.Count ) ? this.キュー.Dequeue() : null;
+                       }
+               }
+               public void 格納する( ビュアーメッセージ msg )
+               {
+                       lock( this.スレッド間同期 )
+                       {
+                               this.キュー.Enqueue( msg );
+                       }
+               }
+
+               protected readonly Queue<ビュアーメッセージ> キュー = new Queue<ビュアーメッセージ>();
+               protected readonly object スレッド間同期 = new object();
+       }
+}