OSDN Git Service

#36043 CDTXMania 内の app 以外の static メンバをインスタンスメンバにし、appを介してアクセスするように変更。CChipのメンバの多くをpr...
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 02.タイトル / CEnumSongs.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Diagnostics;\r
5 using System.Runtime.InteropServices;\r
6 using System.IO;\r
7 using System.Threading;\r
8 using System.Runtime.Serialization.Formatters.Binary;\r
9 using SlimDX;\r
10 using SlimDX.Direct3D9;\r
11 using FDK;\r
12 using SampleFramework;\r
13 \r
14 namespace DTXMania\r
15 {\r
16         internal class CEnumSongs                                                       // #27060 2011.2.7 yyagi 曲リストを取得するクラス\r
17         {                                                                                                       // ファイルキャッシュ(songslist.db)からの取得と、ディスクからの取得を、この一つのクラスに集約。\r
18                 public CSongs管理 Songs管理                                         // 曲の探索結果はこのSongs管理に読み込まれる\r
19                 {\r
20                         get;\r
21                         private set;\r
22                 }\r
23 \r
24                 public bool IsSongListEnumCompletelyDone                // 曲リスト探索と、実際の曲リストへの反映が完了した?\r
25                 {\r
26                         get\r
27                         {\r
28                                 return ( this.state == DTXEnumState.CompletelyDone );\r
29                         }\r
30                 }\r
31                 public bool IsEnumerating\r
32                 {\r
33                         get\r
34                         {\r
35                                 if ( thDTXFileEnumerate == null )\r
36                                 {\r
37                                         return false;\r
38                                 }\r
39                                 return thDTXFileEnumerate.IsAlive;\r
40                         }\r
41                 }\r
42                 public bool IsSongListEnumerated                                // 曲リスト探索が完了したが、実際の曲リストへの反映はまだ?\r
43                 {\r
44                         get\r
45                         {\r
46                                 return ( this.state == DTXEnumState.Enumeratad );\r
47                         }\r
48                 }\r
49                 public bool IsSongListEnumStarted                               // 曲リスト探索開始後?(探索完了も含む)\r
50                 {\r
51                         get\r
52                         {\r
53                                 return ( this.state != DTXEnumState.None );\r
54                         }\r
55                 }\r
56                 public void SongListEnumCompletelyDone()\r
57                 {\r
58                         this.state = DTXEnumState.CompletelyDone;\r
59                         this.Songs管理 = null;                                                // GCはOSに任せる\r
60                 }\r
61                 public bool IsSlowdown                                                  // #PREMOVIE再生中は検索負荷を落とす\r
62                 {\r
63                         get\r
64                         {\r
65                                 return this.Songs管理.bIsSlowdown;\r
66                         }\r
67                         set\r
68                         {\r
69                                 this.Songs管理.bIsSlowdown = value;\r
70                         }\r
71                 }\r
72 \r
73                 public void ChangeEnumeratePriority( ThreadPriority tp )\r
74                 {\r
75                         if ( this.thDTXFileEnumerate != null && this.thDTXFileEnumerate.IsAlive == true )\r
76                         {\r
77                                 this.thDTXFileEnumerate.Priority = tp;\r
78                         }\r
79                 }\r
80                 private readonly string strPathSongsDB = CDTXMania.app.strEXEのあるフォルダ + "songs.db";\r
81                 private readonly string strPathSongList = CDTXMania.app.strEXEのあるフォルダ + "songlist.db";\r
82 \r
83                 public Thread thDTXFileEnumerate\r
84                 {\r
85                         get;\r
86                         private set;\r
87                 }\r
88                 private enum DTXEnumState\r
89                 {\r
90                         None,\r
91                         Ongoing,\r
92                         Suspended,\r
93                         Enumeratad,                             // 探索完了、現在の曲リストに未反映\r
94                         CompletelyDone                  // 探索完了、現在の曲リストに反映完了\r
95                 }\r
96                 private DTXEnumState state = DTXEnumState.None;\r
97 \r
98 \r
99                 /// <summary>\r
100                 /// Constractor\r
101                 /// </summary>\r
102                 public CEnumSongs()\r
103                 {\r
104                         this.Songs管理 = new CSongs管理();\r
105                 }\r
106 \r
107                 public void Init( List<Cスコア> ls, int n )\r
108                 {\r
109                         if ( state == DTXEnumState.None )\r
110                         {\r
111                                 this.Songs管理.listSongsDB = ls;\r
112                                 this.Songs管理.nSongsDBから取得できたスコア数 = n;\r
113                         }\r
114                 }\r
115 \r
116                 /// <summary>\r
117                 /// 曲リストのキャッシュ(songlist.db)取得スレッドの開始\r
118                 /// </summary>\r
119                 public void StartEnumFromCache()\r
120                 {\r
121                         this.thDTXFileEnumerate = new Thread( new ThreadStart( this.t曲リストの構築1 ) );\r
122                         this.thDTXFileEnumerate.Name = "曲リストの構築";\r
123                         this.thDTXFileEnumerate.IsBackground = true;\r
124                         this.thDTXFileEnumerate.Start();\r
125                 }\r
126 \r
127                 /// <summary>\r
128                 /// \r
129                 /// </summary>\r
130                 public delegate void AsyncDelegate();\r
131 \r
132                 /// <summary>\r
133                 /// 曲検索スレッドの開始\r
134                 /// </summary>\r
135                 public void StartEnumFromDisk()\r
136                 {\r
137                         if ( state == DTXEnumState.None || state == DTXEnumState.CompletelyDone )\r
138                         {\r
139                                 Trace.TraceInformation( "★曲データ検索スレッドを起動しました。" );\r
140                                 lock ( this )\r
141                                 {\r
142                                         state = DTXEnumState.Ongoing;\r
143                                 }\r
144                                 // this.autoReset = new AutoResetEvent( true );\r
145 \r
146                                 if ( this.Songs管理 == null )         // Enumerating Songs完了後、CONFIG画面から再スキャンしたときにこうなる\r
147                                 {\r
148                                         this.Songs管理 = new CSongs管理();\r
149                                 }\r
150                                 this.thDTXFileEnumerate = new Thread( new ThreadStart( this.t曲リストの構築2 ) );\r
151                                 this.thDTXFileEnumerate.Name = "曲リストの構築";\r
152                                 this.thDTXFileEnumerate.IsBackground = true;\r
153                                 this.thDTXFileEnumerate.Priority = System.Threading.ThreadPriority.Lowest;\r
154                                 this.thDTXFileEnumerate.Start();\r
155                         }\r
156                 }\r
157 \r
158 \r
159                 /// <summary>\r
160                 /// 曲探索スレッドのサスペンド\r
161                 /// </summary>\r
162                 public void Suspend()\r
163                 {\r
164                         if ( this.state != DTXEnumState.CompletelyDone &&\r
165                                 ( ( thDTXFileEnumerate.ThreadState & ( System.Threading.ThreadState.Background ) ) != 0 ) )\r
166                         {\r
167                                 // this.thDTXFileEnumerate.Suspend();           // obsoleteにつき使用中止\r
168                                 this.Songs管理.bIsSuspending = true;\r
169                                 this.state = DTXEnumState.Suspended;\r
170                                 Trace.TraceInformation( "★曲データ検索スレッドを中断しました。" );\r
171                         }\r
172                 }\r
173 \r
174                 /// <summary>\r
175                 /// 曲探索スレッドのレジューム\r
176                 /// </summary>\r
177                 public void Resume()\r
178                 {\r
179                         if ( this.state == DTXEnumState.Suspended )\r
180                         {\r
181                                 if ( ( this.thDTXFileEnumerate.ThreadState & ( System.Threading.ThreadState.WaitSleepJoin | System.Threading.ThreadState.StopRequested ) ) != 0 )       //\r
182                                 {\r
183                                         // this.thDTXFileEnumerate.Resume();    // obsoleteにつき使用中止\r
184                                         this.Songs管理.bIsSuspending = false;\r
185                                         this.Songs管理.AutoReset.Set();\r
186                                         this.state = DTXEnumState.Ongoing;\r
187                                         Trace.TraceInformation( "★曲データ検索スレッドを再開しました。" );\r
188                                 }\r
189                         }\r
190                 }\r
191 \r
192                 /// <summary>\r
193                 /// 曲探索スレッドにサスペンド指示を出してから、本当にサスペンド状態に遷移するまでの間、ブロックする\r
194                 /// 500ms * 10回=5秒でタイムアウトし、サスペンド完了して無くてもブロック解除する\r
195                 /// </summary>\r
196                 public void WaitUntilSuspended()\r
197                 {\r
198                         // 曲検索が一時中断されるまで待機\r
199                         for ( int i = 0; i < 10; i++ )\r
200                         {\r
201                                 if ( this.state == DTXEnumState.CompletelyDone ||\r
202                                         ( thDTXFileEnumerate.ThreadState & ( System.Threading.ThreadState.WaitSleepJoin | System.Threading.ThreadState.Background | System.Threading.ThreadState.Stopped ) ) != 0 )\r
203                                 {\r
204                                         break;\r
205                                 }\r
206                                 Trace.TraceInformation( "★曲データ検索スレッドの中断待ちです: {0}", this.thDTXFileEnumerate.ThreadState.ToString() );\r
207                                 Thread.Sleep( 500 );\r
208                         }\r
209 \r
210                 }\r
211 \r
212                 /// <summary>\r
213                 /// 曲探索スレッドを強制終了する\r
214                 /// </summary>\r
215                 public void Abort()\r
216                 {\r
217                         if ( thDTXFileEnumerate != null )\r
218                         {\r
219                                 thDTXFileEnumerate.Abort();\r
220                                 thDTXFileEnumerate = null;\r
221                                 this.state = DTXEnumState.None;\r
222 \r
223                                 this.Songs管理 = null;                                        // Songs管理を再初期化する (途中まで作った曲リストの最後に、一から重複して追記することにならないようにする。)\r
224                                 this.Songs管理 = new CSongs管理();\r
225                         }\r
226                 }\r
227 \r
228 \r
229 \r
230                 /// <summary>\r
231                 /// songlist.dbからの曲リスト構築\r
232                 /// </summary>\r
233                 public void t曲リストの構築1()\r
234                 {\r
235                         // !注意!\r
236                         // 本メソッドは別スレッドで動作するが、プラグイン側でカレントディレクトリを変更しても大丈夫なように、\r
237                         // すべてのファイルアクセスは「絶対パス」で行うこと。(2010.9.16)\r
238                         // 構築が完了したら、DTXEnumerateState state を DTXEnumerateState.Done にすること。(2012.2.9)\r
239                         DateTime now = DateTime.Now;\r
240 \r
241                         try\r
242                         {\r
243                                 #region [ 0) システムサウンドの構築  ]\r
244                                 //-----------------------------\r
245                                 CDTXMania.app.stage起動.eフェーズID = CStage.Eフェーズ.起動0_システムサウンドを構築;\r
246 \r
247                                 Trace.TraceInformation( "0) システムサウンドを構築します。" );\r
248                                 Trace.Indent();\r
249 \r
250                                 try\r
251                                 {\r
252                                         CDTXMania.app.Skin.bgm起動画面.t再生する();\r
253                                         for ( int i = 0; i < CDTXMania.app.Skin.nシステムサウンド数; i++ )\r
254                                         {\r
255                                                 if ( !CDTXMania.app.Skin[ i ].b排他 ) // BGM系以外のみ読み込む。(BGM系は必要になったときに読み込む)\r
256                                                 {\r
257                                                         CSkin.Cシステムサウンド cシステムサウンド = CDTXMania.app.Skin[ i ];\r
258                                                         if ( !CDTXMania.app.bコンパクトモード || cシステムサウンド.bCompact対象 )\r
259                                                         {\r
260                                                                 try\r
261                                                                 {\r
262                                                                         cシステムサウンド.t読み込み();\r
263                                                                         Trace.TraceInformation( "システムサウンドを読み込みました。({0})", cシステムサウンド.strファイル名 );\r
264                                                                         //if ( ( cシステムサウンド == CDTXMania.app.Skin.bgm起動画面 ) && cシステムサウンド.b読み込み成功 )\r
265                                                                         //{\r
266                                                                         //      cシステムサウンド.t再生する();\r
267                                                                         //}\r
268                                                                 }\r
269                                                                 catch ( FileNotFoundException )\r
270                                                                 {\r
271                                                                         Trace.TraceWarning( "システムサウンドが存在しません。({0})", cシステムサウンド.strファイル名 );\r
272                                                                 }\r
273                                                                 catch ( Exception e )\r
274                                                                 {\r
275                                                                         Trace.TraceError( e.Message );\r
276                                                                         Trace.TraceWarning( "システムサウンドの読み込みに失敗しました。({0})", cシステムサウンド.strファイル名 );\r
277                                                                 }\r
278                                                         }\r
279                                                 }\r
280                                         }\r
281                                         lock (CDTXMania.app.stage起動.list進行文字列)\r
282                                         {\r
283                                                 CDTXMania.app.stage起動.list進行文字列.Add("Loading system sounds ... OK ");\r
284                                         }\r
285                                 }\r
286                                 finally\r
287                                 {\r
288                                         Trace.Unindent();\r
289                                 }\r
290                                 //-----------------------------\r
291                                 #endregion\r
292 \r
293                                 if ( CDTXMania.app.bコンパクトモード )\r
294                                 {\r
295                                         Trace.TraceInformation( "コンパクトモードなので残りの起動処理は省略します。" );\r
296                                         return;\r
297                                 }\r
298 \r
299                                 #region [ 00) songlist.dbの読み込みによる曲リストの構築  ]\r
300                                 //-----------------------------\r
301                                 CDTXMania.app.stage起動.eフェーズID = CStage.Eフェーズ.起動00_songlistから曲リストを作成する;\r
302 \r
303                                 Trace.TraceInformation( "1) songlist.dbを読み込みます。" );\r
304                                 Trace.Indent();\r
305 \r
306                                 try\r
307                                 {\r
308                                         if ( !CDTXMania.app.ConfigIni.bConfigIniがないかDTXManiaのバージョンが異なる )\r
309                                         {\r
310                                                 CSongs管理 s = new CSongs管理();\r
311                                                 s = Deserialize( strPathSongList );             // 直接this.Songs管理にdeserialize()結果を代入するのは避ける。nullにされてしまうことがあるため。\r
312                                                 if ( s != null )\r
313                                                 {\r
314                                                         this.Songs管理 = s;\r
315                                                 }\r
316 \r
317                                                 int scores = this.Songs管理.n検索されたスコア数;\r
318                                                 Trace.TraceInformation( "songlist.db の読み込みを完了しました。[{0}スコア]", scores );\r
319                                                 lock (CDTXMania.app.stage起動.list進行文字列)\r
320                                                 {\r
321                                                         CDTXMania.app.stage起動.list進行文字列.Add("Loading songlist.db ... OK");\r
322                                                 }\r
323                                         }\r
324                                         else\r
325                                         {\r
326                                                 Trace.TraceInformation( "初回の起動であるかまたはDTXManiaのバージョンが上がったため、songlist.db の読み込みをスキップします。" );\r
327                                                 lock (CDTXMania.app.stage起動.list進行文字列)\r
328                                                 {\r
329                                                         CDTXMania.app.stage起動.list進行文字列.Add("Loading songlist.db ... Skip");\r
330                                                 }\r
331                                         }\r
332                                 }\r
333                                 finally\r
334                                 {\r
335                                         Trace.Unindent();\r
336                                 }\r
337 \r
338                                 #endregion\r
339 \r
340                                 #region [ 1) songs.db の読み込み ]\r
341                                 //-----------------------------\r
342                                 CDTXMania.app.stage起動.eフェーズID = CStage.Eフェーズ.起動1_SongsDBからスコアキャッシュを構築;\r
343 \r
344                                 Trace.TraceInformation( "2) songs.db を読み込みます。" );\r
345                                 Trace.Indent();\r
346 \r
347                                 try\r
348                                 {\r
349                                         if ( !CDTXMania.app.ConfigIni.bConfigIniがないかDTXManiaのバージョンが異なる )\r
350                                         {\r
351                                                 try\r
352                                                 {\r
353                                                         this.Songs管理.tSongsDBを読み込む( strPathSongsDB );\r
354                                                 }\r
355                                                 catch\r
356                                                 {\r
357                                                         Trace.TraceError( "songs.db の読み込みに失敗しました。" );\r
358                                                 }\r
359 \r
360                                                 int scores = ( this.Songs管理 == null ) ? 0 : this.Songs管理.nSongsDBから取得できたスコア数;     // 読み込み途中でアプリ終了した場合など、CDTXMania.app.Songs管理 がnullの場合があるので注意\r
361                                                 Trace.TraceInformation( "songs.db の読み込みを完了しました。[{0}スコア]", scores );\r
362                                                 lock (CDTXMania.app.stage起動.list進行文字列)\r
363                                                 {\r
364                                                         CDTXMania.app.stage起動.list進行文字列.Add("Loading songs.db ... OK");\r
365                                                 }\r
366                                         }\r
367                                         else\r
368                                         {\r
369                                                 Trace.TraceInformation( "初回の起動であるかまたはDTXManiaのバージョンが上がったため、songs.db の読み込みをスキップします。" );\r
370                                                 lock (CDTXMania.app.stage起動.list進行文字列)\r
371                                                 {\r
372                                                         CDTXMania.app.stage起動.list進行文字列.Add("Loading songs.db ... Skip");\r
373                                                 }\r
374                                         }\r
375                                 }\r
376                                 finally\r
377                                 {\r
378                                         Trace.Unindent();\r
379                                 }\r
380                                 //-----------------------------\r
381                                 #endregion\r
382 \r
383                         }\r
384                         finally\r
385                         {\r
386                                 CDTXMania.app.stage起動.eフェーズID = CStage.Eフェーズ.起動7_完了;\r
387                                 TimeSpan span = (TimeSpan) ( DateTime.Now - now );\r
388                                 Trace.TraceInformation( "起動所要時間: {0}", span.ToString() );\r
389                                 lock ( this )                                                   // #28700 2012.6.12 yyagi; state change must be in finally{} for exiting as of compact mode.\r
390                                 {\r
391                                         state = DTXEnumState.CompletelyDone;\r
392                                 }\r
393                         }\r
394                 }\r
395 \r
396 \r
397                 /// <summary>\r
398                 /// 起動してタイトル画面に遷移した後にバックグラウンドで発生させる曲検索\r
399                 /// #27060 2012.2.6 yyagi\r
400                 /// </summary>\r
401                 private void t曲リストの構築2()\r
402                 {\r
403                         // !注意!\r
404                         // 本メソッドは別スレッドで動作するが、プラグイン側でカレントディレクトリを変更しても大丈夫なように、\r
405                         // すべてのファイルアクセスは「絶対パス」で行うこと。(2010.9.16)\r
406                         // 構築が完了したら、DTXEnumerateState state を DTXEnumerateState.Done にすること。(2012.2.9)\r
407 \r
408                         DateTime now = DateTime.Now;\r
409                         bool bIsAvailableSongList = false;\r
410                         bool bIsAvailableSongsDB = false;\r
411                         bool bSucceededFastBoot = false;\r
412 \r
413                         try\r
414                         {\r
415 \r
416                                 #region [ 2) 曲データの検索 ]\r
417                                 //-----------------------------\r
418                                 //      base.eフェーズID = CStage.Eフェーズ.起動2_曲を検索してリストを作成する;\r
419 \r
420                                 Trace.TraceInformation( "enum2) 曲データを検索します。" );\r
421                                 Trace.Indent();\r
422 \r
423                                 try\r
424                                 {\r
425                                         if ( !string.IsNullOrEmpty( CDTXMania.app.ConfigIni.str曲データ検索パス ) )\r
426                                         {\r
427                                                 string[] strArray = CDTXMania.app.ConfigIni.str曲データ検索パス.Split( new char[] { ';' } );\r
428                                                 if ( strArray.Length > 0 )\r
429                                                 {\r
430                                                         // 全パスについて…\r
431                                                         foreach ( string str in strArray )\r
432                                                         {\r
433                                                                 string path = str;\r
434                                                                 if ( !Path.IsPathRooted( path ) )\r
435                                                                 {\r
436                                                                         path = CDTXMania.app.strEXEのあるフォルダ + str; // 相対パスの場合、絶対パスに直す(2010.9.16)\r
437                                                                 }\r
438 \r
439                                                                 if ( !string.IsNullOrEmpty( path ) )\r
440                                                                 {\r
441                                                                         Trace.TraceInformation( "検索パス: " + path );\r
442                                                                         Trace.Indent();\r
443 \r
444                                                                         try\r
445                                                                         {\r
446                                                                                 this.Songs管理.t曲を検索してリストを作成する( path, true );\r
447                                                                         }\r
448                                                                         catch ( Exception e )\r
449                                                                         {\r
450                                                                                 Trace.TraceError( e.Message );\r
451                                                                                 Trace.TraceError( e.StackTrace );\r
452                                                                                 Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
453                                                                 }\r
454                                                                                 finally\r
455                                                                         {\r
456                                                                                 Trace.Unindent();\r
457                                                                         }\r
458                                                                 }\r
459                                                         }\r
460                                                 }\r
461                                         }\r
462                                         else\r
463                                         {\r
464                                                 Trace.TraceWarning( "曲データの検索パス(DTXPath)の指定がありません。" );\r
465                                         }\r
466                                 }\r
467                                 finally\r
468                                 {\r
469                                         Trace.TraceInformation( "曲データの検索を完了しました。[{0}曲{1}スコア]", this.Songs管理.n検索された曲ノード数, this.Songs管理.n検索されたスコア数 );\r
470                                         Trace.Unindent();\r
471                                 }\r
472                                 //      lock ( this.list進行文字列 )\r
473                                 //      {\r
474                                 //              this.list進行文字列.Add( string.Format( "{0} ... {1} scores ({2} songs)", "Enumerating songs", this..Songs管理_裏読.n検索されたスコア数, this.Songs管理_裏読.n検索された曲ノード数 ) );\r
475                                 //      }\r
476                                 //-----------------------------\r
477                                 #endregion\r
478                                 #region [ 3) songs.db 情報の曲リストへの反映 ]\r
479                                 //-----------------------------\r
480                                 //                                      base.eフェーズID = CStage.Eフェーズ.起動3_スコアキャッシュをリストに反映する;\r
481                                 Trace.TraceInformation( "enum3) songs.db の情報を曲リストへ反映します。" );\r
482                                 Trace.Indent();\r
483 \r
484                                 try\r
485                                 {\r
486                                         if ( this.Songs管理.listSongsDB != null )\r
487                                         {\r
488                                                 this.Songs管理.tスコアキャッシュを曲リストに反映する();\r
489                                         }\r
490                                 }\r
491                                 catch ( Exception e )\r
492                                 {\r
493                                         Trace.TraceError( e.Message );\r
494                                         Trace.TraceError( e.StackTrace );\r
495                                         Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
496                                 }\r
497                                 finally\r
498                                 {\r
499                                         Trace.TraceInformation( "曲リストへの反映を完了しました。[{0}/{1}スコア]", this.Songs管理.nスコアキャッシュから反映できたスコア数, this.Songs管理.n検索されたスコア数 );\r
500                                         Trace.Unindent();\r
501                                 }\r
502                                 //      lock ( this.list進行文字列 )\r
503                                 //      {\r
504                                 //              this.list進行文字列.Add( string.Format( "{0} ... {1}/{2}", "Loading score properties from songs.db", CDTXMania.app.Songs管理_裏読.nスコアキャッシュから反映できたスコア数, cs.n検索されたスコア数 ) );\r
505                                 //      }\r
506                                 //-----------------------------\r
507                                 #endregion\r
508                                 #region [ 4) songs.db になかった曲データをファイルから読み込んで反映 ]\r
509                                 //-----------------------------\r
510                                 //                                      base.eフェーズID = CStage.Eフェーズ.起動4_スコアキャッシュになかった曲をファイルから読み込んで反映する;\r
511 \r
512                                 int num2 = this.Songs管理.n検索されたスコア数 - this.Songs管理.nスコアキャッシュから反映できたスコア数;\r
513 \r
514                                 Trace.TraceInformation( "{0}, {1}", this.Songs管理.n検索されたスコア数, this.Songs管理.nスコアキャッシュから反映できたスコア数 );\r
515                                 Trace.TraceInformation( "enum4) songs.db になかった曲データ[{0}スコア]の情報をファイルから読み込んで反映します。", num2 );\r
516                                 Trace.Indent();\r
517 \r
518                                 try\r
519                                 {\r
520                                         this.Songs管理.tSongsDBになかった曲をファイルから読み込んで反映する();\r
521                                 }\r
522                                 catch ( Exception e )\r
523                                 {\r
524                                         Trace.TraceError( e.Message );\r
525                                         Trace.TraceError( e.StackTrace );\r
526                                         Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
527                                 }\r
528                                 finally\r
529                                 {\r
530                                         Trace.TraceInformation( "曲データへの反映を完了しました。[{0}/{1}スコア]", this.Songs管理.nファイルから反映できたスコア数, num2 );\r
531                                         Trace.Unindent();\r
532                                 }\r
533                                 //                                      lock ( this.list進行文字列 )\r
534                                 //                                      {\r
535                                 //                                              this.list進行文字列.Add( string.Format( "{0} ... {1}/{2}", "Loading score properties from files", CDTXMania.app.Songs管理_裏読.nファイルから反映できたスコア数, CDTXMania.app.Songs管理_裏読.n検索されたスコア数 - cs.nスコアキャッシュから反映できたスコア数 ) );\r
536                                 //                                      }\r
537                                 //-----------------------------\r
538                                 #endregion\r
539                                 #region [ 5) 曲リストへの後処理の適用 ]\r
540                                 //-----------------------------\r
541                                 //                                      base.eフェーズID = CStage.Eフェーズ.起動5_曲リストへ後処理を適用する;\r
542 \r
543                                 Trace.TraceInformation( "enum5) 曲リストへの後処理を適用します。" );\r
544                                 Trace.Indent();\r
545 \r
546                                 try\r
547                                 {\r
548                                         this.Songs管理.t曲リストへ後処理を適用する();\r
549                                 }\r
550                                 catch ( Exception e )\r
551                                 {\r
552                                         Trace.TraceError( e.Message );\r
553                                         Trace.TraceError( e.StackTrace );\r
554                                         Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
555                                 }\r
556                                 finally\r
557                                 {\r
558                                         Trace.TraceInformation( "曲リストへの後処理を完了しました。" );\r
559                                         Trace.Unindent();\r
560                                 }\r
561                                 //                                      lock ( this.list進行文字列 )\r
562                                 //                                      {\r
563                                 //                                              this.list進行文字列.Add( string.Format( "{0} ... OK", "Building songlists" ) );\r
564                                 //                                      }\r
565                                 //-----------------------------\r
566                                 #endregion\r
567                                 #region [ 6) songs.db への保存 ]\r
568                                 //-----------------------------\r
569                                 //                                      base.eフェーズID = CStage.Eフェーズ.起動6_スコアキャッシュをSongsDBに出力する;\r
570 \r
571                                 Trace.TraceInformation( "enum6) 曲データの情報を songs.db へ出力します。" );\r
572                                 Trace.Indent();\r
573 \r
574                                 try\r
575                                 {\r
576                                         this.Songs管理.tスコアキャッシュをSongsDBに出力する( strPathSongsDB );\r
577                                 }\r
578                                 catch ( Exception e )\r
579                                 {\r
580                                         Trace.TraceError( e.Message );\r
581                                         Trace.TraceError( e.StackTrace );\r
582                                         Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
583                                 }\r
584                                 finally\r
585                                 {\r
586                                         Trace.TraceInformation( "songs.db への出力を完了しました。[{0}スコア]", this.Songs管理.nSongsDBへ出力できたスコア数 );\r
587                                         Trace.Unindent();\r
588                                 }\r
589                                 //                                      lock ( this.list進行文字列 )\r
590                                 //                                      {\r
591                                 //                                              this.list進行文字列.Add( string.Format( "{0} ... OK", "Saving songs.db" ) );\r
592                                 //                                      }\r
593                                 #endregion\r
594 \r
595                                 //                              if ( !bSucceededFastBoot )      // songs2.db読み込みに成功したなら、songs2.dbを新たに作らない\r
596                                 #region [ 7) songs2.db への保存 ]           // #27060 2012.1.26 yyagi\r
597                                 Trace.TraceInformation( "enum7) 曲データの情報を songlist.db へ出力します。" );\r
598                                 Trace.Indent();\r
599 \r
600                                 SerializeSongList( this.Songs管理, strPathSongList );\r
601                                 Trace.TraceInformation( "songlist.db への出力を完了しました。[{0}スコア]", this.Songs管理.nSongsDBへ出力できたスコア数 );\r
602                                 Trace.Unindent();\r
603                                 //-----------------------------\r
604                                 #endregion\r
605                                 //                              }\r
606 \r
607                         }\r
608                         finally\r
609                         {\r
610                                 //                              base.eフェーズID = CStage.Eフェーズ.起動7_完了;\r
611                                 TimeSpan span = (TimeSpan) ( DateTime.Now - now );\r
612                                 Trace.TraceInformation( "曲探索所要時間: {0}", span.ToString() );\r
613                         }\r
614                         lock ( this )\r
615                         {\r
616                                 // state = DTXEnumState.Done;           // DoneにするのはCDTXMania.app.cs側にて。\r
617                                 state = DTXEnumState.Enumeratad;\r
618                         }\r
619                 }\r
620 \r
621 \r
622 \r
623                 /// <summary>\r
624                 /// 曲リストのserialize\r
625                 /// </summary>\r
626                 private static void SerializeSongList( CSongs管理 cs, string strPathSongList )\r
627                 {\r
628                         bool bSucceededSerialize = true;\r
629                         Stream output = null;\r
630                         try\r
631                         {\r
632                                 output = File.Create( strPathSongList );\r
633                                 BinaryFormatter formatter = new BinaryFormatter();\r
634                                 formatter.Serialize( output, cs );\r
635                         }\r
636                         catch ( Exception e )\r
637                         {\r
638                                 bSucceededSerialize = false;\r
639                                 Trace.TraceError( e.Message );\r
640                                 Trace.TraceError( e.StackTrace );\r
641                                 Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
642                         }\r
643                         finally\r
644                         {\r
645                                 output.Close();\r
646                                 if ( !bSucceededSerialize )\r
647                                 {\r
648                                         try\r
649                                         {\r
650                                                 File.Delete( strPathSongList ); // serializeに失敗したら、songs2.dbファイルを消しておく\r
651                                         }\r
652                                         catch ( Exception )\r
653                                         {\r
654                                                 // 特に何もしない\r
655                                         }\r
656                                 }\r
657                         }\r
658                 }\r
659 \r
660                 /// <summary>\r
661                 /// 曲リストのdeserialize\r
662                 /// </summary>\r
663                 /// <param name="songs管理"></param>\r
664                 /// <param name="strPathSongList"></param>\r
665                 private CSongs管理 Deserialize( string strPathSongList )\r
666                 {\r
667                         CSongs管理 songs管理 = null;\r
668                         try\r
669                         {\r
670                                 #region [ SongListDB(songlist.db)を読み込む ]\r
671                                 //      byte[] buf = File.ReadAllBytes( SongListDBファイル名 );                    // 一旦メモリにまとめ読みしてからdeserializeした方が高速かと思ったら全く変わらなかったので削除\r
672                                 //      using ( MemoryStream input = new MemoryStream(buf, false) )\r
673                                 using ( Stream input = File.OpenRead( strPathSongList ) )\r
674                                 {\r
675                                         try\r
676                                         {\r
677                                                 BinaryFormatter formatter = new BinaryFormatter();\r
678                                                 songs管理 = (CSongs管理) formatter.Deserialize( input );\r
679                                         }\r
680                                         catch ( Exception )\r
681                                         {\r
682                                                 // songs管理 = null;\r
683                                         }\r
684                                 }\r
685                                 #endregion\r
686                         }\r
687                         catch\r
688                         {\r
689                                 Trace.TraceError( "songlist.db の読み込みに失敗しました。" );\r
690                         }\r
691                         return songs管理;\r
692                 }\r
693         }\r
694 }\r