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
\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
\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
private int n一時停止回数;\r
private int n現在のPCM側の位置byte;\r
private int n現在書き込み許可待ちのバッファ番号;\r
+ private SoundBuffer _Buffer;\r
\r
private void tストリーム再生位置リセット()\r
{\r
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
\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
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