OSDN Git Service

#28821 DTXCから「BGMのみ再生する」機能で呼び出すとエラーが発生する問題を修正。
authoryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Sun, 9 Feb 2014 01:48:01 +0000 (01:48 +0000)
committeryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Sun, 9 Feb 2014 01:48:01 +0000 (01:48 +0000)
#28821 途中再生せいている状態で「最初から再生」するなどして、AVIやBGAが再生されている状態から再生しない状態に遷移すると、BGA/AVI画面が固まる問題を修正。
#28821 強制全AUTOが機能していなかった問題を修正。
#28821 DTXC側から、引数で再生方式(WASAPIなど)やサウンドデバイスを指定するところに、中途半端に対応。(大枠を作っただけれあり、実際にはまだ機能しません)
#28821 DTXMania側の曲読み込み画面で、DTXCから再生指示が来た場合は、無視するよう修正。(DTXC側で再生を連打するなどするとこの状況に陥る)
#28821 一時的に、DLLの存在チェックを省略するようにした。(DTXC側の呼び出し時にDLLが見つからないエラーが出るため。しかし実際にはDLLが存在し、動作もする。)
#28821 DirectSoundモードで、サウンド停止時にエラーが出る場合がある問題を修正。(DTXManiaでWASAPI/ASIOを使用していて、DTXCからDTXManiaをViewerとして呼び出した場合に、DTXCを終了するタイミングでこの問題が発生する。)

git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/branches/140113(DTXMania098%20with%2028821%20DTXVmode)@683 16f42ceb-6dc6-49c8-ba94-f2d53467949d

DTXManiaプロジェクト/コード/スコア、曲/CDTX.cs
DTXManiaプロジェクト/コード/ステージ/07.演奏/CStage演奏画面共通.cs
DTXManiaプロジェクト/コード/ステージ/CDTXVmode.cs
DTXManiaプロジェクト/コード/全体/CDTXMania.cs
DTXManiaプロジェクト/コード/全体/Program.cs
FDK17プロジェクト/コード/01.フレームワーク/Core/GameWindow.cs
FDK17プロジェクト/コード/03.サウンド/CSound.cs
実行時フォルダ/DTXManiaGR.exe
実行時フォルダ/dll/FDK.dll

index 99f4aef..aeb4d39 100644 (file)
@@ -598,8 +598,16 @@ namespace DTXMania
 \r
                                if ( this.bWAVを使うチャンネルである )               // WAV\r
                                {\r
-                                       CDTX.CWAV wc = CDTXMania.DTX.listWAV[ this.n整数値・内部番号 ];\r
-                                       nDuration = ( wc.rSound[ 0 ] == null ) ? 0 : wc.rSound[ 0 ].n総演奏時間ms;\r
+                                       CDTX.CWAV wc;\r
+                                       CDTXMania.DTX.listWAV.TryGetValue( this.n整数値・内部番号, out wc );\r
+                                       if ( wc == null )\r
+                                       {\r
+                                               nDuration = 0;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               nDuration = ( wc.rSound[ 0 ] == null ) ? 0 : wc.rSound[ 0 ].n総演奏時間ms;\r
+                                       }\r
                                }\r
                                else if ( this.nチャンネル番号 == 0x54 ) // AVI\r
                                {\r
index f00248d..107c988 100644 (file)
@@ -2228,6 +2228,8 @@ namespace DTXMania
                {\r
                        // まず全サウンドオフにする\r
                        CDTXMania.DTX.t全チップの再生停止();\r
+                       this.actAVI.Stop();\r
+                       this.actBGA.Stop();\r
 \r
                        #region [ 再生開始小節の変更 ]\r
                        nStartBar++;                                                                    // +1が必要\r
@@ -2354,6 +2356,8 @@ namespace DTXMania
                        CDTXMania.ConfigIni.bAutoPlay.BsPick = true;\r
                        CDTXMania.ConfigIni.bAutoPlay.BsW = true;\r
 \r
+                       this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay;\r
+\r
                        CDTXMania.ConfigIni.bAVI有効 = true;\r
                        CDTXMania.ConfigIni.bBGA有効 = true;\r
                        for ( int i = 0; i < 3; i++ )\r
index 25d069a..2907175 100644 (file)
@@ -62,6 +62,17 @@ namespace DTXMania
                        private set;\r
                }\r
 \r
+               public ESoundDeviceType soundDeviceType\r
+               {\r
+                       get;\r
+                       private set;\r
+               }\r
+               public int nASIOdevice\r
+               {\r
+                       get;\r
+                       private set;\r
+               }\r
+\r
                public string filename\r
                {\r
                        get\r
@@ -139,6 +150,28 @@ namespace DTXMania
                                        this.Refreshed = true;\r
                                        ret = true;\r
                                }\r
+                               else if ( arg.StartsWith( "-D", StringComparison.OrdinalIgnoreCase ) )\r
+                               {\r
+                                       // -DW, -DA1など\r
+                                       arg = arg.Substring( 2 );       // -D を削除\r
+                                       switch ( arg.Substring( 1 ) )\r
+                                       {\r
+                                               case "D":\r
+                                                       this.soundDeviceType = ESoundDeviceType.DirectSound;\r
+                                                       break;\r
+                                               case "W":\r
+                                                       this.soundDeviceType = ESoundDeviceType.ExclusiveWASAPI;\r
+                                                       break;\r
+                                               case "A":\r
+                                                       this.soundDeviceType = ESoundDeviceType.ASIO;\r
+                                                       arg = arg.Substring( 1 );\r
+                                                       string s = "";\r
+                                                       while ( arg.Substring( 1 ) == "0" )\r
+                                                       {\r
+                                                       }\r
+                                                       break;\r
+                                       }\r
+                               }\r
                                else if ( arg.StartsWith( "-N", StringComparison.OrdinalIgnoreCase ) )\r
                                {\r
                                        this.Enabled = true;\r
@@ -154,7 +187,7 @@ namespace DTXMania
                                        }\r
 \r
                                        int startIndex = arg.IndexOf( ' ' );\r
-                                       string filename = arg.Substring( startIndex + 1 );    // 再生ファイル名(フルパス)\r
+                                       string filename = arg.Substring( startIndex + 1 );      // 再生ファイル名(フルパス)\r
                                        try\r
                                        {\r
                                                filename = filename.Trim( new char[] { '\"' } );\r
index 60f9a0d..801a5e5 100644 (file)
@@ -542,12 +542,14 @@ namespace DTXMania
 \r
                                if ( strMes != null )\r
                                {\r
-//Debug.WriteLine( "msg arg=" + strMes );\r
+Trace.WriteLine( "msg arg=" + strMes );\r
                                        DTXVmode.ParseArguments( strMes );\r
 \r
+\r
+Trace.WriteLine( "NeedReload = " + DTXVmode.NeedReload );\r
                                        if ( DTXVmode.Enabled )\r
                                        {\r
-//Debug.WriteLine( "DTXV mode is enabled," );\r
+Trace.WriteLine( "DTXV mode is enabled," );\r
                                                bコンパクトモード = true;\r
                                                strコンパクトモードファイル = DTXVmode.filename;\r
                                        }\r
@@ -1010,6 +1012,7 @@ namespace DTXMania
                                        case CStage.Eステージ.曲読み込み:\r
                                                #region [ *** ]\r
                                                //-----------------------------\r
+                                               DTXVmode.Refreshed = false;             // 曲のリロード中に発生した再リロードは、無視する。\r
                                                if( this.n進行描画の戻り値 != 0 )\r
                                                {\r
                                                        CDTXMania.Pad.st検知したデバイス.Clear();       // 入力デバイスフラグクリア(2010.9.11)\r
index 1835d00..793a5dc 100644 (file)
@@ -44,7 +44,8 @@ namespace DTXMania
                }\r
                private static bool tDLLの存在チェック( string strDll名, string str存在しないときに表示するエラー文字列jp, string str存在しないときに表示するエラー文字列en )\r
                {\r
-                       return tDLLの存在チェック( strDll名, str存在しないときに表示するエラー文字列jp, str存在しないときに表示するエラー文字列en, false );\r
+                       return true;\r
+                       //return tDLLの存在チェック( strDll名, str存在しないときに表示するエラー文字列jp, str存在しないときに表示するエラー文字列en, false );\r
                }\r
 \r
                #region [DllImport]\r
@@ -67,6 +68,9 @@ namespace DTXMania
                                string newLine = Environment.NewLine;\r
                                bool bDLLnotfound = false;\r
 \r
+                               Trace.WriteLine( "Current Directory: " + Environment.CurrentDirectory );\r
+                               Trace.WriteLine( "EXEのあるフォルダ: " + Path.GetDirectoryName( Application.ExecutablePath ) );\r
+\r
                                #region [DLLの存在チェック]\r
                                if ( !tDLLの存在チェック( "dll\\SlimDX" + CDTXMania.SLIMDXDLL + ".dll",\r
                                        "SlimDX" + CDTXMania.SLIMDXDLL + ".dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
@@ -182,7 +186,7 @@ namespace DTXMania
                                {\r
                                        if ( p.Id != current.Id )       // プロセス名は同じでかつ、プロセスIDが自分自身とは異なるものを探す\r
                                        {\r
-                                               if ( p.MainModule.FileName == current.MainModule.FileName )\r
+                                               if ( p.MainModule.FileName == current.MainModule.FileName && p.MainWindowHandle != IntPtr.Zero )\r
                                                {\r
                                                        target = p;\r
                                                        break;\r
index 6798d3b..2bf8539 100644 (file)
@@ -423,10 +423,11 @@ namespace SampleFramework
                        #region #28821 2014.1.23 yyagi (WM_COPYDATA)\r
                        else if ( m.Msg == WindowConstants.WM_COPYDATA )\r
                        {\r
+Trace.WriteLine( "FDK;msg received" );\r
                                COPYDATASTRUCT cds = (COPYDATASTRUCT) Marshal.PtrToStructure( m.LParam, typeof( COPYDATASTRUCT ) );\r
                                strMessage = Marshal.PtrToStringUni( cds.lpData );\r
                                IsReceivedMessage = true;\r
-//Trace.WriteLine( "FDK;msg=" + strMessage + ", len=" + strMessage.Length + ", truelen=" + cds.cbData );\r
+Trace.WriteLine( "FDK;msg=" + strMessage + ", len=" + strMessage.Length + ", truelen=" + cds.cbData );\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
index 219c1ba..6e2b9e3 100644 (file)
@@ -1035,7 +1035,15 @@ Debug.WriteLine("更に再生に失敗: " + Path.GetFileName(this.strファイ
                        }\r
                        else if( this.bDirectSoundである )\r
                        {\r
-                               this.Buffer.Stop();\r
+                               try\r
+                               {\r
+                                       this.Buffer.Stop();\r
+                               }\r
+                               catch ( Exception )\r
+                               {\r
+                                       // WASAPI/ASIOとDirectSoundを同時使用すると、Bufferがlostしてここで例外発生する。→ catchして無視する。\r
+                                       // DTXCからDTXManiaを呼び出すと、DTXC終了時にこの現象が発生する。\r
+                               }\r
                        }\r
                }\r
                \r
index f7d6346..0d2afbc 100644 (file)
Binary files a/実行時フォルダ/DTXManiaGR.exe and b/実行時フォルダ/DTXManiaGR.exe differ
index 091663d..5a0f590 100644 (file)
Binary files a/実行時フォルダ/dll/FDK.dll and b/実行時フォルダ/dll/FDK.dll differ