OSDN Git Service

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