<Compile Include="コード\ステージ\CActFIFOWhite.cs" />\r
<Compile Include="コード\ステージ\CActLVLNFont.cs" />\r
<Compile Include="コード\ステージ\CActオプションパネル.cs" />\r
+ <Compile Include="コード\ステージ\CDTXVmode.cs" />\r
<Compile Include="コード\ステージ\CStage.cs" />\r
<Compile Include="コード\プラグイン\CPluginHost.cs" />\r
<Compile Include="コード\プラグイン\IPluginActivity.cs" />\r
return builder.ToString();\r
}\r
}\r
- public class CChip : IComparable<CDTX.CChip>\r
+ public class CChip : IComparable<CDTX.CChip>, ICloneable\r
{\r
public bool bHit;\r
public bool b可視 = true;\r
}\r
//-----------------\r
#endregion\r
+ /// <summary>\r
+ /// shallow copyです。\r
+ /// </summary>\r
+ /// <returns></returns>\r
+ public object Clone()\r
+ {\r
+ return MemberwiseClone();\r
+ }\r
}\r
public class CWAV : IDisposable\r
{\r
0,\r
// this.iSystemASIOBufferSizeMs.n現在の値,\r
this.iSystemASIODevice.n現在選択されている項目番号 );\r
- CDTXMania.app.AddSoundTypeToWindowTitle();\r
+ CDTXMania.app.ShowWindowTitleWithSoundType();\r
}\r
#endregion\r
#region [ サウンドのタイムストレッチモード変更 ]\r
//Trace.TraceInformation( "Skin現在Current : " + CDTXMania.Skin.GetCurrentSkinSubfolderFullName(true) );\r
//Trace.TraceInformation( "Skin現在System : " + CSkin.strSystemSkinSubfolderFullName );\r
//Trace.TraceInformation( "Skin現在BoxDef : " + CSkin.strBoxDefSkinSubfolderFullName );\r
- \r
}\r
private void tConfigIniへ記録する・Bass()\r
{\r
// if ( ( nCurrentTime - this.nBGM再生開始時刻 ) > ( this.nBGMの総再生時間ms - 1000 ) )\r
if ( ( nCurrentTime - this.nBGM再生開始時刻 ) > ( this.nBGMの総再生時間ms ) ) // #27787 2012.3.10 yyagi 1000ms == フェードイン分の時間\r
{\r
- this.actFO.tフェードアウト開始();\r
+ if ( !CDTXMania.DTXVmode.Enabled )\r
+ {\r
+ this.actFO.tフェードアウト開始();\r
+ }\r
base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
}\r
return (int) E曲読込画面の戻り値.継続;\r
}\r
\r
case CStage.Eフェーズ.共通_フェードアウト:\r
- if( this.actFO.On進行描画() == 0 )\r
+ if ( this.actFO.On進行描画() == 0 && !CDTXMania.DTXVmode.Enabled ) // DTXVモード時は、フェードアウト省略\r
return 0;\r
\r
if ( txFilename != null )\r
queueMixerSound = new Queue<stmixer>( 64 );\r
bIsDirectSound = ( CDTXMania.Sound管理.GetCurrentSoundDeviceType() == "DirectSound" );\r
db再生速度 = ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0;\r
- bValidScore = true;\r
- bDTXVmode = false; // とりあえずfalse固定\r
+ bValidScore = (CDTXMania.DTXVmode.Enabled)? false : true;\r
\r
#region [ 演奏開始前にmixer登録しておくべきサウンド(開幕してすぐに鳴らすことになるチップ音)を登録しておく ]\r
foreach ( CDTX.CChip pChip in listChip )\r
protected bool bIsDirectSound; //\r
protected double db再生速度;\r
protected bool bValidScore;\r
- protected bool bDTXVmode;\r
+// protected bool bDTXVmode;\r
protected STDGBVALUE<int> nJudgeLinePosY_delta; // #31602 2013.6.23 yyagi 表示遅延対策として、判定ラインの表示位置をずらす機能を追加する\r
\r
protected STDGBVALUE<Queue<CDTX.CChip>> queWailing;\r
base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;\r
this.actFI.tフェードイン開始();\r
\r
-// if ( this.bDTXVmode )\r
+ if ( CDTXMania.DTXVmode.Enabled ) // DTXVモードなら\r
{\r
- #region [テストコード: 再生開始小節の変更]\r
-#if false\r
- int nStartBar = 30;\r
- #region [ 処理を開始するチップの特定 ]\r
- bool bSuccessSeek = false;\r
- for ( int i = this.n現在のトップChip; i < CDTXMania.DTX.listChip.Count; i++ )\r
- {\r
- CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];\r
- if ( pChip.n発声位置 < 384 * nStartBar )\r
- {\r
- continue;\r
- }\r
- else\r
- {\r
- bSuccessSeek = true;\r
- this.n現在のトップChip = i;\r
- break;\r
- }\r
- }\r
- if ( !bSuccessSeek )\r
- {\r
- this.n現在のトップChip = CDTXMania.DTX.listChip.Count - 1;\r
- }\r
- #endregion\r
- #region [ 演奏開始の発声時刻msを取得し、タイマに設定 ]\r
- int nStartTime = CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms;\r
- CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;\r
- CSound管理.rc演奏用タイマ.t一時停止();\r
- #endregion\r
-\r
- List<CSound> pausedCSound = new List<CSound>();\r
-\r
- #region [ BGMの途中再生開始 (CDTXのt入力・行解析・チップ配置()で小節番号が+1されているのを削っておくこと) ]\r
- foreach ( CDTX.CChip pChip in this.listChip )\r
- {\r
- if ( pChip.nチャンネル番号 == 0x01 )\r
- {\r
- CDTX.CWAV wc = CDTXMania.DTX.listWAV[ pChip.n整数値・内部番号 ];\r
- int nDuration = ( wc.rSound[ 0 ] == null ) ? 0 : (int) ( wc.rSound[ 0 ].n総演奏時間ms / CDTXMania.DTX.db再生速度 );\r
-// if (wc.bIsBGMSound || wc.bIsGuitarSound || wc.bIsBassSound || wc.bIsBGMSound || wc.bIsSESound )\r
- {\r
- if ( ( pChip.n発声時刻ms + nDuration > 0 ) && ( pChip.n発声時刻ms <= nStartTime ) && ( nStartTime <= pChip.n発声時刻ms + nDuration ) )\r
- {\r
- if ( CDTXMania.ConfigIni.bBGM音を発声する )\r
- {\r
- CDTXMania.DTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, CDTXMania.DTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
- //CDTXMania.DTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n現在時刻ms + pChip.n発声時刻ms, (int) Eレーン.BGM, CDTXMania.DTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
- for ( int i = 0; i < wc.rSound.Length; i++ )\r
- {\r
- if ( wc.rSound[ i ] != null )\r
- {\r
- wc.rSound[ i ].t再生を一時停止する();\r
- wc.rSound[ i ].t再生位置を変更する( nStartTime - pChip.n発声時刻ms );\r
- pausedCSound.Add( wc.rSound[ i ] );\r
- }\r
- }\r
- }\r
- break;\r
- }\r
- }\r
- }\r
- }\r
- #endregion\r
-// 以下未実装 ここから\r
- #region [ 演奏開始時点で既に演奏中になっているチップの再生とシーク (一つ手前のBGM処理のところに混ぜてもいいかも ]\r
- #endregion\r
- #region [ 演奏開始時点で既に表示されているBGAの再生とシーク (BGAの動きの途中状況を反映すること) ]\r
- #endregion\r
- #region [ 演奏開始時点で既に表示されているAVIの再生とシーク (AVIの動きの途中状況を反映すること) ]\r
- #endregion\r
-\r
-// 未実装 ここまで\r
- #region [ PAUSEしていたサウンドを一斉に再生再開する ]\r
- foreach ( CSound cs in pausedCSound )\r
- {\r
- cs.tサウンドを再生する();\r
- }\r
- pausedCSound.Clear();\r
- pausedCSound = null;\r
- #endregion\r
- CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;\r
- CSound管理.rc演奏用タイマ.t再開();\r
-#endif\r
- #endregion\r
+ t演奏位置の変更( CDTXMania.DTXVmode.nStartBar );\r
}\r
base.b初めての進行描画 = false;\r
}\r
bIsFinishedFadeout = this.t進行描画・フェードイン・アウト();\r
if( bIsFinishedPlaying && ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) )\r
{\r
- this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージクリア;\r
- base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト;\r
- this.actFOClear.tフェードアウト開始();\r
+ if ( CDTXMania.DTXVmode.Enabled )\r
+ {\r
+ Thread.Sleep( 5 );\r
+ // DTXCからの次のメッセージを待ち続ける\r
+ }\r
+ else\r
+ {\r
+ this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージクリア;\r
+ base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト;\r
+ this.actFOClear.tフェードアウト開始();\r
+ }\r
}\r
if( bIsFinishedFadeout )\r
{\r
return 0;\r
}\r
\r
+ public void t演奏位置の変更( int nStartBar )\r
+ {\r
+ // まず全サウンドオフにすること\r
+ CDTXMania.DTX.t全チップの再生停止();\r
+\r
+ #region [テストコード: 再生開始小節の変更]\r
+ //int nStartBar = CDTXMania.DTXVmode.nStartBar + 1; // +1が必要\r
+ #region [ 処理を開始するチップの特定 ]\r
+ bool bInitialized = false;\r
+\r
+ // 演奏済みフラグのついたChipをリセットする\r
+ for ( int i = 0; i < CDTXMania.DTX.listChip.Count; i++ )\r
+ {\r
+ CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];\r
+ if ( pChip.bHit )\r
+ {\r
+ CDTX.CChip p = (CDTX.CChip) pChip.Clone();\r
+ p.bHit = false;\r
+ CDTXMania.DTX.listChip[ i ] = p;\r
+ }\r
+ }\r
+\r
+ //for ( int i = this.n現在のトップChip; i < CDTXMania.DTX.listChip.Count; i++ )\r
+ bool bSuccessSeek = false;\r
+ for ( int i = 0; i < CDTXMania.DTX.listChip.Count; i++ )\r
+ {\r
+ CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];\r
+ if ( pChip.n発声位置 < 384 * nStartBar )\r
+ {\r
+ continue;\r
+ }\r
+ else\r
+ {\r
+ bSuccessSeek = true;\r
+ this.n現在のトップChip = i;\r
+ break;\r
+ }\r
+ }\r
+ if ( !bSuccessSeek )\r
+ {\r
+ this.n現在のトップChip = CDTXMania.DTX.listChip.Count - 1;\r
+ }\r
+ #endregion\r
+ #region [ 演奏開始の発声時刻msを取得し、タイマに設定 ]\r
+ int nStartTime = CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms;\r
+ CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;\r
+ CSound管理.rc演奏用タイマ.t一時停止();\r
+ #endregion\r
+\r
+ List<CSound> pausedCSound = new List<CSound>();\r
+\r
+ #region [ BGMの途中再生開始 (CDTXのt入力・行解析・チップ配置()で小節番号が+1されているのを削っておくこと) ]\r
+ foreach ( CDTX.CChip pChip in this.listChip )\r
+ {\r
+ if ( pChip.nチャンネル番号 == 0x01 )\r
+ {\r
+ CDTX.CWAV wc = CDTXMania.DTX.listWAV[ pChip.n整数値・内部番号 ];\r
+ int nDuration = ( wc.rSound[ 0 ] == null ) ? 0 : (int) ( wc.rSound[ 0 ].n総演奏時間ms / CDTXMania.DTX.db再生速度 );\r
+ // if (wc.bIsBGMSound || wc.bIsGuitarSound || wc.bIsBassSound || wc.bIsBGMSound || wc.bIsSESound )\r
+ {\r
+ if ( ( pChip.n発声時刻ms + nDuration > 0 ) && ( pChip.n発声時刻ms <= nStartTime ) && ( nStartTime <= pChip.n発声時刻ms + nDuration ) )\r
+ {\r
+ if ( ( wc.bIsBGMSound && CDTXMania.ConfigIni.bBGM音を発声する ) || ( !wc.bIsBGMSound ) )\r
+ {\r
+ CDTXMania.DTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, CDTXMania.DTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
+ //CDTXMania.DTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n現在時刻ms + pChip.n発声時刻ms, (int) Eレーン.BGM, CDTXMania.DTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
+ for ( int i = 0; i < wc.rSound.Length; i++ )\r
+ {\r
+ if ( wc.rSound[ i ] != null )\r
+ {\r
+ wc.rSound[ i ].t再生を一時停止する();\r
+ wc.rSound[ i ].t再生位置を変更する( nStartTime - pChip.n発声時刻ms );\r
+ pausedCSound.Add( wc.rSound[ i ] );\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ #endregion\r
+ // 以下未実装 ここから\r
+ #region [ 演奏開始時点で既に演奏中になっているチップの再生とシーク (一つ手前のBGM処理のところに混ぜてもいいかも ]\r
+ #endregion\r
+ #region [ 演奏開始時点で既に表示されているBGAの再生とシーク (BGAの動きの途中状況を反映すること) ]\r
+ #endregion\r
+ #region [ 演奏開始時点で既に表示されているAVIの再生とシーク (AVIの動きの途中状況を反映すること) ]\r
+ #endregion\r
+\r
+ // 未実装 ここまで\r
+ #region [ PAUSEしていたサウンドを一斉に再生再開する ]\r
+ foreach ( CSound cs in pausedCSound )\r
+ {\r
+ cs.tサウンドを再生する();\r
+ }\r
+ pausedCSound.Clear();\r
+ pausedCSound = null;\r
+ #endregion\r
+ CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;\r
+ CDTXMania.Timer.n現在時刻 = nStartTime; // Debug表示のTime: 表記を正しくするために必要\r
+ CSound管理.rc演奏用タイマ.t再開();\r
+ #endregion\r
+ }\r
\r
// その他\r
\r
--- /dev/null
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+using System.Diagnostics;\r
+using System.IO;\r
+using FDK;\r
+\r
+\r
+namespace DTXMania\r
+{\r
+ public class CDTXVmode\r
+ {\r
+ /// <summary>\r
+ /// DTXVモードかどうか\r
+ /// </summary>\r
+ public bool Enabled\r
+ {\r
+ get;\r
+ set;\r
+ }\r
+\r
+ /// <summary>\r
+ /// 外部から再指示が発生したか\r
+ /// </summary>\r
+ public bool Refreshed\r
+ {\r
+ get;\r
+ set;\r
+ }\r
+\r
+ /// <summary>\r
+ /// 演奏開始小節番号\r
+ /// </summary>\r
+ public int nStartBar\r
+ {\r
+ get;\r
+ set;\r
+ }\r
+\r
+ public string filename\r
+ {\r
+ get\r
+ {\r
+ return last_path;\r
+ }\r
+ }\r
+\r
+\r
+ /// <summary>\r
+ /// コンストラクタ\r
+ /// </summary>\r
+ public CDTXVmode()\r
+ {\r
+ this.last_path = "";\r
+ this.last_timestamp = DateTime.MinValue;\r
+ this.Enabled = false;\r
+ this.nStartBar = 0;\r
+ this.Refreshed = false;\r
+ }\r
+\r
+ /// <summary>\r
+ /// DTXファイルのリロードが必要かどうか判定する\r
+ /// </summary>\r
+ /// <param name="filename">DTXファイル名</param>\r
+ /// <returns></returns>\r
+ /// <exception cref="FileNotFoundException"></exception>\r
+ public bool bIsNeedReloadDTX( string filename )\r
+ {\r
+ if ( !File.Exists( filename ) ) // 指定したファイルが存在しないなら例外終了\r
+ {\r
+ Trace.TraceError( "ファイルが見つかりません。({0})", filename );\r
+ throw new FileNotFoundException();\r
+ //return false;\r
+ }\r
+\r
+ this.Refreshed = true;\r
+\r
+ // 前回とファイル名が異なるか、タイムスタンプが更新されているなら、DTX要更新\r
+ DateTime current_timestamp = File.GetLastWriteTime( filename );\r
+ if ( last_path != filename || current_timestamp > last_timestamp)\r
+ {\r
+ this.last_path = filename;\r
+ this.last_timestamp = current_timestamp;\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
+ /// <summary>\r
+ /// \r
+ /// </summary>\r
+ /// <param name="arg"></param>\r
+ /// <param name="nStartBar"></param>\r
+ /// <param name="command"></param>\r
+ /// <returns>DTXV用の引数であればtrue</returns>\r
+ /// <remarks>内部でEnabled, nStartBar, last_path, last_timestampを設定する</remarks>\r
+ public bool ParseArguments( string arg, out string strCommand, out bool bNeedReload )\r
+ {\r
+ bool ret = false;\r
+ this.nStartBar = 0;\r
+ strCommand = "";\r
+ bNeedReload = false;\r
+\r
+ if ( arg != null )\r
+ {\r
+ // -S -Nxxx filename\r
+ if ( arg.StartsWith( "-S", StringComparison.OrdinalIgnoreCase ) ) // DTXV再生停止\r
+ {\r
+ this.Enabled = true;\r
+ strCommand = "-S";\r
+ ret = true;\r
+ }\r
+ else if ( arg.StartsWith( "-N", StringComparison.OrdinalIgnoreCase ) )\r
+ {\r
+ this.Enabled = true;\r
+ strCommand = "-N";\r
+ ret = true;\r
+\r
+ arg = arg.Substring( 2 ); // "-N"を除去\r
+ string[] p = arg.Split( new char[] { ' ' } );\r
+ this.nStartBar = int.Parse( p[ 0 ] ); // 再生開始小節\r
+ if ( this.nStartBar < 0 )\r
+ {\r
+ this.nStartBar = 0;\r
+ }\r
+//Debug.WriteLine( "再生開始小節: " + this.nStartBar );\r
+\r
+ int startIndex = arg.IndexOf( ' ' );\r
+ string filename = arg.Substring( startIndex + 1 ); // 再生ファイル名(フルパス)\r
+ try\r
+ {\r
+//Debug.WriteLine( "filename_quoted=" + filename );\r
+ filename = filename.Trim( new char[] { '\"' } );\r
+ if ( bIsNeedReloadDTX( filename ) )\r
+ {\r
+//Debug.WriteLine( filename + ": 要reload" );\r
+ bNeedReload = true;\r
+ // もし前回のものより更新されていれば、DTXを読み直し\r
+ }\r
+ else\r
+ {\r
+//Debug.WriteLine( filename + ": reload不要" );\r
+ bNeedReload = false;\r
+ // さもなくば、読み直しなしで、再生位置だけを変更\r
+ }\r
+ }\r
+ catch // 指定ファイルが存在しない\r
+ {\r
+ }\r
+ }\r
+ }\r
+\r
+ return ret;\r
+ }\r
+\r
+\r
+\r
+ private string last_path;\r
+ private DateTime last_timestamp;\r
+\r
+ }\r
+}\r
get;\r
private set;\r
}\r
- public static bool bDTXVモード\r
- {\r
- get;\r
- set;\r
- }\r
+ //public static bool bDTXVモード\r
+ //{\r
+ // get;\r
+ // set;\r
+ //}\r
public static CConfigIni ConfigIni\r
{\r
get; \r
get;\r
private set;\r
}\r
+ #region [ 入力範囲ms ]\r
public static int nPerfect範囲ms\r
{\r
get\r
return ConfigIni.nヒット範囲ms.Poor;\r
}\r
}\r
+ #endregion\r
public static CPad Pad \r
{\r
get;\r
{\r
get { return base.Window.Handle; }\r
}\r
+ public static CDTXVmode DTXVmode // #28821 2014.1.23 yyagi\r
+ {\r
+ get;\r
+ set;\r
+ }\r
#endregion\r
\r
// コンストラクタ\r
}\r
#endregion\r
\r
+ #region [ DTXCreatorからの指示 ]\r
+ if ( this.Window.IsReceivedMessage ) // ウインドウメッセージで、\r
+ {\r
+ string strMes = this.Window.strMessage;\r
+ this.Window.IsReceivedMessage = false;\r
+\r
+ if ( strMes != null )\r
+ {\r
+ bool bNeedReload;\r
+ string strCommand;\r
+\r
+//Debug.WriteLine( "msg arg=" + strMes );\r
+ DTXVmode.ParseArguments( strMes, out strCommand, out bNeedReload );\r
+\r
+ if ( DTXVmode.Enabled )\r
+ {\r
+//Debug.WriteLine( "DTXV mode is enabled," );\r
+ bコンパクトモード = true;\r
+ strコンパクトモードファイル = DTXVmode.filename;\r
+ }\r
+\r
+ if ( strCommand == "-S" ) // DTXV再生停止\r
+ {\r
+ // 再生停止処理を入れること\r
+ }\r
+ else if ( strCommand == "-N" )\r
+ {\r
+ bコンパクトモード = true;\r
+ DTXVmode.Enabled = true;\r
+\r
+//Debug.WriteLine( "再生開始小節: " + DTXVmode.nStartBar );\r
+\r
+ if ( bNeedReload )\r
+ {\r
+//Debug.WriteLine( DTXVmode.filename + ": 要reload" );\r
+ // もし前回のものより更新されていれば、DTXを読み直し\r
+ }\r
+ else\r
+ {\r
+//Debug.WriteLine( DTXVmode.filename + ": reload不要" );\r
+ // さもなくば、読み直しなしで、再生位置だけを変更\r
+ }\r
+ }\r
+ }\r
+\r
+ // 場合によってはDTXVモードをON\r
+ }\r
+ #endregion\r
+\r
this.Device.BeginScene();\r
this.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 1f, 0 );\r
\r
case CStage.Eステージ.演奏:\r
#region [ *** ]\r
//-----------------------------\r
+\r
+ if ( DTXVmode.Enabled && DTXVmode.Refreshed )\r
+ {\r
+ DTXVmode.Refreshed = false;\r
+ if ( !ConfigIni.bギタレボモード )\r
+ {\r
+ CDTXMania.stage演奏ドラム画面.t演奏位置の変更( CDTXMania.DTXVmode.nStartBar );\r
+ }\r
+ }\r
+\r
switch( this.n進行描画の戻り値 )\r
{\r
case (int) E演奏画面の戻り値.継続:\r
private List<CActivity> listトップレベルActivities;\r
private int n進行描画の戻り値;\r
private MouseButtons mb = System.Windows.Forms.MouseButtons.Left;\r
- private string strWindowTitle = "";\r
+ private string strWindowTitle\r
+ {\r
+ get\r
+ {\r
+ if ( DTXVmode.Enabled )\r
+ {\r
+ return "DTXViewer release " + VERSION;\r
+ }\r
+ else\r
+ {\r
+ return "DTXMania .NET style release " + VERSION;\r
+ }\r
+ }\r
+ }\r
\r
private void t起動処理()\r
{\r
Trace.TraceInformation( "CLR Version: " + Environment.Version.ToString() );\r
//---------------------\r
#endregion\r
- #region [ コンパクトモードスイッチの有無 ]\r
+ #region [ DTXVmodeクラス の初期化 ]\r
+ //---------------------\r
+ Trace.TraceInformation( "DTXVモードの初期化を行います。" );\r
+ Trace.Indent();\r
+ try\r
+ {\r
+ DTXVmode = new CDTXVmode();\r
+ DTXVmode.Enabled = false;\r
+ Trace.TraceInformation( "DTXVモードの初期化を完了しました。" );\r
+ }\r
+ finally\r
+ {\r
+ Trace.Unindent();\r
+ }\r
+ //---------------------\r
+ #endregion\r
+ #region [ コンパクトモードスイッチの有無、もしくは、DTXViewerとしての起動 ]\r
//---------------------\r
bコンパクトモード = false;\r
strコンパクトモードファイル = "";\r
if( ( commandLineArgs != null ) && ( commandLineArgs.Length > 1 ) )\r
{\r
bコンパクトモード = true;\r
- strコンパクトモードファイル = commandLineArgs[ 1 ];\r
+ bool bNeedReload;\r
+ string strCommand;\r
+ string arg = "";\r
+\r
+ for ( int i = 1; i < commandLineArgs.Length; i++ )\r
+ {\r
+ if ( i != 1 )\r
+ {\r
+ arg += " ";\r
+ }\r
+ arg += commandLineArgs[ i ];\r
+ }\r
+ DTXVmode.ParseArguments( arg, out strCommand, out bNeedReload );\r
+ \r
+ if ( DTXVmode.Enabled )\r
+ {\r
+ strコンパクトモードファイル = DTXVmode.filename;\r
+ }\r
+ else // 通常のコンパクトモード\r
+ {\r
+ strコンパクトモードファイル = commandLineArgs[ 1 ];\r
+ }\r
+\r
if ( !File.Exists( strコンパクトモードファイル ) ) // #32985 2014.1.23 yyagi \r
{\r
Trace.TraceError( "コンパクトモードで指定されたファイルが見つかりません。DTXManiaを終了します。[{0}]", strコンパクトモードファイル );\r
#endif\r
}\r
Trace.TraceInformation( "コンパクトモードで起動します。[{0}]", strコンパクトモードファイル );\r
+ if ( DTXVmode.Enabled )\r
+ {\r
+ Trace.TraceInformation( "DTXVモードです。" );\r
+ }\r
}\r
//---------------------\r
#endregion\r
\r
#region [ ウィンドウ初期化 ]\r
//---------------------\r
- this.strWindowTitle = "DTXMania .NET style release " + VERSION;\r
-\r
base.Window.StartPosition = FormStartPosition.Manual; // #30675 2013.02.04 ikanick add\r
base.Window.Location = new Point( ConfigIni.n初期ウィンドウ開始位置X, ConfigIni.n初期ウィンドウ開始位置Y ); // #30675 2013.02.04 ikanick add\r
\r
- base.Window.Text = this.strWindowTitle;\r
+ base.Window.Text = this.strWindowTitle; // 事前にDTXVmodeの実体を作っておくこと\r
\r
base.Window.StartPosition = FormStartPosition.Manual; // #30675 2013.02.04 ikanick add\r
base.Window.Location = new Point(ConfigIni.n初期ウィンドウ開始位置X, ConfigIni.n初期ウィンドウ開始位置Y); // #30675 2013.02.04 ikanick add\r
}\r
//---------------------\r
#endregion\r
+ //-----------\r
+\r
#region [ FPS カウンタの初期化 ]\r
//---------------------\r
Trace.TraceInformation( "FPSカウンタの初期化を行います。" );\r
0,\r
CDTXMania.ConfigIni.nASIODevice\r
);\r
- AddSoundTypeToWindowTitle();\r
+ ShowWindowTitleWithSoundType();\r
FDK.CSound管理.bIsTimeStretch = CDTXMania.ConfigIni.bTimeStretch;\r
Trace.TraceInformation( "サウンドデバイスの初期化を完了しました。" );\r
}\r
#endregion\r
}\r
\r
- public void AddSoundTypeToWindowTitle()\r
+ public void ShowWindowTitleWithSoundType()\r
{\r
string delay = "";\r
if ( Sound管理.GetCurrentSoundDeviceType() != "DirectSound" )\r
}\r
//---------------------\r
#endregion\r
-\r
#region [ タイマの終了処理 ]\r
//---------------------\r
Trace.TraceInformation("タイマの終了処理を行います。");\r
Trace.Indent();\r
try\r
{\r
- ConfigIni.t書き出し( str );\r
- Trace.TraceInformation( "保存しました。({0})", new object[] { str } );\r
+ if ( DTXVmode.Enabled )\r
+ {\r
+ Trace.TraceInformation( "DTXVモードだったため、Config.iniは保存しません。" );\r
+ }\r
+ else\r
+ {\r
+ ConfigIni.t書き出し( str );\r
+ Trace.TraceInformation( "保存しました。({0})", str );\r
+ }\r
}\r
catch( Exception e )\r
{\r
Trace.TraceError( e.Message );\r
- Trace.TraceError( "Config.ini の出力に失敗しました。({0})", new object[] { str } );\r
+ Trace.TraceError( "Config.ini の出力に失敗しました。({0})", str );\r
+ }\r
+ finally\r
+ {\r
+ Trace.Unindent();\r
+ }\r
+ //---------------------\r
+ #endregion\r
+ #region [ DTXVmodeの終了処理 ]\r
+ //---------------------\r
+ Trace.TraceInformation( "DTXVモードの終了処理を行います。" );\r
+ Trace.Indent();\r
+ try\r
+ {\r
+ if ( DTXVmode != null )\r
+ {\r
+ DTXVmode = null;\r
+ Trace.TraceInformation( "DTXVモードの終了処理を完了しました。" );\r
+ }\r
+ else\r
+ {\r
+ Trace.TraceInformation( "DTXVモードは使用されていません。" );\r
+ }\r
}\r
finally\r
{\r
}\r
//---------------------\r
#endregion\r
- Trace.TraceInformation("アプリケーションの終了処理を完了しました。");\r
+ Trace.TraceInformation( "アプリケーションの終了処理を完了しました。" );\r
\r
\r
this.b終了処理完了済み = true;\r
//-----------------------------\r
#endregion\r
\r
+\r
+\r
+\r
+ //[DllImport( "user32.dll" )]\r
+ //public static extern IntPtr FindWindow( string lpClassName, string lpWindowName );\r
+\r
+\r
[STAThread] \r
private static void Main()\r
{\r
mutex二重起動防止用 = new Mutex( false, "DTXManiaMutex" );\r
\r
- if( mutex二重起動防止用.WaitOne( 0, false ) )\r
+ if ( mutex二重起動防止用.WaitOne( 0, false ) )\r
{\r
string newLine = Environment.NewLine;\r
- bool flag = false;\r
+ bool bDLLnotfound = false;\r
\r
#region [DLLの存在チェック]\r
if ( !tDLLの存在チェック( "dll\\SlimDX" + CDTXMania.SLIMDXDLL + ".dll",\r
"SlimDX" + CDTXMania.SLIMDXDLL + ".dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
"SlimDX" + CDTXMania.SLIMDXDLL + ".dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
- ) ) flag = true;\r
+ ) ) bDLLnotfound = true;\r
if ( !tDLLの存在チェック( "dll\\FDK.dll",\r
"FDK.dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
"FDK.dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
- ) ) flag = true;\r
+ ) ) bDLLnotfound = true;\r
if ( !tDLLの存在チェック( "dll\\xadec.dll",\r
"xadec.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
"xadec.dll is not found." + newLine + "Please download DTXMania again."\r
- ) ) flag = true;\r
+ ) ) bDLLnotfound = true;\r
if ( !tDLLの存在チェック( "dll\\SoundDecoder.dll",\r
"SoundDecoder.dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
"SoundDecoder.dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
- ) ) flag = true;\r
+ ) ) bDLLnotfound = true;\r
if ( !tDLLの存在チェック( CDTXMania.D3DXDLL,\r
CDTXMania.D3DXDLL + " が存在しません。" + newLine + "DirectX Redist フォルダの DXSETUP.exe を実行し、" + newLine + "必要な DirectX ランタイムをインストールしてください。",\r
CDTXMania.D3DXDLL + " is not found." + newLine + "Please execute DXSETUP.exe in \"DirectX Redist\" folder, to install DirectX runtimes required for DTXMania.",\r
true\r
- ) ) flag = true;\r
+ ) ) bDLLnotfound = true;\r
if ( !tDLLの存在チェック( "dll\\bass.dll",\r
"bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
"baas.dll is not found." + newLine + "Please download DTXMania again."\r
- ) ) flag = true;\r
+ ) ) bDLLnotfound = true;\r
if ( !tDLLの存在チェック( "dll\\Bass.Net.dll",\r
"Bass.Net.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
"Bass.Net.dll is not found." + newLine + "Please download DTXMania again."\r
- ) ) flag = true;\r
+ ) ) bDLLnotfound = true;\r
if ( !tDLLの存在チェック( "dll\\bassmix.dll",\r
"bassmix.dll を読み込めません。bassmix.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
"bassmix.dll is not loaded. bassmix.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
- ) ) flag = true;\r
+ ) ) bDLLnotfound = true;\r
if ( !tDLLの存在チェック( "dll\\bassasio.dll",\r
"bassasio.dll を読み込めません。bassasio.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
"bassasio.dll is not loaded. bassasio.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
- ) ) flag = true;\r
+ ) ) bDLLnotfound = true;\r
if ( !tDLLの存在チェック( "dll\\basswasapi.dll",\r
"basswasapi.dll を読み込めません。basswasapi.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
"basswasapi.dll is not loaded. basswasapi.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
- ) ) flag = true;\r
+ ) ) bDLLnotfound = true;\r
if ( !tDLLの存在チェック( "dll\\bass_fx.dll",\r
"bass_fx.dll を読み込めません。bass_fx.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
"bass_fx.dll is not loaded. bass_fx.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
- ) ) flag = true;\r
+ ) ) bDLLnotfound = true;\r
if ( !tDLLの存在チェック( "dll\\DirectShowLib-2005.dll",\r
"DirectShowLib-2005.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
"DirectShowLib-2005.dll is not found." + newLine + "Please download DTXMania again."\r
- ) ) flag = true;\r
+ ) ) bDLLnotfound = true;\r
#endregion\r
- if (!flag)\r
+ if ( !bDLLnotfound )\r
{\r
#if DEBUG && TEST_ENGLISH\r
Thread.CurrentThread.CurrentCulture = new CultureInfo( "en-US" );\r
#endif\r
\r
- DWM.EnableComposition(false); // Disable AeroGrass temporally\r
+ DWM.EnableComposition( false ); // Disable AeroGrass temporally\r
\r
// BEGIN #23670 2010.11.13 from: キャッチされない例外は放出せずに、ログに詳細を出力する。\r
// BEGIM #24606 2011.03.08 from: DEBUG 時は例外発生箇所を直接デバッグできるようにするため、例外をキャッチしないようにする。\r
try\r
#endif\r
{\r
- using( var mania = new CDTXMania() )\r
+ using ( var mania = new CDTXMania() )\r
mania.Run();\r
\r
Trace.WriteLine( "" );\r
// END #24606 2011.03.08 from\r
// END #23670 2010.11.13 from\r
\r
- if( Trace.Listeners.Count > 1 )\r
+ if ( Trace.Listeners.Count > 1 )\r
Trace.Listeners.RemoveAt( 1 );\r
}\r
\r
// BEGIN #24615 2011.03.09 from: Mutex.WaitOne() が true を返した場合は、Mutex のリリースが必要である。\r
- \r
+\r
mutex二重起動防止用.ReleaseMutex();\r
mutex二重起動防止用 = null;\r
- \r
+\r
// END #24615 2011.03.09 from\r
}\r
+ else // DTXManiaが既に起動中\r
+ {\r
+ \r
+ // → 引数が0個の時はそのまま終了\r
+ // 1個( コンパクトモード or DTXV -S) か2個 (DTXV -Nxxx ファイル名)のときは、そのプロセスにコマンドラインを丸々投げて終了する\r
+\r
+ #region [ 既に起動中のDTXManiaプロセスを検索する。]\r
+ // このやり方だと、ShowInTaskbar=falseでタスクバーに表示されないパターンの時に検索に失敗するようだが\r
+ // DTXManiaでそのパターンはない?のでこのままいく。\r
+ // FindWindowを使えばこのパターンにも対応できるが、C#でビルドするアプリはウインドウクラス名を自前指定できないので、これは使わない。\r
+\r
+ Process current = Process.GetCurrentProcess();\r
+ Process[] running = Process.GetProcessesByName( current.ProcessName );\r
+ Process target = null;\r
+ //IntPtr hWnd = FindWindow( null, "DTXMania .NET style release " + CDTXMania.VERSION );\r
+\r
+ foreach ( Process p in running )\r
+ {\r
+ if ( p.Id != current.Id ) // プロセス名は同じでかつ、プロセスIDが自分自身とは異なるものを探す\r
+ {\r
+ if ( p.MainModule.FileName == current.MainModule.FileName )\r
+ {\r
+ target = p;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ #endregion\r
+\r
+ #region [ 起動中のDTXManiaがいれば、そのプロセスにコマンドラインを投げる ]\r
+ if ( target != null )\r
+ {\r
+ string[] commandLineArgs = Environment.GetCommandLineArgs();\r
+ if ( commandLineArgs != null && commandLineArgs.Length > 1 )\r
+ {\r
+ string arg = null;\r
+ for ( int i = 1; i < commandLineArgs.Length; i++ )\r
+ {\r
+ if ( i == 1 )\r
+ {\r
+ arg += commandLineArgs[ i ];\r
+ }\r
+ else\r
+ {\r
+ arg += " " + "\"" + commandLineArgs[ i ] + "\"";\r
+ }\r
+ }\r
+\r
+//Debug.WriteLine( "Message=" + arg );\r
+\r
+ if ( arg != null )\r
+ {\r
+ FDK.CSendMessage.sendmessage( target.MainWindowHandle, current.MainWindowHandle, arg );\r
+ }\r
+ }\r
+ }\r
+ #endregion\r
+ }\r
}\r
}\r
}\r
<PropertyGroup>\r
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
- <ProductVersion>9.0.21022</ProductVersion>\r
+ <ProductVersion>9.0.30729</ProductVersion>\r
<SchemaVersion>2.0</SchemaVersion>\r
<ProjectGuid>{BCD40908-F3E2-4707-BFAA-1DD99DF6357D}</ProjectGuid>\r
<OutputType>Library</OutputType>\r
<ItemGroup>\r
<Compile Include="コード\00.共通\COS.cs" />\r
<Compile Include="コード\00.共通\CPowerManagement.cs" />\r
+ <Compile Include="コード\00.共通\CSendMessage.cs" />\r
<Compile Include="コード\00.共通\CTimerBase.cs" />\r
<Compile Include="コード\00.共通\C一定間隔処理.cs" />\r
<Compile Include="コード\00.共通\C共通.cs" />\r
using System.Security.Permissions;\r
using System.Windows.Forms;\r
using System.Runtime.InteropServices;\r
+using System.Diagnostics;\r
using SampleFramework.Properties;\r
\r
namespace SampleFramework\r
get;\r
set;\r
}\r
+ public string strMessage // #28821 2014.1.23 yyagi\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+ public bool IsReceivedMessage\r
+ {\r
+ get;\r
+ set;\r
+ }\r
\r
private Screen m_Screen;\r
/// <summary>\r
\r
//Icon = GetDefaultIcon();\r
Text = GetDefaultTitle();\r
+ strMessage = "";\r
}\r
\r
/// <summary>\r
}\r
#endregion\r
\r
+\r
+\r
/// <summary>\r
/// Handles raw window messages.\r
/// </summary>\r
}\r
#endregion\r
}\r
-\r
+ #region #28821 2014.1.23 yyagi (WM_COPYDATA)\r
+ else if ( m.Msg == WindowConstants.WM_COPYDATA )\r
+ {\r
+ COPYDATASTRUCT mystr = new COPYDATASTRUCT();\r
+ Type mytype = mystr.GetType();\r
+ mystr = (COPYDATASTRUCT) m.GetLParam( mytype );\r
+ strMessage = mystr.lpData;\r
+ IsReceivedMessage = true;\r
+ }\r
+ #endregion\r
#region #23510 2010.11.16 yyagi add: 縦横比固定でのウインドウサイズ変更 from http://d.hatena.ne.jp/iselix/20080917/1221666614 http://hp.vector.co.jp/authors/VA016117/sizing.html\r
- else if (m.Msg == WM_SIZING)\r
+ else if ( m.Msg == WM_SIZING )\r
{\r
- RECT rc = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT));\r
- int w = rc.Right - rc.Left - (Size.Width - ClientSize.Width);\r
- int h = rc.Bottom - rc.Top - (Size.Height - ClientSize.Height);\r
- int dw = (int)(h * widthRatio / heightRatio + 0.5) - w;\r
- int dh = (int)(w / (widthRatio / heightRatio) + 0.5) - h;\r
+ RECT rc = (RECT) Marshal.PtrToStructure( m.LParam, typeof( RECT ) );\r
+ int w = rc.Right - rc.Left - ( Size.Width - ClientSize.Width );\r
+ int h = rc.Bottom - rc.Top - ( Size.Height - ClientSize.Height );\r
+ int dw = (int) ( h * widthRatio / heightRatio + 0.5 ) - w;\r
+ int dh = (int) ( w / ( widthRatio / heightRatio ) + 0.5 ) - h;\r
\r
- switch (m.WParam.ToInt32()) {\r
+ switch ( m.WParam.ToInt32() )\r
+ {\r
case WMSZ_LEFT:\r
case WMSZ_RIGHT:\r
rc.Bottom += dh;\r
rc.Right += dw;\r
break;\r
case WMSZ_BOTTOMRIGHT:\r
- if (dw > 0)\r
+ if ( dw > 0 )\r
{\r
rc.Right += dw;\r
}\r
}\r
break;\r
case WMSZ_TOPLEFT:\r
- if (dw > 0)\r
+ if ( dw > 0 )\r
{\r
rc.Left -= dw;\r
}\r
}\r
break;\r
case WMSZ_TOPRIGHT:\r
- if (dw > 0)\r
+ if ( dw > 0 )\r
{\r
rc.Right += dw;\r
}\r
}\r
break;\r
case WMSZ_BOTTOMLEFT:\r
- if (dw > 0)\r
+ if ( dw > 0 )\r
{\r
rc.Left -= dw;\r
}\r
case 9: // #32383 2013.11.2 yyagi; exitting maximized window by using Aero snap\r
break;\r
default:\r
- throw new ArgumentOutOfRangeException("value", "Illegal WM_SIZING value.");\r
+ throw new ArgumentOutOfRangeException( "value", "Illegal WM_SIZING value." );\r
}\r
- Marshal.StructureToPtr(rc, m.LParam, true);\r
+ Marshal.StructureToPtr( rc, m.LParam, true );\r
}\r
#endregion\r
\r
get { return Marshal.SizeOf(typeof(WINDOWPLACEMENT)); }\r
}\r
}\r
+ #region #28821 2014.1.23 yyagi add: 外部からの文字列メッセージ送受信 定数定義\r
+ [StructLayout( LayoutKind.Sequential )]\r
+ public struct COPYDATASTRUCT\r
+ {\r
+ public IntPtr dwData;\r
+ public UInt32 cbData;\r
+ public string lpData;\r
+ }\r
+ #endregion\r
}\r
public const int WM_SYSCOMMAND = 0x112;\r
public const int WM_ACTIVATEAPP = 0x001C;\r
public const int WM_POWERBROADCAST = 0x0218;\r
+ public const int WM_COPYDATA = 0x004A;\r
\r
public const int SC_SCREENSAVE = 0xF140;\r
public const int SC_MONITORPOWER = 0xF170;\r
public const uint ES_DISPLAY_REQUIRED = 0x00000002;\r
\r
public const int MONITOR_DEFAULTTOPRIMARY = 1;\r
- }\r
+\r
+ public const int WM_USER = 0x400;\r
+ }\r
}\r
if( !Bass.BASS_Init( nデバイス, n周波数, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero ) )\r
throw new Exception( string.Format( "BASS の初期化に失敗しました。(BASS_Init)[{0}]", Bass.BASS_ErrorGetCode().ToString() ) );\r
\r
-Debug.WriteLine( "BASS_Init()完了。" );\r
+//Debug.WriteLine( "BASS_Init()完了。" );\r
#region [ デバッグ用: ASIOデバイスのenumerateと、ログ出力 ]\r
// CEnumerateAllAsioDevices.GetAllASIODevices();\r
//Debug.WriteLine( "BassAsio.BASS_ASIO_GetDeviceInfo():" );\r