OSDN Git Service

#28021 マルチスレッド化による、チップ音とBGA画像の読み込み高速化。ただし音や絵が抜ける場合があるため、CONFIG/SystemでON/OFFできるようにしてあ...
authoryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Mon, 9 Apr 2012 13:28:22 +0000 (13:28 +0000)
committeryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Mon, 9 Apr 2012 13:28:22 +0000 (13:28 +0000)
git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/trunk@353 16f42ceb-6dc6-49c8-ba94-f2d53467949d

15 files changed:
DTXManiaプロジェクト/DTXManiaプロジェクト.csproj
DTXManiaプロジェクト/Properties/AssemblyInfo.cs
DTXManiaプロジェクト/コード/スコア、曲/CDTX.cs
DTXManiaプロジェクト/コード/ステージ/04.コンフィグ/CActConfigList.cs
DTXManiaプロジェクト/コード/ステージ/06.曲読み込み/CStage曲読み込み.cs
DTXManiaプロジェクト/コード/全体/CConfigIni.cs
DTXManiaプロジェクト/コード/全体/CDTXMania.cs
FDK17プロジェクト/FDK19.csproj
FDK17プロジェクト/Properties/AssemblyInfo.cs
FDK17プロジェクト/コード/00.共通/CCpuCores.cs [new file with mode: 0644]
FDK17プロジェクト/コード/03.サウンド/CSound.cs
FDK17プロジェクト/コード/03.サウンド/CSound管理.cs
FDK17プロジェクト/コード/04.グラフィック/CTexture.cs
実行時フォルダ/DTXManiaGR.exe
実行時フォルダ/FDK.dll

index bf52e8f..10f5e83 100644 (file)
     <Compile Include="コード\ステージ\05.選曲\CActSelect演奏履歴パネル.cs" />\r
     <Compile Include="コード\ステージ\05.選曲\CActSortSongs.cs" />\r
     <Compile Include="コード\ステージ\05.選曲\CStage選曲.cs" />\r
+    <Compile Include="コード\ステージ\06.曲読み込み\CLoadInParallelBase.cs" />\r
     <Compile Include="コード\ステージ\06.曲読み込み\CStage曲読み込み.cs" />\r
     <Compile Include="コード\ステージ\07.演奏\CAct演奏AVI.cs" />\r
     <Compile Include="コード\ステージ\07.演奏\CAct演奏BGA.cs" />\r
index ac56022..ef7ca57 100644 (file)
@@ -11,7 +11,7 @@ using System.Resources;
 [assembly: AssemblyConfiguration("")]\r
 [assembly: AssemblyCompany("")]\r
 [assembly: AssemblyProduct("DTXManiaGR")]\r
-[assembly: AssemblyCopyright("Copyright (C) 2000-2011 DTXMania Group")]\r
+[assembly: AssemblyCopyright( "Copyright (C) 2000-2012 DTXMania Group" )]\r
 [assembly: AssemblyTrademark("")]\r
 [assembly: AssemblyCulture("")]\r
 \r
@@ -33,8 +33,8 @@ using System.Resources;
 // すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \r
 // 既定値にすることができます:\r
 // [assembly: AssemblyVersion("1.0.*")]\r
-[assembly: AssemblyVersion( "92.0.0.0" )]\r
-[assembly: AssemblyFileVersion( "92.0.0.0" )]\r
+[assembly: AssemblyVersion( "93.0.0.0" )]\r
+[assembly: AssemblyFileVersion( "93.0.0.0" )]\r
 [assembly: NeutralResourcesLanguageAttribute("ja-JP")]\r
 \r
 // このアセンブリは「ライブラリ」である(難読化ツールへの指示)。\r
index f4fbe7a..054633a 100644 (file)
@@ -8,6 +8,7 @@ using System.IO;
 using System.Security.Cryptography;\r
 using System.Reflection;\r
 using System.Globalization;\r
+using System.Threading;\r
 using FDK;\r
 \r
 namespace DTXMania\r
@@ -178,111 +179,30 @@ namespace DTXMania
                                        CDTX.tZZ( this.nBMP番号 ) );\r
                        }\r
                }\r
-               public class CBMP : IDisposable\r
+               public class CBMP : CBMPbase, IDisposable\r
                {\r
-                       public bool bUse;\r
-                       public int n番号;\r
-                       public string strコメント文 = "";\r
-                       public string strファイル名 = "";\r
-                       public CTexture tx画像;\r
-                       public int n高さ\r
+                       public override void PutLog( string strテクスチャファイル名 )\r
                        {\r
-                               get\r
-                               {\r
-                                       return this.tx画像.sz画像サイズ.Height;\r
-                               }\r
+                               Trace.TraceInformation( "テクスチャを生成しました。({0})({1})({2}x{3})", this.strコメント文, strテクスチャファイル名, this.n幅, this.n高さ );\r
                        }\r
-                       public int n幅\r
+                       public override string ToString()\r
                        {\r
-                               get\r
-                               {\r
-                                       return this.tx画像.sz画像サイズ.Width;\r
-                               }\r
+                               return string.Format( "CBMP{0}: File:{1}, Comment:{2}", CDTX.tZZ( this.n番号 ), this.strファイル名, this.strコメント文 );\r
                        }\r
 \r
-                       public void OnDeviceCreated()\r
+               }\r
+               public class CBMPTEX : CBMPbase, IDisposable\r
+               {\r
+                       public override void PutLog( string strテクスチャファイル名 )\r
                        {\r
-                               #region [ strテクスチャファイル名 を作成。]\r
-                               //-----------------\r
-                               string strテクスチャファイル名;\r
-                               if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )\r
-                                       strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;\r
-                               else\r
-                                       strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
-                               //-----------------\r
-                               #endregion\r
-\r
-                               if( !File.Exists( strテクスチャファイル名 ) )\r
-                               {\r
-                                       Trace.TraceWarning( "ファイルが存在しません。({0})({1})", this.strコメント文, strテクスチャファイル名 );\r
-                                       this.tx画像 = null;\r
-                                       return;\r
-                               }\r
-\r
-                               // テクスチャを作成。\r
-\r
-                               this.tx画像 = CDTXMania.tテクスチャの生成( strテクスチャファイル名, true );\r
-\r
-                               if( this.tx画像 != null )\r
-                               {\r
-                                       // 作成成功。\r
-\r
-                                       if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
-                                               Trace.TraceInformation( "テクスチャを生成しました。({0})({1})({2}x{3})", this.strコメント文, strテクスチャファイル名, this.n幅, this.n高さ );\r
-\r
-                                       this.bUse = true;\r
-                               }\r
-                               else\r
-                               {\r
-                                       // 作成失敗。\r
-\r
-                                       Trace.TraceError( "テクスチャの生成に失敗しました。({0})({1})", this.strコメント文, strテクスチャファイル名 );\r
-                                       this.tx画像 = null;\r
-                               }\r
+                               Trace.TraceInformation( "テクスチャを生成しました。({0})({1})(Gr:{2}x{3})(Tx:{4}x{5})", this.strコメント文, strテクスチャファイル名, this.tx画像.sz画像サイズ.Width, this.tx画像.sz画像サイズ.Height, this.tx画像.szテクスチャサイズ.Width, this.tx画像.szテクスチャサイズ.Height );\r
                        }\r
                        public override string ToString()\r
                        {\r
-                               return string.Format( "CBMP{0}: File:{1}, Comment:{2}", CDTX.tZZ( this.n番号 ), this.strファイル名, this.strコメント文 );\r
-                       }\r
-\r
-                       #region [ IDisposable 実装 ]\r
-                       //-----------------\r
-                       public void Dispose()\r
-                       {\r
-                               if( this.bDisposed済み )\r
-                                       return;\r
-\r
-                               if( this.tx画像 != null )\r
-                               {\r
-                                       #region [ strテクスチャファイル名 を作成。]\r
-                                       //-----------------\r
-                                       string strテクスチャファイル名;\r
-                                       if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )\r
-                                               strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;\r
-                                       else\r
-                                               strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
-                                       //-----------------\r
-                                       #endregion\r
-\r
-                                       CDTXMania.tテクスチャの解放( ref this.tx画像 );\r
-\r
-                                       if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
-                                               Trace.TraceInformation( "テクスチャを解放しました。({0})({1})", this.strコメント文, strテクスチャファイル名 );\r
-                               }\r
-                               this.bUse = false;\r
-\r
-                               this.bDisposed済み = true;\r
+                               return string.Format( "CBMPTEX{0}: File:{1}, Comment:{2}", CDTX.tZZ( this.n番号 ), this.strファイル名, this.strコメント文 );\r
                        }\r
-                       //-----------------\r
-                       #endregion\r
-\r
-                       #region [ private ]\r
-                       //-----------------\r
-                       private bool bDisposed済み;\r
-                       //-----------------\r
-                       #endregion\r
                }\r
-               public class CBMPTEX : IDisposable\r
+               public class CBMPbase : IDisposable\r
                {\r
                        public bool bUse;\r
                        public int n番号;\r
@@ -304,19 +224,30 @@ namespace DTXMania
                                }\r
                        }\r
 \r
+                       public string GetFullPathname\r
+                       {\r
+                               get\r
+                               {\r
+                                       if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )\r
+                                               return CDTXMania.DTX.PATH_WAV + this.strファイル名;\r
+                                       else\r
+                                               return CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
+                               }\r
+                       }\r
+\r
                        public void OnDeviceCreated()\r
                        {\r
                                #region [ strテクスチャファイル名 を作成。]\r
                                //-----------------\r
-                               string strテクスチャファイル名;\r
-                               if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )\r
-                                       strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;\r
-                               else\r
-                                       strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
+                               string strテクスチャファイル名 = this.GetFullPathname;\r
+                               //if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )\r
+                               //    strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;\r
+                               //else\r
+                               //    strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
                                //-----------------\r
                                #endregion\r
 \r
-                               if( !File.Exists( strテクスチャファイル名 ) )\r
+                               if ( !File.Exists( strテクスチャファイル名 ) )\r
                                {\r
                                        Trace.TraceWarning( "ファイルが存在しません。({0})({1})", this.strコメント文, strテクスチャファイル名 );\r
                                        this.tx画像 = null;\r
@@ -324,27 +255,32 @@ namespace DTXMania
                                }\r
 \r
                                // テクスチャを作成。\r
+                               byte[] txData = File.ReadAllBytes( strテクスチャファイル名 );\r
+                               // this.tx画像 = CDTXMania.tテクスチャの生成( strテクスチャファイル名, true );\r
+                               this.OnDeviceCreated( txData, strテクスチャファイル名 );\r
+                       }\r
+                       public void OnDeviceCreated( byte[] txData, string strテクスチャファイル名 )\r
+                       {\r
+                               this.tx画像 = CDTXMania.tテクスチャの生成( txData, true );\r
 \r
-                               this.tx画像 = CDTXMania.tテクスチャの生成( strテクスチャファイル名 );\r
-\r
-                               if( this.tx画像 != null )\r
+                               if ( this.tx画像 != null )\r
                                {\r
-                                       // 作成成功\r
+                                       // 作成成功\r
 \r
-                                       if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
-                                               Trace.TraceInformation( "テクスチャを生成しました。({0})({1})(Gr:{2}x{3})(Tx:{4}x{5})", this.strコメント文, strテクスチャファイル名, this.tx画像.sz画像サイズ.Width, this.tx画像.sz画像サイズ.Height, this.tx画像.szテクスチャサイズ.Width, this.tx画像.szテクスチャサイズ.Height );\r
+                                       if ( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
+                                               PutLog( strテクスチャファイル名 );\r
                                        this.bUse = true;\r
                                }\r
                                else\r
                                {\r
-                                       // 作成失敗\r
-\r
+                                       // 作成失敗。\r
                                        Trace.TraceError( "テクスチャの生成に失敗しました。({0})({1})", this.strコメント文, strテクスチャファイル名 );\r
+                                       this.tx画像 = null;\r
                                }\r
                        }\r
-                       public override string ToString()\r
+\r
+                       public virtual void PutLog(string strテクスチャファイル名)\r
                        {\r
-                               return string.Format( "CBMPTEX{0}: File:{1}, Comment:{2}", CDTX.tZZ( this.n番号 ), this.strファイル名, this.strコメント文 );\r
                        }\r
 \r
                        #region [ IDisposable 実装 ]\r
@@ -358,11 +294,11 @@ namespace DTXMania
                                {\r
                                        #region [ strテクスチャファイル名 を作成。]\r
                                        //-----------------\r
-                                       string strテクスチャファイル名;\r
-                                       if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )\r
-                                               strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;\r
-                                       else\r
-                                               strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
+                                       string strテクスチャファイル名 = this.GetFullPathname;\r
+                                       //if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )\r
+                                       //    strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;\r
+                                       //else\r
+                                       //    strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
                                        //-----------------\r
                                        #endregion\r
 \r
@@ -375,9 +311,7 @@ namespace DTXMania
 \r
                                this.bDisposed済み = true;\r
                        }\r
-                       //-----------------\r
                        #endregion\r
-\r
                        #region [ private ]\r
                        //-----------------\r
                        private bool bDisposed済み;\r
@@ -1090,7 +1024,8 @@ namespace DTXMania
                public class CWAV : IDisposable\r
                {\r
                        public bool bBGMとして使う;\r
-                       public List<int> listこのWAVを使用するチャンネル番号の集合 = new List<int>( 16 );\r
+                       public bool bIsOnBGMLane;       // #28021 「bBGMとして使う」の用途不明につき、「BGMレーン(01)上にあるWAV」という意味で新規作成\r
+                       public List<int> listこのWAVを使用するチャンネル番号の集合 = new List<int>( 16 );      // 登録はしているけど参照はしていないような・・・\r
                        public int nチップサイズ = 100;\r
                        public int n位置;\r
                        public long[] n一時停止時刻 = new long[ 4 ];\r
@@ -1551,43 +1486,12 @@ namespace DTXMania
                        stdgbvalue.Bass = 0;\r
                        this.LEVEL = stdgbvalue;\r
 \r
-#if true       // 2010.12.31 yyagi #RESULTxxxのリファクタ後。ここはnew()して参照渡ししなくてもいいよね?\r
                        for (int i = 0; i < 7; i++) {\r
                                this.RESULTIMAGE[i] = "";\r
                                this.RESULTMOVIE[i] = "";\r
                                this.RESULTSOUND[i] = "";\r
                        }\r
-#else          // #RESULTxxxのリファクタ前\r
-                       STRESULT stresult4 = new STRESULT();\r
-                       STRESULT stresult = stresult4;\r
-                       stresult.SS = "";\r
-                       stresult.S = "";\r
-                       stresult.A = "";\r
-                       stresult.B = "";\r
-                       stresult.C = "";\r
-                       stresult.D = "";\r
-                       stresult.E = "";\r
-                       this.RESULTIMAGE = stresult;\r
-                       stresult4 = new STRESULT();\r
-                       STRESULT stresult2 = stresult4;\r
-                       stresult2.SS = "";\r
-                       stresult2.S = "";\r
-                       stresult2.A = "";\r
-                       stresult2.B = "";\r
-                       stresult2.C = "";\r
-                       stresult2.D = "";\r
-                       stresult2.E = "";\r
-                       this.RESULTMOVIE = stresult2;\r
-                       STRESULT stresult3 = new STRESULT();\r
-                       stresult3.SS = "";\r
-                       stresult3.S = "";\r
-                       stresult3.A = "";\r
-                       stresult3.B = "";\r
-                       stresult3.C = "";\r
-                       stresult3.D = "";\r
-                       stresult3.E = "";\r
-                       this.RESULTSOUND = stresult3;\r
-#endif\r
+\r
                        this.db再生速度 = 1.0;\r
                        this.strハッシュofDTXファイル = "";\r
                        this.bチップがある = new STチップがある();\r
@@ -1611,7 +1515,6 @@ namespace DTXMania
                        this.nRESULTMOVIE用優先順位 = new int[ 7 ];\r
                        this.nRESULTSOUND用優先順位 = new int[ 7 ];\r
 \r
-#if true       // 2011.1.1 yyagi GDA->DTX変換テーブル リファクタ後\r
                        STGDAPARAM[] stgdaparamArray = new STGDAPARAM[] {               // GDA->DTX conversion table\r
                                new STGDAPARAM("TC", 0x03),     new STGDAPARAM("BL", 0x02),     new STGDAPARAM("GS", 0x29),\r
                                new STGDAPARAM("DS", 0x30),     new STGDAPARAM("FI", 0x53),     new STGDAPARAM("HH", 0x11),\r
@@ -1635,313 +1538,7 @@ namespace DTXMania
                                new STGDAPARAM("B7", 0xA7),     new STGDAPARAM("BW", 0xA8),     new STGDAPARAM("G0", 0x20),\r
                                new STGDAPARAM("B0", 0xA0)\r
                        };\r
-#else  // 2011.1.1 yyagi GDA->DTX変換テーブル リファクタ前\r
-                       STGDAPARAM[] stgdaparamArray = new STGDAPARAM[62];\r
-                       STGDAPARAM stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam = stgdaparam62;\r
-                       stgdaparam.s = "TC";\r
-                       stgdaparam.c = 3;\r
-                       stgdaparamArray[ 0 ] = stgdaparam;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam2 = stgdaparam62;\r
-                       stgdaparam2.s = "BL";\r
-                       stgdaparam2.c = 2;\r
-                       stgdaparamArray[ 1 ] = stgdaparam2;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam3 = stgdaparam62;\r
-                       stgdaparam3.s = "GS";\r
-                       stgdaparam3.c = 0x29;\r
-                       stgdaparamArray[ 2 ] = stgdaparam3;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam4 = stgdaparam62;\r
-                       stgdaparam4.s = "DS";\r
-                       stgdaparam4.c = 0x30;\r
-                       stgdaparamArray[ 3 ] = stgdaparam4;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam5 = stgdaparam62;\r
-                       stgdaparam5.s = "FI";\r
-                       stgdaparam5.c = 0x53;\r
-                       stgdaparamArray[ 4 ] = stgdaparam5;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam6 = stgdaparam62;\r
-                       stgdaparam6.s = "HH";\r
-                       stgdaparam6.c = 0x11;\r
-                       stgdaparamArray[ 5 ] = stgdaparam6;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam7 = stgdaparam62;\r
-                       stgdaparam7.s = "SD";\r
-                       stgdaparam7.c = 0x12;\r
-                       stgdaparamArray[ 6 ] = stgdaparam7;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam8 = stgdaparam62;\r
-                       stgdaparam8.s = "BD";\r
-                       stgdaparam8.c = 0x13;\r
-                       stgdaparamArray[ 7 ] = stgdaparam8;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam9 = stgdaparam62;\r
-                       stgdaparam9.s = "HT";\r
-                       stgdaparam9.c = 20;\r
-                       stgdaparamArray[ 8 ] = stgdaparam9;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam10 = stgdaparam62;\r
-                       stgdaparam10.s = "LT";\r
-                       stgdaparam10.c = 0x15;\r
-                       stgdaparamArray[ 9 ] = stgdaparam10;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam11 = stgdaparam62;\r
-                       stgdaparam11.s = "CY";\r
-                       stgdaparam11.c = 0x16;\r
-                       stgdaparamArray[ 10 ] = stgdaparam11;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam12 = stgdaparam62;\r
-                       stgdaparam12.s = "G1";\r
-                       stgdaparam12.c = 0x21;\r
-                       stgdaparamArray[ 11 ] = stgdaparam12;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam13 = stgdaparam62;\r
-                       stgdaparam13.s = "G2";\r
-                       stgdaparam13.c = 0x22;\r
-                       stgdaparamArray[ 12 ] = stgdaparam13;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam14 = stgdaparam62;\r
-                       stgdaparam14.s = "G3";\r
-                       stgdaparam14.c = 0x23;\r
-                       stgdaparamArray[ 13 ] = stgdaparam14;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam15 = stgdaparam62;\r
-                       stgdaparam15.s = "G4";\r
-                       stgdaparam15.c = 0x24;\r
-                       stgdaparamArray[ 14 ] = stgdaparam15;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam16 = stgdaparam62;\r
-                       stgdaparam16.s = "G5";\r
-                       stgdaparam16.c = 0x25;\r
-                       stgdaparamArray[ 15 ] = stgdaparam16;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam17 = stgdaparam62;\r
-                       stgdaparam17.s = "G6";\r
-                       stgdaparam17.c = 0x26;\r
-                       stgdaparamArray[ 0x10 ] = stgdaparam17;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam18 = stgdaparam62;\r
-                       stgdaparam18.s = "G7";\r
-                       stgdaparam18.c = 0x27;\r
-                       stgdaparamArray[ 0x11 ] = stgdaparam18;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam19 = stgdaparam62;\r
-                       stgdaparam19.s = "GW";\r
-                       stgdaparam19.c = 40;\r
-                       stgdaparamArray[ 0x12 ] = stgdaparam19;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam20 = stgdaparam62;\r
-                       stgdaparam20.s = "01";\r
-                       stgdaparam20.c = 0x61;\r
-                       stgdaparamArray[ 0x13 ] = stgdaparam20;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam21 = stgdaparam62;\r
-                       stgdaparam21.s = "02";\r
-                       stgdaparam21.c = 0x62;\r
-                       stgdaparamArray[ 20 ] = stgdaparam21;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam22 = stgdaparam62;\r
-                       stgdaparam22.s = "03";\r
-                       stgdaparam22.c = 0x63;\r
-                       stgdaparamArray[ 0x15 ] = stgdaparam22;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam23 = stgdaparam62;\r
-                       stgdaparam23.s = "04";\r
-                       stgdaparam23.c = 100;\r
-                       stgdaparamArray[ 0x16 ] = stgdaparam23;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam24 = stgdaparam62;\r
-                       stgdaparam24.s = "05";\r
-                       stgdaparam24.c = 0x65;\r
-                       stgdaparamArray[ 0x17 ] = stgdaparam24;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam25 = stgdaparam62;\r
-                       stgdaparam25.s = "06";\r
-                       stgdaparam25.c = 0x66;\r
-                       stgdaparamArray[ 0x18 ] = stgdaparam25;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam26 = stgdaparam62;\r
-                       stgdaparam26.s = "07";\r
-                       stgdaparam26.c = 0x67;\r
-                       stgdaparamArray[ 0x19 ] = stgdaparam26;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam27 = stgdaparam62;\r
-                       stgdaparam27.s = "08";\r
-                       stgdaparam27.c = 0x68;\r
-                       stgdaparamArray[ 0x1a ] = stgdaparam27;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam28 = stgdaparam62;\r
-                       stgdaparam28.s = "09";\r
-                       stgdaparam28.c = 0x69;\r
-                       stgdaparamArray[ 0x1b ] = stgdaparam28;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam29 = stgdaparam62;\r
-                       stgdaparam29.s = "0A";\r
-                       stgdaparam29.c = 0x70;\r
-                       stgdaparamArray[ 0x1c ] = stgdaparam29;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam30 = stgdaparam62;\r
-                       stgdaparam30.s = "0B";\r
-                       stgdaparam30.c = 0x71;\r
-                       stgdaparamArray[ 0x1d ] = stgdaparam30;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam31 = stgdaparam62;\r
-                       stgdaparam31.s = "0C";\r
-                       stgdaparam31.c = 0x72;\r
-                       stgdaparamArray[ 30 ] = stgdaparam31;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam32 = stgdaparam62;\r
-                       stgdaparam32.s = "0D";\r
-                       stgdaparam32.c = 0x73;\r
-                       stgdaparamArray[ 0x1f ] = stgdaparam32;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam33 = stgdaparam62;\r
-                       stgdaparam33.s = "0E";\r
-                       stgdaparam33.c = 0x74;\r
-                       stgdaparamArray[ 0x20 ] = stgdaparam33;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam34 = stgdaparam62;\r
-                       stgdaparam34.s = "0F";\r
-                       stgdaparam34.c = 0x75;\r
-                       stgdaparamArray[ 0x21 ] = stgdaparam34;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam35 = stgdaparam62;\r
-                       stgdaparam35.s = "10";\r
-                       stgdaparam35.c = 0x76;\r
-                       stgdaparamArray[ 0x22 ] = stgdaparam35;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam36 = stgdaparam62;\r
-                       stgdaparam36.s = "11";\r
-                       stgdaparam36.c = 0x77;\r
-                       stgdaparamArray[ 0x23 ] = stgdaparam36;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam37 = stgdaparam62;\r
-                       stgdaparam37.s = "12";\r
-                       stgdaparam37.c = 120;\r
-                       stgdaparamArray[ 0x24 ] = stgdaparam37;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam38 = stgdaparam62;\r
-                       stgdaparam38.s = "13";\r
-                       stgdaparam38.c = 0x79;\r
-                       stgdaparamArray[ 0x25 ] = stgdaparam38;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam39 = stgdaparam62;\r
-                       stgdaparam39.s = "14";\r
-                       stgdaparam39.c = 0x80;\r
-                       stgdaparamArray[ 0x26 ] = stgdaparam39;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam40 = stgdaparam62;\r
-                       stgdaparam40.s = "15";\r
-                       stgdaparam40.c = 0x81;\r
-                       stgdaparamArray[ 0x27 ] = stgdaparam40;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam41 = stgdaparam62;\r
-                       stgdaparam41.s = "16";\r
-                       stgdaparam41.c = 130;\r
-                       stgdaparamArray[ 40 ] = stgdaparam41;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam42 = stgdaparam62;\r
-                       stgdaparam42.s = "17";\r
-                       stgdaparam42.c = 0x83;\r
-                       stgdaparamArray[ 0x29 ] = stgdaparam42;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam43 = stgdaparam62;\r
-                       stgdaparam43.s = "18";\r
-                       stgdaparam43.c = 0x84;\r
-                       stgdaparamArray[ 0x2a ] = stgdaparam43;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam44 = stgdaparam62;\r
-                       stgdaparam44.s = "19";\r
-                       stgdaparam44.c = 0x85;\r
-                       stgdaparamArray[ 0x2b ] = stgdaparam44;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam45 = stgdaparam62;\r
-                       stgdaparam45.s = "1A";\r
-                       stgdaparam45.c = 0x86;\r
-                       stgdaparamArray[ 0x2c ] = stgdaparam45;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam46 = stgdaparam62;\r
-                       stgdaparam46.s = "1B";\r
-                       stgdaparam46.c = 0x87;\r
-                       stgdaparamArray[ 0x2d ] = stgdaparam46;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam47 = stgdaparam62;\r
-                       stgdaparam47.s = "1C";\r
-                       stgdaparam47.c = 0x88;\r
-                       stgdaparamArray[ 0x2e ] = stgdaparam47;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam48 = stgdaparam62;\r
-                       stgdaparam48.s = "1D";\r
-                       stgdaparam48.c = 0x89;\r
-                       stgdaparamArray[ 0x2f ] = stgdaparam48;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam49 = stgdaparam62;\r
-                       stgdaparam49.s = "1E";\r
-                       stgdaparam49.c = 0x90;\r
-                       stgdaparamArray[ 0x30 ] = stgdaparam49;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam50 = stgdaparam62;\r
-                       stgdaparam50.s = "1F";\r
-                       stgdaparam50.c = 0x91;\r
-                       stgdaparamArray[ 0x31 ] = stgdaparam50;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam51 = stgdaparam62;\r
-                       stgdaparam51.s = "20";\r
-                       stgdaparam51.c = 0x92;\r
-                       stgdaparamArray[ 50 ] = stgdaparam51;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam52 = stgdaparam62;\r
-                       stgdaparam52.s = "B1";\r
-                       stgdaparam52.c = 0xa1;\r
-                       stgdaparamArray[ 0x33 ] = stgdaparam52;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam53 = stgdaparam62;\r
-                       stgdaparam53.s = "B2";\r
-                       stgdaparam53.c = 0xa2;\r
-                       stgdaparamArray[ 0x34 ] = stgdaparam53;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam54 = stgdaparam62;\r
-                       stgdaparam54.s = "B3";\r
-                       stgdaparam54.c = 0xa3;\r
-                       stgdaparamArray[ 0x35 ] = stgdaparam54;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam55 = stgdaparam62;\r
-                       stgdaparam55.s = "B4";\r
-                       stgdaparam55.c = 0xa4;\r
-                       stgdaparamArray[ 0x36 ] = stgdaparam55;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam56 = stgdaparam62;\r
-                       stgdaparam56.s = "B5";\r
-                       stgdaparam56.c = 0xa5;\r
-                       stgdaparamArray[ 0x37 ] = stgdaparam56;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam57 = stgdaparam62;\r
-                       stgdaparam57.s = "B6";\r
-                       stgdaparam57.c = 0xa6;\r
-                       stgdaparamArray[ 0x38 ] = stgdaparam57;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam58 = stgdaparam62;\r
-                       stgdaparam58.s = "B7";\r
-                       stgdaparam58.c = 0xa7;\r
-                       stgdaparamArray[ 0x39 ] = stgdaparam58;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam59 = stgdaparam62;\r
-                       stgdaparam59.s = "BW";\r
-                       stgdaparam59.c = 0xa8;\r
-                       stgdaparamArray[ 0x3a ] = stgdaparam59;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam60 = stgdaparam62;\r
-                       stgdaparam60.s = "G0";\r
-                       stgdaparam60.c = 0x20;\r
-                       stgdaparamArray[ 0x3b ] = stgdaparam60;\r
-                       STGDAPARAM stgdaparam61 = new STGDAPARAM();\r
-                       stgdaparam61.s = "B0";\r
-                       stgdaparam61.c = 160;\r
-                       stgdaparamArray[ 60 ] = stgdaparam61;\r
-#endif\r
+\r
                        this.stGDAParam = stgdaparamArray;\r
                        this.nBGMAdjust = 0;\r
 \r
@@ -2025,7 +1622,8 @@ namespace DTXMania
                        {\r
                                foreach( CChip chip in this.listChip )\r
                                {\r
-                                       if( chip.nチャンネル番号 == 0x54 )\r
+                                       #region [ AVI ]\r
+                                       if ( chip.nチャンネル番号 == 0x54 )\r
                                        {\r
                                                chip.eAVI種別 = EAVI種別.Unknown;\r
                                                chip.rAVI = null;\r
@@ -2047,37 +1645,147 @@ namespace DTXMania
                                                        chip.rAVI = this.listAVI[ chip.n整数値 ];\r
                                                }\r
                                        }\r
+                                       #endregion\r
                                }\r
                        }\r
                }\r
+\r
+               #region [ 読み込みとテクスチャ定義をセットで並列化するやり方(D3D外のプロセスでテクスチャ定義すると問題なので結局未使用) ]\r
+               //private class Cbmp並列読み込み : CLoadInParallelBase<CBMP>\r
+               //{\r
+               //    public Cbmp並列読み込み( string p, string f ) : base( p, f ) { }\r
+\r
+               //    protected override void t読み込みMain( object tlws )\r
+               //    {\r
+               //        tLoadState t = (tLoadState) tlws;\r
+\r
+               //        CBMP cbmp = (CBMP) t.cItem;\r
+               //        cbmp.OnDeviceCreated();\r
+               //        ( (tLoadState) tlws ).errcode = CLoadInParallelBase<CBMP>.ErrCode.OK;\r
+               //        base.t読み込みMain( tlws );\r
+               //    }\r
+               //}\r
+\r
+               //private class Cbmptex並列読み込み : CLoadInParallelBase<CBMPTEX>\r
+               //{\r
+               //    public Cbmptex並列読み込み( string p, string f ) : base( p, f ) { }\r
+\r
+               //    protected override void t読み込みMain( object tlws )\r
+               //    {\r
+               //        tLoadState t = (tLoadState) tlws;\r
+\r
+               //        CBMPTEX cbmptex = (CBMPTEX) t.cItem;\r
+               //        cbmptex.OnDeviceCreated();\r
+               //        ( (tLoadState) tlws ).errcode = CLoadInParallelBase<CBMPTEX>.ErrCode.OK;\r
+               //        // base.t読み込みMain( tlws );\r
+               //    }\r
+               //}\r
+               #endregion\r
+               #region [ マルチスレッドでの読み込み用 デリゲート・コールバック定義 ]\r
+               private static int nLoadCompleted;\r
+               delegate byte[] ParallelLoadBMPDelegate( CBMPbase cbmp );\r
+               static ParallelLoadBMPDelegate parallelLoadBMPDelegate;\r
+               private static byte[] LoadTexture( CBMPbase cbmp )              // 別スレッドで動作する、ファイル読み込み部\r
+               {\r
+                       string filename = cbmp.GetFullPathname;\r
+                       if ( !File.Exists( filename ) )\r
+                       {\r
+                               Trace.TraceWarning( "ファイルが存在しません。({0})", filename );\r
+                               return null;\r
+                       }\r
+                       return File.ReadAllBytes( filename );\r
+               }\r
+               private static void BMPLoadCallback( IAsyncResult ar )  // メインスレッドで動作する、コールバック部(テクスチャ定義部)\r
+               {\r
+                       ParallelLoadBMPDelegate asyncCall = (ParallelLoadBMPDelegate) ( (System.Runtime.Remoting.Messaging.AsyncResult) ar ).AsyncDelegate;\r
+                       CBMPbase cbmp = (CBMPbase) ar.AsyncState;\r
+                       byte[] txData = asyncCall.EndInvoke( ar );\r
+                       cbmp.OnDeviceCreated( txData, cbmp.GetFullPathname );\r
+                       Interlocked.Increment( ref nLoadCompleted );\r
+               }\r
+               #endregion\r
                public void tBMP_BMPTEXの読み込み()\r
                {\r
-                       if( this.listBMP != null )\r
+                       #region [ BMP読み込み ]\r
+                       if ( this.listBMP != null )\r
                        {\r
-                               foreach( CBMP cbmp in this.listBMP.Values )\r
+                               if ( CDTXMania.ConfigIni.bLoadBMPInParallel )\r
                                {\r
-                                       cbmp.OnDeviceCreated();\r
+                                       nLoadCompleted = 0;\r
+                                       foreach ( CBMP cbmp in this.listBMP.Values )\r
+                                       {\r
+                                               parallelLoadBMPDelegate = new ParallelLoadBMPDelegate( LoadTexture );\r
+                                               parallelLoadBMPDelegate.BeginInvoke( cbmp,\r
+                                                       new AsyncCallback( BMPLoadCallback ), cbmp );\r
+                                       }\r
+                                       while ( nLoadCompleted < this.listBMP.Count )   // テクスチャ定義が全て完了するまで待つ\r
+                                       {\r
+                                               Thread.Sleep( 100 );\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       foreach ( CBMP cbmp in this.listBMP.Values )\r
+                                       {\r
+                                               cbmp.OnDeviceCreated();\r
+                                       }\r
                                }\r
+                               #region [ 読み込みとテクスチャ定義をセットで並列化するやり方(D3D外のプロセスでテクスチャ定義すると問題なので結局未使用) ]\r
+                               // Cbmp並列読み込み c = new Cbmp並列読み込み( PATH_WAV, strフォルダ名 );\r
+                               // c.bActivateParallelLoad = CDTXMania.ConfigIni.bLoadBMPInParallel;\r
+                               // // Debug.WriteLine( "BEGIN BMP LOAD (" + listBMP.Count + ")" );\r
+                               // c.t読み込み( listBMP );\r
+                               // // Debug.WriteLine( "END   BMP LOAD" );\r
+                               #endregion\r
                        }\r
-                       if( this.listBMPTEX != null )\r
+                       #endregion\r
+                       #region [ BMPTEX読み込み ]\r
+                       if ( this.listBMPTEX != null )\r
                        {\r
-                               foreach( CBMPTEX cbmptex in this.listBMPTEX.Values )\r
+                               if ( CDTXMania.ConfigIni.bLoadBMPInParallel )\r
                                {\r
-                                       cbmptex.OnDeviceCreated();\r
+                                       nLoadCompleted = 0;\r
+                                       foreach ( CBMPTEX cbmptex in this.listBMPTEX.Values )\r
+                                       {\r
+                                               parallelLoadBMPDelegate = new ParallelLoadBMPDelegate( LoadTexture );\r
+                                               parallelLoadBMPDelegate.BeginInvoke( cbmptex,\r
+                                                       new AsyncCallback( BMPLoadCallback ), cbmptex );\r
+                                       }\r
+                                       while ( nLoadCompleted < this.listBMPTEX.Count )        // テクスチャ定義が全て完了するまで待つ\r
+                                       {\r
+                                               Thread.Sleep( 100 );\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       foreach ( CBMPTEX cbmptex in this.listBMPTEX.Values )\r
+                                       {\r
+                                               cbmptex.OnDeviceCreated();\r
+                                       }\r
                                }\r
+                               #region [ 読み込みとテクスチャ定義をセットで並列化するやり方(D3D外のプロセスでテクスチャ定義すると問題なので結局未使用) ]\r
+                               //Cbmptex並列読み込み c = new Cbmptex並列読み込み( PATH_WAV, strフォルダ名 );\r
+                               //c.bActivateParallelLoad = CDTXMania.ConfigIni.bLoadBMPInParallel;\r
+                               //// Debug.WriteLine( "BEGIN BMPTEX LOAD (" + listBMPTEX.Count + ")" );\r
+                               //c.t読み込み( listBMPTEX );\r
+                               //// Debug.WriteLine( "END   BMPTEX LOAD" );\r
+                               #endregion\r
                        }\r
-                       if( !this.bヘッダのみ )\r
+                       #endregion\r
+                       if ( !this.bヘッダのみ )\r
                        {\r
                                foreach( CChip chip in this.listChip )\r
                                {\r
-                                       if( ( ( ( chip.nチャンネル番号 == 4 ) || ( chip.nチャンネル番号 == 7 ) ) || ( ( chip.nチャンネル番号 >= 0x55 ) && ( chip.nチャンネル番号 <= 0x59 ) ) ) || ( chip.nチャンネル番号 == 0x60 ) )\r
+                                       #region [ BGAPAN/BGA/BMPTEX/BMP ]\r
+                                       if ( ( ( ( chip.nチャンネル番号 == 4 ) || ( chip.nチャンネル番号 == 7 ) ) || ( ( chip.nチャンネル番号 >= 0x55 ) && ( chip.nチャンネル番号 <= 0x59 ) ) ) || ( chip.nチャンネル番号 == 0x60 ) )\r
                                        {\r
                                                chip.eBGA種別 = EBGA種別.Unknown;\r
                                                chip.rBMP = null;\r
                                                chip.rBMPTEX = null;\r
                                                chip.rBGA = null;\r
                                                chip.rBGAPan = null;\r
-                                               if( this.listBGAPAN.ContainsKey( chip.n整数値 ) )\r
+                                               #region [ BGAPAN ]\r
+                                               if ( this.listBGAPAN.ContainsKey( chip.n整数値 ) )\r
                                                {\r
                                                        CBGAPAN cbgapan = this.listBGAPAN[ chip.n整数値 ];\r
                                                        if( this.listBMPTEX.ContainsKey( cbgapan.nBMP番号 ) && this.listBMPTEX[ cbgapan.nBMP番号 ].bUse )\r
@@ -2095,7 +1803,9 @@ namespace DTXMania
                                                                continue;\r
                                                        }\r
                                                }\r
-                                               if( this.listBGA.ContainsKey( chip.n整数値 ) )\r
+                                               #endregion\r
+                                               #region [ BGA ]\r
+                                               if ( this.listBGA.ContainsKey( chip.n整数値 ) )\r
                                                {\r
                                                        CBGA cbga = this.listBGA[ chip.n整数値 ];\r
                                                        if( this.listBMPTEX.ContainsKey( cbga.nBMP番号 ) && this.listBMPTEX[ cbga.nBMP番号 ].bUse )\r
@@ -2113,20 +1823,27 @@ namespace DTXMania
                                                                continue;\r
                                                        }\r
                                                }\r
-                                               if( this.listBMPTEX.ContainsKey( chip.n整数値 ) && this.listBMPTEX[ chip.n整数値 ].bUse )\r
+                                               #endregion\r
+                                               #region [ BMPTEX ]\r
+                                               if ( this.listBMPTEX.ContainsKey( chip.n整数値 ) && this.listBMPTEX[ chip.n整数値 ].bUse )\r
                                                {\r
                                                        chip.eBGA種別 = EBGA種別.BMPTEX;\r
                                                        chip.rBMPTEX = this.listBMPTEX[ chip.n整数値 ];\r
                                                        continue;\r
                                                }\r
-                                               if( this.listBMP.ContainsKey( chip.n整数値 ) && this.listBMP[ chip.n整数値 ].bUse )\r
+                                               #endregion\r
+                                               #region [ BMP ]\r
+                                               if ( this.listBMP.ContainsKey( chip.n整数値 ) && this.listBMP[ chip.n整数値 ].bUse )\r
                                                {\r
                                                        chip.eBGA種別 = EBGA種別.BMP;\r
                                                        chip.rBMP = this.listBMP[ chip.n整数値 ];\r
                                                        continue;\r
                                                }\r
+                                               #endregion\r
                                        }\r
-                                       if( ( ( ( chip.nチャンネル番号 == 0xc4 ) || ( chip.nチャンネル番号 == 0xc7 ) ) || ( ( chip.nチャンネル番号 >= 0xd5 ) && ( chip.nチャンネル番号 <= 0xd9 ) ) ) || ( chip.nチャンネル番号 == 0xe0 ) )\r
+                                       #endregion\r
+                                       #region [ BGA入れ替え ]\r
+                                       if ( ( ( ( chip.nチャンネル番号 == 0xc4 ) || ( chip.nチャンネル番号 == 0xc7 ) ) || ( ( chip.nチャンネル番号 >= 0xd5 ) && ( chip.nチャンネル番号 <= 0xd9 ) ) ) || ( chip.nチャンネル番号 == 0xe0 ) )\r
                                        {\r
                                                chip.eBGA種別 = EBGA種別.Unknown;\r
                                                chip.rBMP = null;\r
@@ -2144,6 +1861,7 @@ namespace DTXMania
                                                        chip.rBMP = this.listBMP[ chip.n整数値 ];\r
                                                }\r
                                        }\r
+                                       #endregion\r
                                }\r
                        }\r
                }\r
@@ -2183,62 +1901,132 @@ namespace DTXMania
                                }\r
                        }\r
                }\r
-               public void tWAVの読み込み()\r
+\r
+\r
+               private class Cwav並列読み込み : CLoadInParallelBase<CWAV>\r
                {\r
-//                     Trace.TraceInformation("WAV files={0}", this.listWAV.Count);\r
-//                     int count = 0;\r
-                       foreach (CWAV cwav in this.listWAV.Values)\r
+                       public Cwav並列読み込み( string p, string f ) : base( p, f ) { }\r
+\r
+                       protected  override void t読み込みMain( object tlws )\r
                        {\r
-//                             string strCount = count.ToString() + " / " + this.listWAV.Count.ToString();\r
-//                             Debug.WriteLine(strCount);\r
-//                             CDTXMania.act文字コンソール.tPrint(0, 0, C文字コンソール.Eフォント種別.白, strCount);\r
-//                             count++;\r
+                               // string strCount = count.ToString() + " / " + this.listWAV.Count.ToString();\r
+                               // Debug.WriteLine(strCount);\r
+                               // CDTXMania.act文字コンソール.tPrint(0, 0, C文字コンソール.Eフォント種別.白, strCount);\r
+                               // count++;\r
 \r
-                               string str = string.IsNullOrEmpty(this.PATH_WAV) ? this.strフォルダ名 : this.PATH_WAV;\r
+                               tLoadState t = (tLoadState) tlws;\r
+\r
+                               CWAV cwav = (CWAV) t.cItem;\r
+                               string str = string.IsNullOrEmpty( this.PATH_WAV ) ? this.strフォルダ名 : this.PATH_WAV;\r
                                str = str + cwav.strファイル名;\r
+                               //Debug.WriteLine( str + ": start loading" );\r
+                               if ( cwav == null )\r
+                               {\r
+                                       Trace.TraceError( "CWAVがnullです。" );\r
+                               }\r
                                try\r
                                {\r
-                                               try\r
-                                               {\r
-                                                       cwav.rSound[ 0 ] = CDTXMania.Sound管理.tサウンドを生成する(str);\r
-                                                       cwav.rSound[ 0 ].n音量 = 100;\r
-                                                       if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
-                                                       {\r
-                                                               Trace.TraceInformation( "サウンドを作成しました。({3})({0})({1})({2}bytes)", cwav.strコメント文, str, cwav.rSound[ 0 ].nサウンドバッファサイズ, cwav.rSound[ 0 ].bストリーム再生する ? "Stream" : "OnMemory" );\r
-                                                       }\r
-                                               }\r
-                                               catch\r
-                                               {\r
-                                                       cwav.rSound[ 0 ] = null;\r
-                                                       Trace.TraceError( "サウンドの作成に失敗しました。({0})({1})", cwav.strコメント文, str );\r
-                                               }\r
-                                               if ( cwav.rSound[ 0 ] == null || cwav.rSound[ 0 ].bストリーム再生する )\r
-                                               {\r
-                                                       for ( int j = 1; j < cwav.rSound.GetLength(0); j++ )\r
-                                                       {\r
-                                                               cwav.rSound[ j ] = null;\r
-                                                       }\r
-                                               }\r
-                                               else\r
-                                               {\r
-                                                       for ( int j = 1; j < cwav.rSound.GetLength(0); j++ )\r
-                                                       {\r
-                                                               cwav.rSound[ j ] = (CSound) cwav.rSound[ 0 ].Clone();   // #24007 2011.9.5 yyagi add: to accelerate loading chip sounds\r
-                                                               CDTXMania.Sound管理.tサウンドを登録する( cwav.rSound[ j ] );\r
-                                                       }\r
-                                               }\r
+                                   cwav.rSound[ 0 ] = CDTXMania.Sound管理.tサウンドを生成する( str );\r
+                                   cwav.rSound[ 0 ].n音量 = 100;\r
+                                   ( (tLoadState) tlws ).errcode = CLoadInParallelBase<CWAV>.ErrCode.OK;\r
+                                   if ( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
+                                   {\r
+                                       Trace.TraceInformation( "サウンドを作成しました。({3})({0})({1})({2}bytes){4}", cwav.strコメント文, str, cwav.rSound[ 0 ].nサウンドバッファサイズ, cwav.rSound[ 0 ].bストリーム再生する ? "Stream" : "OnMemory", cwav.bIsOnBGMLane ? "(BGM)" : "" );\r
+                                   }\r
                                }\r
-                               catch( Exception exception )\r
+                               catch ( ArgumentException )\r
                                {\r
-                                       Trace.TraceError( "サウンドの生成に失敗しました。({0})({1})({2})", exception.Message, cwav.strコメント文, str );\r
-                                       for( int j = 0; j < cwav.rSound.GetLength(0); j++ )\r
+                                       cwav.rSound[ 0 ] = null;\r
+                                       Trace.TraceError( "ファイルが見つからないか、0byteでした。({0})({1})", cwav.strコメント文, str );\r
+                                       ( (tLoadState) tlws ).errcode = CLoadInParallelBase<CWAV>.ErrCode.FatalError;\r
+                                       // Trace.TraceError( e.Message );\r
+                               }\r
+                               catch ( AccessViolationException e )\r
+                               {\r
+                                   cwav.rSound[ 0 ] = null;\r
+                                   ( (tLoadState) tlws ).errcode = CLoadInParallelBase<CWAV>.ErrCode.TemporalError;\r
+                                   Trace.TraceError( "AccessViolationError。リトライします。({0})({1})", cwav.strコメント文, str );\r
+                                   Trace.TraceError( e.Message );\r
+                               }\r
+                               catch ( NullReferenceException e )\r
+                               {\r
+                                   cwav.rSound[ 0 ] = null;\r
+                                   ( (tLoadState) tlws ).errcode = CLoadInParallelBase<CWAV>.ErrCode.TemporalError;\r
+                                   Trace.TraceError( "NullReferenceException。リトライします。({0})({1})", cwav.strコメント文, str );\r
+                                       if ( e != null )\r
+                                       {\r
+                                               Trace.TraceError( e.Message );\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               Trace.TraceError( "Exception e==nullでした" );\r
+                                       }\r
+\r
+                               }\r
+                               catch ( Exception e )\r
+                               {\r
+                                   cwav.rSound[ 0 ] = null;\r
+                                   ( (tLoadState) tlws ).errcode = CLoadInParallelBase<CWAV>.ErrCode.OK;\r
+                                   Trace.TraceError( "サウンドの作成に失敗しました。({0})({1})", cwav.strコメント文, str );\r
+                                       if ( e != null )        // e==nullのことがある\r
+                                       {\r
+                                               //Trace.TraceError( e.Data.Values.ToString());\r
+                                               //if ( e.InnerException != null )\r
+                                               //{\r
+                                               //    Trace.TraceError( e.InnerException.ToString() );\r
+                                               //}\r
+                                               //Trace.TraceError( e.StackTrace );\r
+                                               Trace.TraceError( e.Message );\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               Trace.TraceError( "Exception e==nullでした" );\r
+                                       }\r
+                               }\r
+\r
+                               if ( cwav.rSound[ 0 ] == null || cwav.rSound[ 0 ].bストリーム再生する )\r
+                               {\r
+                                       for ( int j = 1; j < cwav.rSound.GetLength( 0 ); j++ )\r
                                        {\r
                                                cwav.rSound[ j ] = null;\r
                                        }\r
-                                       continue;\r
                                }\r
+                               else\r
+                               {\r
+                                       try\r
+                                       {\r
+                                               for ( int j = 1; j < cwav.rSound.GetLength( 0 ); j++ )\r
+                                               {\r
+                                                       cwav.rSound[ j ] = (CSound) cwav.rSound[ 0 ].Clone();   // #24007 2011.9.5 yyagi add: to accelerate loading chip sounds\r
+                                                       CDTXMania.Sound管理.tサウンドを登録する( cwav.rSound[ j ] );\r
+                                               }\r
+                                       }\r
+                                       catch ( Exception exception )\r
+                                       {\r
+                                               Trace.TraceError( "サウンドの生成に失敗しました。({0})({1})({2})", exception.Message, cwav.strコメント文, str );\r
+                                               ( (tLoadState) tlws ).errcode = CLoadInParallelBase<CWAV>.ErrCode.FatalError;\r
+                                               for ( int j = 0; j < cwav.rSound.GetLength( 0 ); j++ )\r
+                                               {\r
+                                                       cwav.rSound[ j ] = null;\r
+                                               }\r
+                                       }\r
+                               }\r
+                               //Debug.WriteLine( str + ": end loading" );\r
+                               //base.t読み込みMain( tlws );\r
                        }\r
                }\r
+               public void tWAVの読み込み()\r
+               {\r
+                       Cwav並列読み込み c = new Cwav並列読み込み( PATH_WAV, strフォルダ名 );\r
+                       //Cwav並列読み込み c = new Cwav並列読み込み();\r
+                       //c.SetPaths( PATH_WAV, strフォルダ名 ); \r
+                       c.bActivateParallelLoad = CDTXMania.ConfigIni.bLoadWAVInParallel;\r
+                       // Debug.WriteLine( "BEGIN WAV LOAD (" + listWAV.Count + ")" );\r
+                       c.t読み込み( listWAV );\r
+                       // Debug.WriteLine( "END   WAV LOAD" );\r
+               }\r
+\r
+\r
                public static string tZZ( int n )\r
                {\r
                        if( n < 0 || n >= 36 * 36 )\r
@@ -2553,10 +2341,16 @@ namespace DTXMania
                        }\r
                        if( this.e種別 != E種別.SMF )\r
                        {\r
-                               StreamReader reader = new StreamReader( strファイル名, Encoding.GetEncoding( "shift-jis" ) );\r
-                               string str2 = reader.ReadToEnd();\r
-                               reader.Close();\r
-                               this.t入力・全入力文字列から( str2, db再生速度, nBGMAdjust );\r
+                               try\r
+                               {\r
+                                       StreamReader reader = new StreamReader( strファイル名, Encoding.GetEncoding( "shift-jis" ) );\r
+                                       string str2 = reader.ReadToEnd();\r
+                                       reader.Close();\r
+                                       this.t入力・全入力文字列から( str2, db再生速度, nBGMAdjust );\r
+                               }\r
+                               catch\r
+                               {\r
+                               }\r
                        }\r
                        else\r
                        {\r
@@ -2635,7 +2429,7 @@ namespace DTXMania
                                        this.n無限管理SIZE = null;\r
                                        if( !this.bヘッダのみ )\r
                                        {\r
-                                               int num26;\r
+                                               int ch;\r
                                                CBPM cbpm = null;\r
                                                foreach( CBPM cbpm2 in this.listBPM.Values )\r
                                                {\r
@@ -2652,31 +2446,31 @@ namespace DTXMania
                                                        cbpm.n表記上の番号 = 0;\r
                                                        cbpm.dbBPM値 = 120.0;\r
                                                        this.listBPM.Add( cbpm.n内部番号, cbpm );\r
-                                                       CChip item = new CChip();\r
-                                                       item.n発声位置 = 0;\r
-                                                       item.nチャンネル番号 = 8;\r
-                                                       item.n整数値 = 0;\r
-                                                       item.n整数値・内部番号 = cbpm.n内部番号;\r
-                                                       this.listChip.Add( item );\r
+                                                       CChip chip = new CChip();\r
+                                                       chip.n発声位置 = 0;\r
+                                                       chip.nチャンネル番号 = 8;                // 拡張BPM\r
+                                                       chip.n整数値 = 0;\r
+                                                       chip.n整数値・内部番号 = cbpm.n内部番号;\r
+                                                       this.listChip.Add( chip );\r
                                                }\r
                                                else\r
                                                {\r
-                                                       CChip chip2 = new CChip();\r
-                                                       chip2.n発声位置 = 0;\r
-                                                       chip2.nチャンネル番号 = 8;\r
-                                                       chip2.n整数値 = 0;\r
-                                                       chip2.n整数値・内部番号 = cbpm.n内部番号;\r
-                                                       this.listChip.Add( chip2 );\r
+                                                       CChip chip = new CChip();\r
+                                                       chip.n発声位置 = 0;\r
+                                                       chip.nチャンネル番号 = 8;                // 拡張BPM\r
+                                                       chip.n整数値 = 0;\r
+                                                       chip.n整数値・内部番号 = cbpm.n内部番号;\r
+                                                       this.listChip.Add( chip );\r
                                                }\r
                                                if( this.listBMP.ContainsKey( 0 ) )\r
                                                {\r
-                                                       CChip chip4 = new CChip();\r
-                                                       chip4.n発声位置 = 0;\r
-                                                       chip4.nチャンネル番号 = 4;\r
-                                                       chip4.n整数値 = 0;\r
-                                                       chip4.n整数値・内部番号 = 0;\r
-                                                       CChip chip3 = chip4;\r
-                                                       this.listChip.Add( chip3 );\r
+                                                       CChip chip = new CChip();\r
+                                                       chip.n発声位置 = 0;\r
+                                                       chip.nチャンネル番号 = 4;                // BGA (レイヤBGA1)\r
+                                                       chip.n整数値 = 0;\r
+                                                       chip.n整数値・内部番号 = 0;\r
+                                                       //CChip chip3 = chip;\r
+                                                       this.listChip.Add( chip );\r
                                                }\r
                                                foreach( CWAV cwav in this.listWAV.Values )\r
                                                {\r
@@ -2693,28 +2487,32 @@ namespace DTXMania
                                                                cwav.n音量 = 100;\r
                                                        }\r
                                                }\r
-                                               foreach( CWAV cwav2 in this.listWAV.Values )\r
+                                               foreach( CWAV cwav in this.listWAV.Values )\r
                                                {\r
-                                                       foreach( CChip chip5 in this.listChip )\r
+                                                       foreach( CChip chip in this.listChip )\r
                                                        {\r
-                                                               if( chip5.n整数値・内部番号 == cwav2.n内部番号 )\r
+                                                               if( chip.n整数値・内部番号 == cwav.n内部番号 )\r
                                                                {\r
-                                                                       chip5.dbチップサイズ倍率 = ( (double) cwav2.nチップサイズ ) / 100.0;\r
+                                                                       chip.dbチップサイズ倍率 = ( (double) cwav.nチップサイズ ) / 100.0;\r
+                                                                       if (chip.nチャンネル番号 == 0x01 )       // BGMだったら\r
+                                                                       {\r
+                                                                               cwav.bIsOnBGMLane = true;\r
+                                                                       }\r
                                                                }\r
                                                        }\r
                                                }\r
-                                               for( int m = 0xb1; m <= 0xbb; m++ )\r
+                                               for( int m = 0xb1; m <= 0xbb; m++ )                             // 空打ち(ドラム, ギター, ベース) LCの空打ちが入ってないけど・・・\r
                                                {\r
-                                                       foreach( CChip chip6 in this.listChip )\r
+                                                       foreach( CChip chip in this.listChip )\r
                                                        {\r
-                                                               if( chip6.nチャンネル番号 == m )\r
+                                                               if( chip.nチャンネル番号 == m )\r
                                                                {\r
-                                                                       CChip chip7 = new CChip();\r
-                                                                       chip7.n発声位置 = 0;\r
-                                                                       chip7.nチャンネル番号 = chip6.nチャンネル番号;\r
-                                                                       chip7.n整数値 = chip6.n整数値;\r
-                                                                       chip7.n整数値・内部番号 = chip6.n整数値・内部番号;\r
-                                                                       this.listChip.Add( chip7 );\r
+                                                                       CChip c = new CChip();\r
+                                                                       c.n発声位置 = 0;\r
+                                                                       c.nチャンネル番号 = chip.nチャンネル番号;\r
+                                                                       c.n整数値 = chip.n整数値;\r
+                                                                       c.n整数値・内部番号 = chip.n整数値・内部番号;\r
+                                                                       this.listChip.Add( c );\r
                                                                        break;\r
                                                                }\r
                                                        }\r
@@ -2722,25 +2520,25 @@ namespace DTXMania
                                                if( this.listChip.Count > 0 )\r
                                                {\r
                                                        this.listChip.Sort();\r
-                                                       double num4 = 1.0;\r
-                                                       int num5 = ( this.listChip[ this.listChip.Count - 1 ].n発声位置 + 384 ) - ( this.listChip[ this.listChip.Count - 1 ].n発声位置 % 384 );\r
-                                                       for( int num6 = 0; num6 <= num5; num6 += 384 )\r
+                                                       double barlength = 1.0;\r
+                                                       int nEndOfSong = ( this.listChip[ this.listChip.Count - 1 ].n発声位置 + 384 ) - ( this.listChip[ this.listChip.Count - 1 ].n発声位置 % 384 );\r
+                                                       for( int bar = 0; bar <= nEndOfSong; bar += 384 )\r
                                                        {\r
-                                                               CChip chip8 = new CChip();\r
-                                                               chip8.n発声位置 = num6;\r
-                                                               chip8.nチャンネル番号 = 0x50;\r
-                                                               chip8.n整数値 = 36 * 36 - 1;\r
-                                                               this.listChip.Add( chip8 );\r
+                                                               CChip chip = new CChip();\r
+                                                               chip.n発声位置 = bar;\r
+                                                               chip.nチャンネル番号 = 0x50;     // 小節線\r
+                                                               chip.n整数値 = 36 * 36 - 1;\r
+                                                               this.listChip.Add( chip );\r
                                                        }\r
                                                        this.listChip.Sort();\r
                                                        int num7 = 0;\r
                                                        int num8 = 0;\r
-                                                       for( int num9 = 0; num9 < num5; num9 += 384 )\r
+                                                       for( int num9 = 0; num9 < nEndOfSong; num9 += 384 )\r
                                                        {\r
                                                                int num10 = 0;\r
                                                                while( ( num8 < this.listChip.Count ) && ( this.listChip[ num8 ].n発声位置 < ( num9 + 384 ) ) )\r
                                                                {\r
-                                                                       if( this.listChip[ num8 ].nチャンネル番号 == 0xc1 )\r
+                                                                       if( this.listChip[ num8 ].nチャンネル番号 == 0xc1 )              // 拍線シフト\r
                                                                        {\r
                                                                                num10 = this.listChip[ num8 ].n発声位置 - num9;\r
                                                                        }\r
@@ -2748,30 +2546,30 @@ namespace DTXMania
                                                                }\r
                                                                if( ( this.e種別 == E種別.BMS ) || ( this.e種別 == E種別.BME ) )\r
                                                                {\r
-                                                                       num4 = 1.0;\r
+                                                                       barlength = 1.0;\r
                                                                }\r
                                                                while( ( num7 < this.listChip.Count ) && ( this.listChip[ num7 ].n発声位置 <= num9 ) )\r
                                                                {\r
-                                                                       if( this.listChip[ num7 ].nチャンネル番号 == 2 )\r
+                                                                       if( this.listChip[ num7 ].nチャンネル番号 == 2 )         // bar length\r
                                                                        {\r
-                                                                               num4 = this.listChip[ num7 ].db実数値;\r
+                                                                               barlength = this.listChip[ num7 ].db実数値;\r
                                                                        }\r
                                                                        num7++;\r
                                                                }\r
                                                                for( int num11 = 0; num11 < 100; num11++ )\r
                                                                {\r
-                                                                       int num12 = (int) ( ( (double) ( 384 * num11 ) ) / ( 4.0 * num4 ) );\r
+                                                                       int num12 = (int) ( ( (double) ( 384 * num11 ) ) / ( 4.0 * barlength ) );\r
                                                                        if( ( num12 + num10 ) >= 384 )\r
                                                                        {\r
                                                                                break;\r
                                                                        }\r
                                                                        if( ( ( num12 + num10 ) % 384 ) != 0 )\r
                                                                        {\r
-                                                                               CChip chip9 = new CChip();\r
-                                                                               chip9.n発声位置 = ( num9 + num12 ) + num10;\r
-                                                                               chip9.nチャンネル番号 = 0x51;\r
-                                                                               chip9.n整数値 = 36 * 36 - 1;\r
-                                                                               this.listChip.Add( chip9 );\r
+                                                                               CChip chip = new CChip();\r
+                                                                               chip.n発声位置 = ( num9 + num12 ) + num10;\r
+                                                                               chip.nチャンネル番号 = 0x51;\r
+                                                                               chip.n整数値 = 36 * 36 - 1;\r
+                                                                               this.listChip.Add( chip );\r
                                                                        }\r
                                                                }\r
                                                        }\r
@@ -2806,81 +2604,81 @@ namespace DTXMania
                                                                }\r
                                                                startIndex++;\r
                                                        }\r
-                                                       if( ( ( this.listChip[ i ].nチャンネル番号 == 80 ) || ( this.listChip[ i ].nチャンネル番号 == 0x51 ) ) && ( this.listChip[ i ].n整数値 == 0x50f ) )\r
+                                                       if( ( ( this.listChip[ i ].nチャンネル番号 == 0x50 ) || ( this.listChip[ i ].nチャンネル番号 == 0x51 ) ) && ( this.listChip[ i ].n整数値 == (36 * 36 - 1) ) )\r
                                                        {\r
                                                                this.listChip[ i ].b可視 = flag;\r
                                                        }\r
                                                }\r
                                                double bpm = 120.0;\r
-                                               double num15 = 1.0;\r
-                                               int num16 = 0;\r
-                                               int num17 = 0;\r
+                                               double dbBarLength = 1.0;\r
+                                               int n発声位置 = 0;\r
+                                               int ms = 0;\r
                                                int nBar = 0;\r
-                                               foreach( CChip chip10 in this.listChip )\r
+                                               foreach( CChip chip in this.listChip )\r
                                                {\r
-                                                       chip10.n発声時刻ms = num17 + ( (int) ( ( ( 0x271 * ( chip10.n発声位置 - num16 ) ) * num15 ) / bpm ) );\r
-                                                       if( ( ( this.e種別 == E種別.BMS ) || ( this.e種別 == E種別.BME ) ) && ( ( num15 != 1.0 ) && ( ( chip10.n発声位置 / 384) != nBar ) ) )\r
+                                                       chip.n発声時刻ms = ms + ( (int) ( ( ( 0x271 * ( chip.n発声位置 - n発声位置 ) ) * dbBarLength ) / bpm ) );\r
+                                                       if( ( ( this.e種別 == E種別.BMS ) || ( this.e種別 == E種別.BME ) ) && ( ( dbBarLength != 1.0 ) && ( ( chip.n発声位置 / 384) != nBar ) ) )\r
                                                        {\r
-                                                               num16 = chip10.n発声位置;\r
-                                                               num17 = chip10.n発声時刻ms;\r
-                                                               num15 = 1.0;\r
+                                                               n発声位置 = chip.n発声位置;\r
+                                                               ms = chip.n発声時刻ms;\r
+                                                               dbBarLength = 1.0;\r
                                                        }\r
-                                                       nBar = chip10.n発声位置 / 384;\r
-                                                       num26 = chip10.nチャンネル番号;\r
-                                                       switch( num26 )\r
+                                                       nBar = chip.n発声位置 / 384;\r
+                                                       ch = chip.nチャンネル番号;\r
+                                                       switch( ch )\r
                                                        {\r
                                                                case 0x02:\r
                                                                        {\r
-                                                                               num16 = chip10.n発声位置;\r
-                                                                               num17 = chip10.n発声時刻ms;\r
-                                                                               num15 = chip10.db実数値;\r
+                                                                               n発声位置 = chip.n発声位置;\r
+                                                                               ms = chip.n発声時刻ms;\r
+                                                                               dbBarLength = chip.db実数値;\r
                                                                                continue;\r
                                                                        }\r
-                                                               case 0x03:\r
+                                                               case 0x03:      // BPM\r
                                                                        {\r
-                                                                               num16 = chip10.n発声位置;\r
-                                                                               num17 = chip10.n発声時刻ms;\r
-                                                                               bpm = this.BASEBPM + chip10.n整数値;\r
+                                                                               n発声位置 = chip.n発声位置;\r
+                                                                               ms = chip.n発声時刻ms;\r
+                                                                               bpm = this.BASEBPM + chip.n整数値;\r
                                                                                continue;\r
                                                                        }\r
-                                                               case 0x04:\r
-                                                               case 0x07:\r
-                                                               case 0x55:\r
-                                                               case 0x56:\r
-                                                               case 0x57:\r
-                                                               case 0x58:\r
-                                                               case 0x59:\r
-                                                               case 0x60:\r
+                                                               case 0x04:      // BGA (レイヤBGA1)\r
+                                                               case 0x07:      // レイヤBGA2\r
+                                                               case 0x55:      // レイヤBGA3\r
+                                                               case 0x56:      // レイヤBGA4\r
+                                                               case 0x57:      // レイヤBGA5\r
+                                                               case 0x58:      // レイヤBGA6\r
+                                                               case 0x59:      // レイヤBGA7\r
+                                                               case 0x60:      // レイヤBGA8\r
                                                                        break;\r
 \r
-                                                               case 0x05:\r
-                                                               case 0x06:\r
-                                                               case 0x5A:\r
-                                                               case 0x5b:\r
-                                                               case 0x5c:\r
-                                                               case 0x5d:\r
-                                                               case 0x5e:\r
-                                                               case 0x5f:\r
+                                                               case 0x05:      // Extended Object (非対応)\r
+                                                               case 0x06:      // Missアニメ (非対応)\r
+                                                               case 0x5A:      // 未定義\r
+                                                               case 0x5b:      // 未定義\r
+                                                               case 0x5c:      // 未定義\r
+                                                               case 0x5d:      // 未定義\r
+                                                               case 0x5e:      // 未定義\r
+                                                               case 0x5f:      // 未定義\r
                                                                        {\r
                                                                                continue;\r
                                                                        }\r
-                                                               case 8:\r
+                                                               case 0x08:      // 拡張BPM\r
                                                                        {\r
-                                                                               num16 = chip10.n発声位置;\r
-                                                                               num17 = chip10.n発声時刻ms;\r
-                                                                               if( this.listBPM.ContainsKey( chip10.n整数値・内部番号 ) )\r
+                                                                               n発声位置 = chip.n発声位置;\r
+                                                                               ms = chip.n発声時刻ms;\r
+                                                                               if( this.listBPM.ContainsKey( chip.n整数値・内部番号 ) )\r
                                                                                {\r
-                                                                                       bpm = ( ( this.listBPM[ chip10.n整数値・内部番号 ].n表記上の番号 == 0 ) ? 0.0 : this.BASEBPM ) + this.listBPM[ chip10.n整数値・内部番号 ].dbBPM値;\r
+                                                                                       bpm = ( ( this.listBPM[ chip.n整数値・内部番号 ].n表記上の番号 == 0 ) ? 0.0 : this.BASEBPM ) + this.listBPM[ chip.n整数値・内部番号 ].dbBPM値;\r
                                                                                }\r
                                                                                continue;\r
                                                                        }\r
-                                                               case 0x54:\r
+                                                               case 0x54:      // 動画再生\r
                                                                        {\r
-                                                                               if( this.listAVIPAN.ContainsKey( chip10.n整数値 ) )\r
+                                                                               if( this.listAVIPAN.ContainsKey( chip.n整数値 ) )\r
                                                                                {\r
-                                                                                       int num21 = num17 + ( (int) ( ( ( 0x271 * ( chip10.n発声位置 - num16 ) ) * num15 ) / bpm ) );\r
-                                                                                       int num22 = num17 + ( (int) ( ( ( 0x271 * ( ( chip10.n発声位置 + this.listAVIPAN[ chip10.n整数値 ].n移動時間ct ) - num16 ) ) * num15 ) / bpm ) );\r
-                                                                                       chip10.n総移動時間 = num22 - num21;\r
+                                                                                       int num21 = ms + ( (int) ( ( ( 0x271 * ( chip.n発声位置 - n発声位置 ) ) * dbBarLength ) / bpm ) );\r
+                                                                                       int num22 = ms + ( (int) ( ( ( 0x271 * ( ( chip.n発声位置 + this.listAVIPAN[ chip.n整数値 ].n移動時間ct ) - n発声位置 ) ) * dbBarLength ) / bpm ) );\r
+                                                                                       chip.n総移動時間 = num22 - num21;\r
                                                                                }\r
                                                                                continue;\r
                                                                        }\r
@@ -2889,18 +2687,18 @@ namespace DTXMania
                                                                                continue;\r
                                                                        }\r
                                                        }\r
-                                                       if( this.listBGAPAN.ContainsKey( chip10.n整数値 ) )\r
+                                                       if( this.listBGAPAN.ContainsKey( chip.n整数値 ) )\r
                                                        {\r
-                                                               int num19 = num17 + ( (int) ( ( ( 0x271 * ( chip10.n発声位置 - num16 ) ) * num15 ) / bpm ) );\r
-                                                               int num20 = num17 + ( (int) ( ( ( 0x271 * ( ( chip10.n発声位置 + this.listBGAPAN[ chip10.n整数値 ].n移動時間ct ) - num16 ) ) * num15 ) / bpm ) );\r
-                                                               chip10.n総移動時間 = num20 - num19;\r
+                                                               int num19 = ms + ( (int) ( ( ( 0x271 * ( chip.n発声位置 - n発声位置 ) ) * dbBarLength ) / bpm ) );\r
+                                                               int num20 = ms + ( (int) ( ( ( 0x271 * ( ( chip.n発声位置 + this.listBGAPAN[ chip.n整数値 ].n移動時間ct ) - n発声位置 ) ) * dbBarLength ) / bpm ) );\r
+                                                               chip.n総移動時間 = num20 - num19;\r
                                                        }\r
                                                }\r
                                                if( this.db再生速度 > 0.0 )\r
                                                {\r
-                                                       foreach( CChip chip11 in this.listChip )\r
+                                                       foreach( CChip chip in this.listChip )\r
                                                        {\r
-                                                               chip11.n発声時刻ms = (int) ( ( (double) chip11.n発声時刻ms ) / this.db再生速度 );\r
+                                                               chip.n発声時刻ms = (int) ( ( (double) chip.n発声時刻ms ) / this.db再生速度 );\r
                                                        }\r
                                                }\r
                                                this.nBGMAdjust = 0;\r
@@ -2909,27 +2707,27 @@ namespace DTXMania
                                                {\r
                                                        this.n可視チップ数[ n ] = 0;\r
                                                }\r
-                                               foreach( CChip chip12 in this.listChip )\r
+                                               foreach( CChip chip in this.listChip )\r
                                                {\r
-                                                       int num24 = chip12.nチャンネル番号;\r
-                                                       if( ( 0x11 <= num24 ) && ( num24 <= 0x1a ) )\r
+                                                       int c = chip.nチャンネル番号;\r
+                                                       if( ( 0x11 <= c ) && ( c <= 0x1a ) )\r
                                                        {\r
-                                                               this.n可視チップ数[ num24 - 0x11 ]++;\r
+                                                               this.n可視チップ数[ c - 0x11 ]++;\r
                                                        }\r
-                                                       if( ( 0x20 <= num24 ) && ( num24 <= 0x27 ) )\r
+                                                       if( ( 0x20 <= c ) && ( c <= 0x27 ) )\r
                                                        {\r
                                                                this.n可視チップ数.Guitar++;\r
                                                        }\r
-                                                       if( ( 0xA0 <= num24 ) && ( num24 <= 0xa7 ) )\r
+                                                       if( ( 0xA0 <= c ) && ( c <= 0xa7 ) )\r
                                                        {\r
                                                                this.n可視チップ数.Bass++;\r
                                                        }\r
                                                }\r
-                                               foreach( CChip chip13 in this.listChip )\r
+                                               foreach( CChip chip in this.listChip )\r
                                                {\r
-                                                       if( ( chip13.bWAVを使うチャンネルである && this.listWAV.ContainsKey( chip13.n整数値・内部番号 ) ) && !this.listWAV[ chip13.n整数値・内部番号 ].listこのWAVを使用するチャンネル番号の集合.Contains( chip13.nチャンネル番号 ) )\r
+                                                       if( ( chip.bWAVを使うチャンネルである && this.listWAV.ContainsKey( chip.n整数値・内部番号 ) ) && !this.listWAV[ chip.n整数値・内部番号 ].listこのWAVを使用するチャンネル番号の集合.Contains( chip.nチャンネル番号 ) )\r
                                                        {\r
-                                                               this.listWAV[ chip13.n整数値・内部番号 ].listこのWAVを使用するチャンネル番号の集合.Add( chip13.nチャンネル番号 );\r
+                                                               this.listWAV[ chip.n整数値・内部番号 ].listこのWAVを使用するチャンネル番号の集合.Add( chip.nチャンネル番号 );\r
                                                        }\r
                                                }\r
                                                byte[] buffer = null;\r
@@ -2948,12 +2746,12 @@ namespace DTXMania
                                                if( buffer != null )\r
                                                {\r
                                                        byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash( buffer );\r
-                                                       StringBuilder builder4 = new StringBuilder();\r
-                                                       foreach( byte num25 in buffer2 )\r
+                                                       StringBuilder sb = new StringBuilder();\r
+                                                       foreach( byte b in buffer2 )\r
                                                        {\r
-                                                               builder4.Append( num25.ToString( "x2" ) );\r
+                                                               sb.Append( b.ToString( "x2" ) );\r
                                                        }\r
-                                                       this.strハッシュofDTXファイル = builder4.ToString();\r
+                                                       this.strハッシュofDTXファイル = sb.ToString();\r
                                                }\r
                                                else\r
                                                {\r
@@ -2962,9 +2760,9 @@ namespace DTXMania
                                                #region [ bLogDTX詳細ログ出力 ]\r
                                                if ( CDTXMania.ConfigIni.bLogDTX詳細ログ出力 )\r
                                                {\r
-                                                       foreach( CWAV cwav3 in this.listWAV.Values )\r
+                                                       foreach( CWAV cwav in this.listWAV.Values )\r
                                                        {\r
-                                                               Trace.TraceInformation( cwav3.ToString() );\r
+                                                               Trace.TraceInformation( cwav.ToString() );\r
                                                        }\r
                                                        foreach( CAVI cavi in this.listAVI.Values )\r
                                                        {\r
@@ -2994,9 +2792,9 @@ namespace DTXMania
                                                        {\r
                                                                Trace.TraceInformation( cbpm3.ToString() );\r
                                                        }\r
-                                                       foreach( CChip chip14 in this.listChip )\r
+                                                       foreach( CChip chip in this.listChip )\r
                                                        {\r
-                                                               Trace.TraceInformation( chip14.ToString() );\r
+                                                               Trace.TraceInformation( chip.ToString() );\r
                                                        }\r
                                                }\r
                                                #endregion\r
@@ -4938,6 +4736,7 @@ namespace DTXMania
                                n音量 = this.n無限管理VOL[ zz ],\r
                                strファイル名 = strパラメータ,\r
                                strコメント文 = strコメント,\r
+                               bIsOnBGMLane= false\r
                        };\r
 \r
                        #region [ WAVリストに {内部番号, wav} の組を登録。]\r
index 87ed2b1..6006bab 100644 (file)
@@ -195,6 +195,34 @@ namespace DTXMania
                                "Turn ON to put debug log to\n DTXManiaLog.txt\nTo take it effective, you need to\n re-open DTXMania." );\r
                        this.list項目リスト.Add( this.iLogOutputLog );\r
 \r
+                       this.iSystemWAVLoadAcceleration = new CItemToggle( "WAVLoadAccel.", CDTXMania.ConfigIni.bLoadWAVInParallel,\r
+                               "WAV読込高速化:\n" +\r
+                               "マルチスレッドでWAV読込を実行し\n" +\r
+                               "曲データの読込を高速化します。\n" +\r
+                               "ただし一部サウンドが消えたり、\n" +\r
+                               "強制終了したりすることがあるため、\n" +\r
+                               "基本的にはOFFにして下さい。",\r
+                               "WAV load acceleration:\n" +\r
+                               "To accelerate WAV file loading,\n" +\r
+                               " multithread technology is used.\n" +\r
+                               "But it is too dangerous\n" +\r
+                               " * Some sound may disappear\n" +\r
+                               " * DTXMania suddely shutdown" );\r
+                       this.list項目リスト.Add( this.iSystemWAVLoadAcceleration );\r
+                       this.iSystemBMPLoadAcceleration = new CItemToggle( "BMPLoadAccel.", CDTXMania.ConfigIni.bLoadBMPInParallel,\r
+                               "BMP読込高速化:\n" +\r
+                               "マルチスレッドでBMP読込を実行し\n" +\r
+                               "曲データの読込を高速化します。\n" +\r
+                               "ただし一部BMPが消えることがある\n" +\r
+                               "ため、基本的にはOFFにして下さい。",\r
+                               "BMP load acceleration:\n" +\r
+                               "To accelerate WAV file loading,\n" +\r
+                               " multithread technology is used.\n" +\r
+                               "But it may not be safe that some\n" +\r
+                               " BMP may disappeared." );\r
+                       this.list項目リスト.Add( this.iSystemBMPLoadAcceleration );\r
+\r
+       \r
                        this.iSystemGoToKeyAssign = new CItemBase( "System Keys", CItemBase.Eパネル種別.通常,\r
                        "システムのキー入力に関する項目を設\n定します。",\r
                        "Settings for the system key/pad inputs." );\r
@@ -1594,6 +1622,8 @@ namespace DTXMania
                private CItemToggle iSystemAutoResultCapture;           // #25399 2011.6.9 yyagi\r
                private CItemToggle iSystemBufferedInput;\r
                private CItemInteger iSystemRisky;                                      // #23559 2011.7.27 yyagi\r
+               private CItemToggle iSystemWAVLoadAcceleration;         // #28021 2012.4.8 yyagi\r
+               private CItemToggle iSystemBMPLoadAcceleration;         // #28021 2012.4.8 yyagi\r
 \r
                private List<CItemBase> list項目リスト;\r
                private long nスクロール用タイマ値;\r
@@ -1751,6 +1781,9 @@ namespace DTXMania
                        CDTXMania.ConfigIni.bIsAutoResultCapture = this.iSystemAutoResultCapture.bON;           // #25399 2011.6.9 yyagi\r
 \r
                        CDTXMania.ConfigIni.nRisky = this.iSystemRisky.n現在の値;                                           // #23559 2911.7.27 yyagi\r
+                       CDTXMania.ConfigIni.bLoadWAVInParallel = this.iSystemWAVLoadAcceleration.bON;                   // #28021 2012.4.8 yyagi\r
+                       CDTXMania.ConfigIni.bLoadBMPInParallel = this.iSystemBMPLoadAcceleration.bON;                   // #28021 2012.4.8 yyagi\r
+\r
                }\r
                private void tConfigIniへ記録する・Bass()\r
                {\r
index ee96e48..1752d44 100644 (file)
@@ -222,6 +222,8 @@ namespace DTXMania
 \r
                                case CStage.Eフェーズ.NOWLOADING_DTXファイルを読み込む:\r
                                        {\r
+                                               DateTime timeBeginLoad = DateTime.Now;\r
+                                               TimeSpan span;\r
                                                str = null;\r
                                                if( !CDTXMania.bコンパクトモード )\r
                                                        str = CDTXMania.stage選曲.r確定されたスコア.ファイル情報.ファイルの絶対パス;\r
@@ -240,12 +242,19 @@ namespace DTXMania
                                                Trace.TraceInformation( "FILE: {0}", new object[] { CDTXMania.DTX.strファイル名の絶対パス } );\r
                                                Trace.TraceInformation( "---------------------------" );\r
 \r
+                                               span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               Trace.TraceInformation( "DTX読込所要時間:     {0}", span.ToString() );\r
+\r
                                                if( CDTXMania.bコンパクトモード )\r
                                                        CDTXMania.DTX.MIDIレベル = 1;\r
                                                else\r
                                                        CDTXMania.DTX.MIDIレベル = ( CDTXMania.stage選曲.r確定された曲.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) ? CDTXMania.stage選曲.n現在選択中の曲の難易度 : 0;\r
 \r
+                                               DateTime timeBeginLoadWAV = DateTime.Now;\r
                                                CDTXMania.DTX.tWAVの読み込み();\r
+                                               span = (TimeSpan) ( DateTime.Now - timeBeginLoadWAV );\r
+                                               Trace.TraceInformation( "WAV読込所要時間:     {0}", span.ToString() );\r
+                                               \r
                                                CDTXMania.DTX.tギターとベースのランダム化( E楽器パート.GUITAR, CDTXMania.ConfigIni.eRandom.Guitar );\r
                                                CDTXMania.DTX.tギターとベースのランダム化( E楽器パート.BASS, CDTXMania.ConfigIni.eRandom.Bass );\r
 \r
@@ -254,11 +263,17 @@ namespace DTXMania
                                                else\r
                                                        CDTXMania.stage演奏ドラム画面.On活性化();\r
 \r
-                                               if( CDTXMania.ConfigIni.bBGA有効 )\r
+                                               DateTime timeBeginLoadBMPAVI = DateTime.Now;\r
+                                               if ( CDTXMania.ConfigIni.bBGA有効 )\r
                                                        CDTXMania.DTX.tBMP_BMPTEXの読み込み();\r
 \r
-                                               if( CDTXMania.ConfigIni.bAVI有効 )\r
+                                               if ( CDTXMania.ConfigIni.bAVI有効 )\r
                                                        CDTXMania.DTX.tAVIの読み込み();\r
+                                               span = (TimeSpan) ( DateTime.Now - timeBeginLoadBMPAVI );\r
+                                               Trace.TraceInformation( "BMP/AVI読込所要時間: {0}", span.ToString() );\r
+\r
+                                               span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               Trace.TraceInformation( "総読込時間:          {0}", span.ToString() ); \r
 \r
                                                CDTXMania.Timer.t更新();\r
                                                base.eフェーズID = CStage.Eフェーズ.NOWLOADING_システムサウンドBGMの完了を待つ;\r
index 24bb997..1be1094 100644 (file)
@@ -894,6 +894,8 @@ namespace DTXMania
                        public E打ち分け時の再生の優先順位 eHitSoundPriorityHH = E打ち分け時の再生の優先順位.ChipがPadより優先;\r
                }\r
                public CBackupOf1BD BackupOf1BD = null;\r
+               public bool bLoadWAVInParallel;                                 // #28021 2012.4.8 yyagi マルチスレッドでのWAV読み込みON/OFF\r
+               public bool bLoadBMPInParallel;                                 // #28021 2012.4.8 yyagi マルチスレッドでのBMP読み込みON/OFF\r
 \r
 \r
                // コンストラクタ\r
@@ -1012,6 +1014,8 @@ namespace DTXMania
                        this.bIsSwappedGuitarBass = false;                      // #24063 2011.1.16 yyagi ギターとベースの切り替え\r
                        this.bIsAllowedDoubleClickFullscreen = true;    // #26752 2011.11.26 ダブルクリックでのフルスクリーンモード移行を許可\r
                        this.eBDGroup = EBDGroup.打ち分ける;               // #27029 2012.1.4 from HHPedalとBassPedalのグルーピング\r
+                       this.bLoadWAVInParallel = false;                        // #28021 2012.4.8 yyagi マルチスレッドでのWAV読み込みON/OFF\r
+                       this.bLoadBMPInParallel = false;                        // #28021 2012.4.8 yyagi マルチスレッドでのBMP読み込みON/OFF\r
                }\r
                public CConfigIni( string iniファイル名 )\r
                        : this()\r
@@ -1253,6 +1257,12 @@ namespace DTXMania
                        sw.WriteLine( "CYVelocityMin={0}", this.nVelocityMin.CY );                                              //\r
                        sw.WriteLine( "RDVelocityMin={0}", this.nVelocityMin.RD );                                              //\r
                        sw.WriteLine();                                                                                                                                 //\r
+                       sw.WriteLine();\r
+                       sw.WriteLine( "; WAV, BMPの読み込み高速化(0=OFF, 1=ON)" );                                              // #23580 2011.1.3 yyagi\r
+                       sw.WriteLine( "; Whether you'd like to accelerate loading or not. WAV one is too risky." );     //\r
+                       sw.WriteLine( "WAVLoadAcceleration={0}", this.bLoadWAVInParallel ? 1 : 0 );             //\r
+                       sw.WriteLine( "BMPLoadAcceleration={0}", this.bLoadBMPInParallel ? 1 : 0 );             //\r
+                       sw.WriteLine();\r
                        sw.WriteLine( ";-------------------" );\r
                        #endregion\r
                        #region [ Log ]\r
@@ -1937,6 +1947,14 @@ namespace DTXMania
                                                                                        {\r
                                                                                                this.nVelocityMin.RD = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 127, this.nVelocityMin.RD );\r
                                                                                        }\r
+                                                                                       else if( str3.Equals( "WAVLoadAcceleration" ) )         // #28021 2012.4.8 yyagi\r
+                                                                                       {\r
+                                                                                               this.bLoadWAVInParallel = C変換.bONorOFF( str4[ 0 ] );\r
+                                                                                       }\r
+                                                                                       else if( str3.Equals( "BMPLoadAcceleration" ) )         // #28021 2012.4.8 yyagi\r
+                                                                                       {\r
+                                                                                               this.bLoadBMPInParallel = C変換.bONorOFF( str4[ 0 ] );\r
+                                                                                       }\r
                                                                                        continue;\r
                                                                                }\r
                                                                        //-----------------------------\r
index d636a87..f5f204c 100644 (file)
@@ -1261,7 +1261,7 @@ for (int i = 0; i < 3; i++) {
                        }\r
                        catch( CTextureCreateFailedException )\r
                        {\r
-                               Trace.TraceError( "テクスチャの生成に失敗しました。({0})", new object[] { fileName } );\r
+                               Trace.TraceError( "テクスチャの生成に失敗しました。({0})", fileName );\r
                                return null;\r
                        }\r
                }\r
@@ -1269,8 +1269,29 @@ for (int i = 0; i < 3; i++) {
                {\r
                        CDTXMania.t安全にDisposeする( ref tx );\r
                }\r
-               \r
-               /// <summary>プロパティ、インデクサには ref は使用できないので注意。</summary>\r
+\r
+               public static CTexture tテクスチャの生成( byte[] txData )\r
+               {\r
+                       return tテクスチャの生成( txData, false );\r
+               }\r
+               public static CTexture tテクスチャの生成( byte[] txData, bool b黒を透過する )\r
+               {\r
+                       if ( app == null )\r
+                       {\r
+                               return null;\r
+                       }\r
+                       try\r
+                       {\r
+                               return new CTexture( app.Device, txData, TextureFormat, b黒を透過する );\r
+                       }\r
+                       catch ( CTextureCreateFailedException )\r
+                       {\r
+                               Trace.TraceError( "テクスチャの生成に失敗しました。(txData)" );\r
+                               return null;\r
+                       }\r
+               }\r
+\r
+       /// <summary>プロパティ、インデクサには ref は使用できないので注意。</summary>\r
                public static void t安全にDisposeする<T>( ref T obj )\r
                {\r
                        if( obj == null )\r
index a29c8fd..16428d7 100644 (file)
@@ -38,6 +38,7 @@
     </DocumentationFile>\r
     <UseVSHostingProcess>false</UseVSHostingProcess>\r
     <NoWarn>0219</NoWarn>\r
+    <Optimize>true</Optimize>\r
   </PropertyGroup>\r
   <ItemGroup>\r
     <Reference Include="SlimDXc_net20x86_Jun2010, Version=1002.0.10.43, Culture=neutral, PublicKeyToken=53d0e4ef1f1579f5, processorArchitecture=x86">\r
@@ -51,6 +52,7 @@
     <Reference Include="System.Xml" />\r
   </ItemGroup>\r
   <ItemGroup>\r
+    <Compile Include="コード\00.共通\CCpuCores.cs" />\r
     <Compile Include="コード\01.フレームワーク\Core\GameWindowSize.cs" />\r
     <Compile Include="コード\01.フレームワーク\Core\Game.cs" />\r
     <Compile Include="コード\01.フレームワーク\Core\GameClock.cs" />\r
index 5b4ff10..0090651 100644 (file)
@@ -10,8 +10,8 @@ using System.Resources;
 [assembly: AssemblyDescription("")]\r
 [assembly: AssemblyConfiguration("")]\r
 [assembly: AssemblyCompany("")]\r
-[assembly: AssemblyProduct("FDKライブラリ ver.18")]\r
-[assembly: AssemblyCopyright("Copyright(C) 2000-2011 DTXMania Group")]\r
+[assembly: AssemblyProduct( "FDKライブラリ ver.20" )]\r
+[assembly: AssemblyCopyright( "Copyright(C) 2000-2012 DTXMania Group" )]\r
 [assembly: AssemblyTrademark("")]\r
 [assembly: AssemblyCulture("")]\r
 //[assembly: AssemblyKeyName( "FROMsCspContainer" )]\r
@@ -34,6 +34,6 @@ using System.Resources;
 // すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \r
 // 既定値にすることができます:\r
 // [assembly: AssemblyVersion("1.0.*")]\r
-[assembly: AssemblyVersion( "19.0.0.0" )]\r
-[assembly: AssemblyFileVersion( "19.0.0.0" )]\r
+[assembly: AssemblyVersion( "20.0.0.0" )]\r
+[assembly: AssemblyFileVersion( "20.0.0.0" )]\r
 [assembly: NeutralResourcesLanguageAttribute("ja-JP")]\r
diff --git a/FDK17プロジェクト/コード/00.共通/CCpuCores.cs b/FDK17プロジェクト/コード/00.共通/CCpuCores.cs
new file mode 100644 (file)
index 0000000..65d9346
--- /dev/null
@@ -0,0 +1,26 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+using System.Runtime.InteropServices;\r
+\r
+namespace FDK\r
+{\r
+       public static class CpuCores\r
+       {\r
+               [DllImport("kernel32")]\r
+               public static extern void GetSystemInfo(ref SYSTEM_INFO ptmpsi); \r
+               [StructLayout(LayoutKind.Sequential)]\r
+               public struct SYSTEM_INFO {\r
+                       public uint dwOemId;\r
+                       public uint dwPageSize;\r
+                       public uint lpMinimumApplicationAddress;\r
+                       public uint lpMaximumApplicationAddress;\r
+                       public uint dwActiveProcessorMask;\r
+                       public uint dwNumberOfProcessors;\r
+                       public uint dwProcessorType;\r
+                       public uint dwAllocationGranularity;\r
+                       public uint dwProcessorLevel;\r
+                       public uint dwProcessorRevision;\r
+               }\r
+       }\r
+}\r
index 8d75e69..18cb668 100644 (file)
@@ -237,17 +237,23 @@ namespace FDK
                        return clone;\r
                }\r
 \r
-               public int tデコード後のサイズを調べる( string strファイル名, out int _nHandle )\r
+               public int tデコード後のサイズを調べる( string strファイル名, out int _nHandle, ref int errcode )\r
                {\r
 //Trace.TraceInformation("tデコード後のサイズを調べる、を開始。");\r
                        _nHandle = -1;\r
 \r
+                       if ( !File.Exists( strファイル名 ) )\r
+                       {\r
+                               errcode = -10;\r
+                               return -10;\r
+                       }\r
                        #region [ #24416 2011.2.15 yyagi; to avoid application error in case filesize==0 ]\r
                        FileInfo fi = new FileInfo( strファイル名 );\r
                        long filesize = fi.Length;\r
                        if ( filesize <= 0 )\r
                        {\r
-                               return -1;\r
+                               errcode = -10;\r
+                               return -10;\r
                        }\r
                        fi = null;\r
                        #endregion\r
@@ -256,6 +262,7 @@ namespace FDK
                        int nHandle = this.Open( strファイル名 );\r
                        if( nHandle < 0 )\r
                        {\r
+                               errcode = -1;\r
                                return -1;\r
                        }\r
 //                     Trace.TraceInformation( "Open(): Exit." );\r
@@ -265,6 +272,7 @@ namespace FDK
                        if ( this.GetFormat( nHandle, ref wfx ) < 0 )\r
                        {\r
                                this.Close( nHandle );\r
+                               errcode = -2;\r
                                return -2;\r
                        }\r
 //                     Trace.TraceInformation( "GetFormat(): Exit." );\r
@@ -273,11 +281,13 @@ namespace FDK
                        if (this.nTotalPCMSize == 0)\r
                        {\r
                                this.Close( nHandle );\r
+                               errcode = -3;\r
                                return -3;\r
                        }\r
 //                     Trace.TraceInformation( "GetTotalPCMSize(): Exit." );\r
                        //this.Close( nHandle );        // 2011.1.2 yyagi ここでClose()しないで、次のオンメモリ/ストリーム読み出しの時に再利用して読み込みを高速化\r
                        _nHandle = nHandle;\r
+                       errcode = 0;\r
                        return (int) this.nTotalPCMSize;\r
                }\r
                public void tオンメモリ方式で作成する( SlimDX.DirectSound.DirectSound Device, string strファイル名, int _nHandle )\r
@@ -625,6 +635,7 @@ namespace FDK
                private int n現在書き込み許可待ちのバッファ番号;\r
                private SoundBuffer _Buffer;\r
                private uint nTotalPCMSize = 0;\r
+               private static object lockOggGetFormat = new object();\r
 \r
                private void tストリーム再生位置リセット()\r
                {\r
index 37b2a95..07493ec 100644 (file)
@@ -98,15 +98,27 @@ namespace FDK
                        if( string.IsNullOrEmpty( strファイル名 ) || !File.Exists( strファイル名 ) )\r
                                throw new ArgumentException( "ファイル名が無効です。" );\r
 \r
-                       CSound item = null;\r
-//                     if( ( ( ( item = this.tネイティブOggVorbisの場合( strファイル名 ) ) == null ) && ( ( item = this.tネイティブXAの場合( strファイル名 ) ) == null ) ) && ( ( ( item = this.tネイティブmp3の場合( strファイル名 ) ) == null ) && ( ( item = this.tRIFF_WAVEの場合( strファイル名 ) ) == null ) ) )\r
-                       if ( (item = this.tCheckAndDecode(strファイル名)) == null)\r
-                               throw new Exception( "OggVorbis, mp3, XA, RIFF ACM のいずれでもデコードに失敗しました。" );\r
-\r
-                       item.setDevice( ref this.Device );\r
-                       tサウンドを登録する( item );\r
+                       CSound csound = null;\r
+                       int errcode = 0;\r
+                       if ( ( csound = this.tCheckAndDecode( strファイル名, ref errcode ) ) == null )\r
+                       {\r
+                               if ( errcode == -10 )\r
+                               {\r
+                                       throw new ArgumentException( "ファイルが見つからないか、ファイルが0byteです。" );\r
+                               }\r
+                               else if ( errcode >= 0 )\r
+                               {\r
+                                       throw new AccessViolationException( "デコードで異常が発生しました。" );\r
+                               }\r
+                               else\r
+                               {\r
+                                       throw new Exception( "OggVorbis, mp3, XA, RIFF ACM のいずれでもデコードに失敗しました。" );\r
+                               }\r
+                       }\r
+                       csound.setDevice( ref this.Device );\r
+                       tサウンドを登録する( csound );\r
 \r
-                       return item;\r
+                       return csound;\r
                }\r
                public void tサウンドを登録する( CSound sound )\r
                {\r
@@ -178,28 +190,33 @@ namespace FDK
                private List<CSound> listSound = new List<CSound>();\r
 \r
 \r
-               private CSound tCheckAndDecode(string strFilename)\r
+               private CSound tCheckAndDecode(string strFilename, ref int errcode )\r
                {\r
                        int nDecodedPCMsize;\r
                        int nHandle;\r
 \r
                        CSound csound = new CSoundOggVorbis();\r
-                       nDecodedPCMsize = csound.tデコード後のサイズを調べる( strFilename, out nHandle );\r
+                       nDecodedPCMsize = csound.tデコード後のサイズを調べる( strFilename, out nHandle, ref errcode );\r
                        if ( nDecodedPCMsize < 0 )\r
                        {\r
                                csound.Dispose();\r
+                               if ( errcode == -10 )\r
+                               {\r
+                                       return null;\r
+                               }\r
+       \r
                                csound = new CSoundXA();\r
-                               nDecodedPCMsize = csound.tデコード後のサイズを調べる( strFilename, out nHandle );\r
+                               nDecodedPCMsize = csound.tデコード後のサイズを調べる( strFilename, out nHandle, ref errcode );\r
                                if ( nDecodedPCMsize < 0 )\r
                                {\r
                                        csound.Dispose();\r
                                        csound = new CSoundRiffWave();\r
-                                       nDecodedPCMsize = csound.tデコード後のサイズを調べる( strFilename, out nHandle );\r
+                                       nDecodedPCMsize = csound.tデコード後のサイズを調べる( strFilename, out nHandle, ref errcode );\r
                                        if ( nDecodedPCMsize < 0 )\r
                                        {\r
                                                csound.Dispose();\r
                                                csound = new CSoundMp3();\r
-                                               nDecodedPCMsize = csound.tデコード後のサイズを調べる(strFilename, out nHandle);\r
+                                               nDecodedPCMsize = csound.tデコード後のサイズを調べる( strFilename, out nHandle, ref errcode );\r
                                                if ( nDecodedPCMsize < 0 )\r
                                                {\r
                                                        csound.Dispose();\r
@@ -208,13 +225,13 @@ namespace FDK
                                        }\r
                                }\r
                        }\r
-                       if (nDecodedPCMsize < n最大オンメモリ可能サイズ)\r
+                       if ( nDecodedPCMsize < n最大オンメモリ可能サイズ )\r
                        {\r
-                               csound.tオンメモリ方式で作成する(this.Device, strFilename, nHandle);\r
+                               csound.tオンメモリ方式で作成する( this.Device, strFilename, nHandle );\r
                        }\r
                        else\r
                        {\r
-                               csound.tストリーム方式で作成する(this.Device, strFilename, nHandle);\r
+                               csound.tストリーム方式で作成する( this.Device, strFilename, nHandle );\r
                        }\r
                        return csound;\r
                }\r
index fd64561..2e29ccd 100644 (file)
@@ -75,6 +75,7 @@ namespace FDK
                        this.b加算合成 = false;\r
                        this.fZ軸中心回転 = 0f;\r
                        this.vc拡大縮小倍率 = new Vector3( 1f, 1f, 1f );\r
+                       this._txData = null;\r
                }\r
                \r
                /// <summary>\r
@@ -143,6 +144,11 @@ namespace FDK
                        : this( device, strファイル名, format, b黒を透過する, Pool.Managed )\r
                {\r
                }\r
+               public CTexture( Device device, byte[] txData, Format format, bool b黒を透過する )\r
+                       : this( device, txData, format, b黒を透過する, Pool.Managed )\r
+               {\r
+               }\r
+               \r
                \r
                /// <summary>\r
                /// <para>空のテクスチャを作成する。</para>\r
@@ -162,7 +168,8 @@ namespace FDK
                        : this( device, n幅, n高さ, format, pool, Usage.None )\r
                {\r
                }\r
-               \r
+\r
+               static object lockobj = new object();\r
                public CTexture( Device device, int n幅, int n高さ, Format format, Pool pool, Usage usage )\r
                        : this()\r
                {\r
@@ -186,7 +193,10 @@ namespace FDK
                                                pool = poolvar;\r
 #endif\r
                                                // 中で更にメモリ読み込みし直していて無駄なので、Streamを使うのは止めたいところ\r
-                                               this.texture = Texture.FromStream( device, stream, n幅, n高さ, 1, usage, format, pool, Filter.Point, Filter.None, 0 );\r
+                                               lock ( lockobj )\r
+                                               {\r
+                                                       this.texture = Texture.FromStream( device, stream, n幅, n高さ, 1, usage, format, pool, Filter.Point, Filter.None, 0 );\r
+                                               }\r
                                        }\r
                                }\r
                        }\r
@@ -213,30 +223,46 @@ namespace FDK
                public CTexture( Device device, string strファイル名, Format format, bool b黒を透過する, Pool pool )\r
                        : this()\r
                {\r
+                       MakeTexture( device, strファイル名, format, b黒を透過する, pool );\r
+               }\r
+               public void MakeTexture( Device device, string strファイル名, Format format, bool b黒を透過する, Pool pool )\r
+               {\r
+                       if ( !File.Exists( strファイル名 ) )               // #27122 2012.1.13 from: ImageInformation では FileNotFound 例外は返ってこないので、ここで自分でチェックする。わかりやすいログのために。\r
+                               throw new FileNotFoundException( string.Format( "ファイルが存在しません。\n[{0}]", strファイル名 ) );\r
+\r
+                       _txData = File.ReadAllBytes( strファイル名 );\r
+                       MakeTexture( device, _txData, format, b黒を透過する, pool );\r
+               }\r
+               public CTexture( Device device, byte[] txData, Format format, bool b黒を透過する, Pool pool )\r
+                       : this()\r
+               {\r
+                       MakeTexture( device, txData, format, b黒を透過する, pool );\r
+               }\r
+               public void MakeTexture( Device device, byte[] txData, Format format, bool b黒を透過する, Pool pool )\r
+               {\r
                        try\r
                        {\r
-                               if( !File.Exists( strファイル名 ) )                // #27122 2012.1.13 from: ImageInformation では FileNotFound 例外は返ってこないので、ここで自分でチェックする。わかりやすいログのために。\r
-                                       throw new FileNotFoundException( string.Format( "ファイルが存在しません。\n[{0}]", strファイル名 ) );\r
-\r
-                               var information = ImageInformation.FromFile( strファイル名 );\r
-                               \r
+                               var information = ImageInformation.FromMemory( txData );\r
                                this.sz画像サイズ = new Size( information.Width, information.Height );\r
-                               this.szテクスチャサイズ = this.t指定されたサイズを超えない最適なテクスチャサイズを返す( device, this.sz画像サイズ );\r
                                this.rc全画像 = new Rectangle( 0, 0, this.sz画像サイズ.Width, this.sz画像サイズ.Height );\r
+                               int colorKey = ( b黒を透過する ) ? unchecked( (int) 0xFF000000 ) : 0;\r
+                               this.szテクスチャサイズ = this.t指定されたサイズを超えない最適なテクスチャサイズを返す( device, this.sz画像サイズ );\r
 #if TEST_Direct3D9Ex\r
                                pool = poolvar;\r
 #endif\r
-                               int colorKey = ( b黒を透過する ) ? unchecked( (int) 0xFF000000 ) : 0;\r
-                               this.texture = Texture.FromFile( device, strファイル名, this.sz画像サイズ.Width, this.sz画像サイズ.Height, 1, Usage.None, format, pool, Filter.Point, Filter.None, colorKey );\r
+//                             lock ( lockobj )\r
+//                             {\r
+                               this.texture = Texture.FromMemory( device, txData, this.sz画像サイズ.Width, this.sz画像サイズ.Height, 1, Usage.None, format, pool, Filter.Point, Filter.None, colorKey );\r
+//                             }\r
                        }\r
                        catch\r
                        {\r
                                this.Dispose();\r
-                               throw new CTextureCreateFailedException( string.Format( "テクスチャの生成に失敗しました。\n{0}", strファイル名 ) );\r
+                               // throw new CTextureCreateFailedException( string.Format( "テクスチャの生成に失敗しました。\n{0}", strファイル名 ) );\r
+                               throw new CTextureCreateFailedException( string.Format( "テクスチャの生成に失敗しました。\n") );\r
                        }\r
                }\r
 \r
-\r
                // メソッド\r
 \r
                /// <summary>\r
@@ -480,6 +506,7 @@ namespace FDK
 #else\r
                        Pool.Managed;\r
 #endif\r
+               byte[] _txData;\r
 \r
                private void tレンダリングステートの設定( Device device )\r
                {\r
index fb8e644..5227a4b 100644 (file)
Binary files a/実行時フォルダ/DTXManiaGR.exe and b/実行時フォルダ/DTXManiaGR.exe differ
index a46f15c..6456093 100644 (file)
Binary files a/実行時フォルダ/FDK.dll and b/実行時フォルダ/FDK.dll differ