OSDN Git Service

#26007 branchで適用した修正を、trunkにmergeした。
authoryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Thu, 8 Sep 2011 17:00:56 +0000 (17:00 +0000)
committeryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Thu, 8 Sep 2011 17:00:56 +0000 (17:00 +0000)
git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/trunk@255 16f42ceb-6dc6-49c8-ba94-f2d53467949d

DTXManiaプロジェクト/コード/スコア、曲/CDTX.cs
FDK17プロジェクト/コード/03.サウンド/CSound.cs
FDK17プロジェクト/コード/03.サウンド/CSound管理.cs

index e3767d8..96f6516 100644 (file)
@@ -2197,60 +2197,40 @@ namespace DTXMania
                                str = str + cwav.strファイル名;\r
                                try\r
                                {\r
-                                       for( int i = 0; i < 4; i++ )\r
-                                       {\r
                                                try\r
                                                {\r
-                                                       cwav.rSound[i] = CDTXMania.Sound管理.tサウンドを生成する(str);\r
-                                                       cwav.rSound[ i ].n音量 = 100;\r
-                                                       if( ( i == 0 ) && CDTXMania.ConfigIni.bLog作成解放ログ出力 )\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[ i ].nサウンドバッファサイズ, cwav.rSound[ i ].bストリーム再生する ? "Stream" : "OnMemory" );\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[ i ] = null;\r
-                                                       if( i == 0 )\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
-                                                               Trace.TraceError( "サウンドの作成に失敗しました。({0})({1})", cwav.strコメント文, str );\r
+                                                               cwav.rSound[ j ] = null;\r
                                                        }\r
                                                }\r
-                                               if( ( cwav.rSound[ i ] != null ) && cwav.rSound[ i ].bストリーム再生する )\r
+                                               else\r
                                                {\r
-                                                       break;\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
-//                                             Type t = typeof(CSound);\r
-//                                             MethodInfo[] methods = t.GetMethods(\r
-//                                                     BindingFlags.Public | BindingFlags.NonPublic |\r
-//                                                     BindingFlags.Instance | BindingFlags.Static\r
-//                                             );\r
-\r
-//                                             for (int j = 1; j < 3; j++)\r
-//                                             {\r
-//                                                     SlimDX.DirectSound.SoundBuffer result;\r
-//                                                     CDTXMania.Sound管理.Device.DuplicateSoundBuffer(\r
-//                                                             cwav.rSound[0].Buffer,\r
-//                                                             out result);\r
-//                                                     cwav.rSound[j].Buffer = (SlimDX.DirectSound.SecondarySoundBuffer)result;\r
-//                                                     cwav.rSound[j].bストリーム再生する = cwav.rSound[0].bストリーム再生する;\r
-//                                                     cwav.rSound[j].bループする\r
-//                                                     foreach(MethodInfo m in methods) {\r
-//                                                             if (m cwav..rSound[j].\r
-//                                             }\r
-//                                             cwav.rSound[0].Buffer.\r
-\r
-//                                             cwav.rSound[1] = cwav.rSound[0];                // #24007 2010.11.23 yyagi add: to accelerate loading chip sounds\r
-//                                             cwav.rSound[2] = cwav.rSound[0];                //\r
-//                                             cwav.rSound[3] = cwav.rSound[0];                //\r
-//                                             break;                                                                  //\r
-                                       }\r
-                                       continue;\r
                                }\r
                                catch( Exception exception )\r
                                {\r
                                        Trace.TraceError( "サウンドの生成に失敗しました。({0})({1})({2})", exception.Message, cwav.strコメント文, str );\r
-                                       for( int j = 0; j < 4; j++ )\r
+                                       for( int j = 0; j < cwav.rSound.GetLength(0); j++ )\r
                                        {\r
                                                cwav.rSound[ j ] = null;\r
                                        }\r
index 7f8f7ac..812b3bf 100644 (file)
@@ -10,17 +10,33 @@ using SlimDX.Multimedia;
 \r
 namespace FDK\r
 {\r
-       public class CSound : IDisposable\r
+       public class CSound : IDisposable, ICloneable\r
        {\r
                // (1) 以下は全子クラスに共通\r
 \r
 \r
                // プロパティ\r
 \r
-               public SecondarySoundBuffer Buffer\r
+               private SlimDX.DirectSound.DirectSound Device;\r
+               public void setDevice( ref DirectSound Device_ )\r
                {\r
-                       get;\r
-                       private set;\r
+                       Device = Device_;\r
+               }\r
+               public DirectSound getDevice()\r
+               {\r
+                       return Device;\r
+               }\r
+\r
+               public SoundBuffer Buffer\r
+               {\r
+                       get\r
+                       {\r
+                               return _Buffer;\r
+                       }\r
+                       private set\r
+                       {\r
+                               _Buffer = value;\r
+                       }\r
                }\r
                public bool bストリーム再生する\r
                {\r
@@ -211,6 +227,15 @@ namespace FDK
 \r
                // メソッド\r
 \r
+               public object Clone()\r
+               {\r
+                       CSound clone = (CSound) MemberwiseClone();      // これだけだとCY連打が途切れる&タイトルに戻る際にNullRef例外発生\r
+\r
+                       Device.DuplicateSoundBuffer( this._Buffer, out clone._Buffer );\r
+\r
+                       return clone;\r
+               }\r
+\r
                public int tデコード後のサイズを調べる( string strファイル名, out int _nHandle )\r
                {\r
 //Trace.TraceInformation("tデコード後のサイズを調べる、を開始。");\r
@@ -588,6 +613,7 @@ namespace FDK
                private int n一時停止回数;\r
                private int n現在のPCM側の位置byte;\r
                private int n現在書き込み許可待ちのバッファ番号;\r
+               private SoundBuffer _Buffer;\r
 \r
                private void tストリーム再生位置リセット()\r
                {\r
@@ -597,7 +623,7 @@ namespace FDK
                                this.n現在のPCM側の位置byte = 0;\r
                        }\r
                }\r
-               private void tデコーダの現在の読み出し位置から1バッファ分のPCMを指定されたバッファに書き込む( SecondarySoundBuffer buffer, int n書込先バッファ番号, bool bPCMの末尾に達したら先頭に戻る )\r
+               private void tデコーダの現在の読み出し位置から1バッファ分のPCMを指定されたバッファに書き込む( SoundBuffer buffer, int n書込先バッファ番号, bool bPCMの末尾に達したら先頭に戻る )\r
                {\r
                        if( !this.bDispose完了済み && ( this.nHandle >= 0 ) )\r
                        {\r
index 1c4dc31..a7b0403 100644 (file)
@@ -20,7 +20,17 @@ namespace FDK
 \r
                // プロパティ\r
 \r
-               public DirectSound Device { get; private set; }\r
+//             public DirectSound Device { get; private set; }\r
+               private DirectSound Device;\r
+               private void setDevice( DirectSound Device_ )\r
+               {\r
+                       Device = Device_;\r
+               }\r
+               public DirectSound getDevice()\r
+               {\r
+                       return Device;\r
+               }\r
+\r
                public int n登録サウンド数\r
                {\r
                        get\r
@@ -93,11 +103,17 @@ namespace FDK
                        if ( (item = this.tCheckAndDecode(strファイル名)) == null)\r
                                throw new Exception( "OggVorbis, mp3, XA, RIFF ACM のいずれでもデコードに失敗しました。" );\r
 \r
-                       lock( this.obj排他用 )\r
+                       item.setDevice( ref this.Device );\r
+                       tサウンドを登録する( item );\r
+\r
+                       return item;\r
+               }\r
+               public void tサウンドを登録する( CSound sound )\r
+               {\r
+                       lock ( this.obj排他用 )\r
                        {\r
-                               this.listSound.Add( item );\r
+                               this.listSound.Add( sound );\r
                        }\r
-                       return item;\r
                }\r
 \r
                public void t再生中の処理をする( object o )                    // #26122 2011.9.1 yyagi; delegate経由の呼び出し用\r