+ // (1) リソースを解放して、
+ this.デバイス依存リソースを解放する();
+ this.デバイスリソース.サイズに依存するリソースを解放する();
+
+ // (2) 物理画面サイズを変更して、
+ this.デバイスリソース.物理画面サイズpx = new SharpDX.Size2F( this.MainForm.ClientSize.Width, this.MainForm.ClientSize.Height );
+
+ // (3) リソースを再構築する。
+ this.デバイスリソース.サイズに依存するリソースを作成する();
+ this.デバイス依存リソースを再構築する();
+
+ FDK.Log.EndInfo( $"{FDK.Utilities.現在のメソッド名}" );
+ }
+ private void 全画面モードとウィンドウモードを切り替える()
+ {
+ FDK.Log.BeginInfo( $"{FDK.Utilities.現在のメソッド名}" );
+
+ this.MainForm.IsFullscreen = !this.MainForm.IsFullscreen;
+ this.デバイスリソース.SwapChain1.SetFullscreenState( this.MainForm.IsFullscreen, null );
+
+ FDK.Log.EndInfo( $"{FDK.Utilities.現在のメソッド名}" );
+ }
+ private void ログインする( string ユーザ名 )
+ {
+ StrokeStyleT.ユーザ管理.ユーザを選択する( ユーザ名 );
+ FDK.Log.Info( $"ユーザが選択されました。[{StrokeStyleT.ユーザ管理.現在選択されているユーザ.名前}]" );
+ }
+ private void デバイス情報を出力する()
+ {
+ using( var stream = new NamedPipeClientStream( "SSTFEditor Viewer Device Information" ) )
+ {
+ try
+ {
+ stream.Connect( 1000 );
+
+ using( var writer = new StreamWriter( stream ) )
+ {
+ writer.WriteLine( $"SoundDevice.Delay={StrokeStyleT.Wasapiデバイス.遅延ms.ToString()}" );
+ FDK.Log.Info( "デバイス情報を出力しました。" );
+ }
+ }
+ catch( TimeoutException )
+ {
+ FDK.Log.WARNING( "SSTFEditor ビュアー用パイプへの接続がタイムアウトしました。SSTFEditor が起動していない可能性があります。" );
+ }
+ }
+ }
+ private void 二重起動された( string[] args )
+ {
+ FDK.Log.BeginInfo( $"{FDK.Utilities.現在のメソッド名}" );
+
+ if( StrokeStyleT.ビュアーモードである )
+ {
+ this.コマンドライン引数を解析する( args );
+ }
+ else
+ {
+ FDK.Log.ERROR( "アプリが二重起動されましたが、先行アプリがビュアーモードではないので何もしません。" );
+ }
+
+ FDK.Log.EndInfo( $"{FDK.Utilities.現在のメソッド名}" );
+ }
+ /// <param name="args">コマンドライン引数の列挙。exeファイル名は含まない。</param>
+ private void コマンドライン引数を解析する( IEnumerable<string> args )
+ {
+ FDK.Log.BeginInfo( $"{FDK.Utilities.現在のメソッド名}" );
+
+ try
+ {
+ if( 0 == args.Count() )
+ {
+ 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) => { 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( msg.種別 == ステージ.演奏.ビュアーメッセージ.E種別.演奏停止 )
+ {
+ // (A) 演奏停止(曲ファイルパスは省略可。)
+ FDK.Log.Info( "ビュアーメッセージ: 演奏停止" );
+ }
+ else
+ {
+ // (B) 演奏開始(曲ファイルパスは必須。)
+ if( 0 < ファイルパスs.Count )
+ {
+ if( File.Exists( ファイルパスs[ 0 ] ) )
+ {
+ msg.曲ファイルパス = ファイルパスs[ 0 ];
+ }
+ else
+ {
+ msg.曲ファイルパス = null; // ファイルが存在しなかったら null 。
+ throw new Mono.Options.OptionException( $"ファイルが存在しません。[{FDK.フォルダ.絶対パスをフォルダ変数付き絶対パスに変換して返す( ファイルパスs[ 0 ] )}]", "File" );
+ }
+ }
+ else
+ {
+ throw new Mono.Options.OptionException( "ファイルの指定がありません。", "File" );
+ }
+
+ FDK.Log.Info( "ビュアーメッセージ: 演奏開始" );
+ FDK.Log.Info( $"曲ファイルパス: {msg.曲ファイルパス}" );
+ FDK.Log.Info( $"開始小節番号: {msg.演奏開始小節番号}" );
+ FDK.Log.Info( $"ドラム音: {msg.ドラム音を発声する}" );
+ }
+
+ // キューへ格納。
+ StrokeStyleT.ビュアーメッセージキュー.Enqueue( msg );
+ FDK.Log.Info( "ビュアーメッセージを送信しました。" );
+ }
+ catch( Mono.Options.OptionException e )
+ {
+ FDK.Log.ERROR( $"{e.Message}" );
+ }
+ }
+ finally
+ {
+ FDK.Log.EndInfo( $"{FDK.Utilities.現在のメソッド名}" );
+ }
+ }