From 7bf74a4474b2468a5f9ce206e8bb8a952ba88544 Mon Sep 17 00:00:00 2001 From: yyagi Date: Thu, 8 Sep 2011 17:00:56 +0000 Subject: [PATCH] =?utf8?q?#26007=20branch=E3=81=A7=E9=81=A9=E7=94=A8?= =?utf8?q?=E3=81=97=E3=81=9F=E4=BF=AE=E6=AD=A3=E3=82=92=E3=80=81trunk?= =?utf8?q?=E3=81=ABmerge=E3=81=97=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/trunk@255 16f42ceb-6dc6-49c8-ba94-f2d53467949d --- .../コード/スコア、曲/CDTX.cs | 56 +++++++--------------- .../コード/03.サウンド/CSound.cs | 36 ++++++++++++-- .../コード/03.サウンド/CSound管理.cs | 24 ++++++++-- 3 files changed, 69 insertions(+), 47 deletions(-) diff --git a/DTXManiaプロジェクト/コード/スコア、曲/CDTX.cs b/DTXManiaプロジェクト/コード/スコア、曲/CDTX.cs index e3767d8f..96f6516e 100644 --- a/DTXManiaプロジェクト/コード/スコア、曲/CDTX.cs +++ b/DTXManiaプロジェクト/コード/スコア、曲/CDTX.cs @@ -2197,60 +2197,40 @@ namespace DTXMania str = str + cwav.strファイル名; try { - for( int i = 0; i < 4; i++ ) - { try { - cwav.rSound[i] = CDTXMania.Sound管理.tサウンドを生成する(str); - cwav.rSound[ i ].n音量 = 100; - if( ( i == 0 ) && CDTXMania.ConfigIni.bLog作成解放ログ出力 ) + cwav.rSound[ 0 ] = CDTXMania.Sound管理.tサウンドを生成する(str); + cwav.rSound[ 0 ].n音量 = 100; + if( CDTXMania.ConfigIni.bLog作成解放ログ出力 ) { - Trace.TraceInformation( "サウンドを作成しました。({3})({0})({1})({2}bytes)", cwav.strコメント文, str, cwav.rSound[ i ].nサウンドバッファサイズ, cwav.rSound[ i ].bストリーム再生する ? "Stream" : "OnMemory" ); + Trace.TraceInformation( "サウンドを作成しました。({3})({0})({1})({2}bytes)", cwav.strコメント文, str, cwav.rSound[ 0 ].nサウンドバッファサイズ, cwav.rSound[ 0 ].bストリーム再生する ? "Stream" : "OnMemory" ); } } catch { - cwav.rSound[ i ] = null; - if( i == 0 ) + cwav.rSound[ 0 ] = null; + Trace.TraceError( "サウンドの作成に失敗しました。({0})({1})", cwav.strコメント文, str ); + } + if ( cwav.rSound[ 0 ] == null || cwav.rSound[ 0 ].bストリーム再生する ) + { + for ( int j = 1; j < cwav.rSound.GetLength(0); j++ ) { - Trace.TraceError( "サウンドの作成に失敗しました。({0})({1})", cwav.strコメント文, str ); + cwav.rSound[ j ] = null; } } - if( ( cwav.rSound[ i ] != null ) && cwav.rSound[ i ].bストリーム再生する ) + else { - break; + for ( int j = 1; j < cwav.rSound.GetLength(0); j++ ) + { + cwav.rSound[ j ] = (CSound) cwav.rSound[ 0 ].Clone(); // #24007 2011.9.5 yyagi add: to accelerate loading chip sounds + CDTXMania.Sound管理.tサウンドを登録する( cwav.rSound[ j ] ); + } } -// Type t = typeof(CSound); -// MethodInfo[] methods = t.GetMethods( -// BindingFlags.Public | BindingFlags.NonPublic | -// BindingFlags.Instance | BindingFlags.Static -// ); - -// for (int j = 1; j < 3; j++) -// { -// SlimDX.DirectSound.SoundBuffer result; -// CDTXMania.Sound管理.Device.DuplicateSoundBuffer( -// cwav.rSound[0].Buffer, -// out result); -// cwav.rSound[j].Buffer = (SlimDX.DirectSound.SecondarySoundBuffer)result; -// cwav.rSound[j].bストリーム再生する = cwav.rSound[0].bストリーム再生する; -// cwav.rSound[j].bループする -// foreach(MethodInfo m in methods) { -// if (m cwav..rSound[j]. -// } -// cwav.rSound[0].Buffer. - -// cwav.rSound[1] = cwav.rSound[0]; // #24007 2010.11.23 yyagi add: to accelerate loading chip sounds -// cwav.rSound[2] = cwav.rSound[0]; // -// cwav.rSound[3] = cwav.rSound[0]; // -// break; // - } - continue; } catch( Exception exception ) { Trace.TraceError( "サウンドの生成に失敗しました。({0})({1})({2})", exception.Message, cwav.strコメント文, str ); - for( int j = 0; j < 4; j++ ) + for( int j = 0; j < cwav.rSound.GetLength(0); j++ ) { cwav.rSound[ j ] = null; } diff --git a/FDK17プロジェクト/コード/03.サウンド/CSound.cs b/FDK17プロジェクト/コード/03.サウンド/CSound.cs index 7f8f7acb..812b3bf3 100644 --- a/FDK17プロジェクト/コード/03.サウンド/CSound.cs +++ b/FDK17プロジェクト/コード/03.サウンド/CSound.cs @@ -10,17 +10,33 @@ using SlimDX.Multimedia; namespace FDK { - public class CSound : IDisposable + public class CSound : IDisposable, ICloneable { // (1) 以下は全子クラスに共通 // プロパティ - public SecondarySoundBuffer Buffer + private SlimDX.DirectSound.DirectSound Device; + public void setDevice( ref DirectSound Device_ ) { - get; - private set; + Device = Device_; + } + public DirectSound getDevice() + { + return Device; + } + + public SoundBuffer Buffer + { + get + { + return _Buffer; + } + private set + { + _Buffer = value; + } } public bool bストリーム再生する { @@ -211,6 +227,15 @@ namespace FDK // メソッド + public object Clone() + { + CSound clone = (CSound) MemberwiseClone(); // これだけだとCY連打が途切れる&タイトルに戻る際にNullRef例外発生 + + Device.DuplicateSoundBuffer( this._Buffer, out clone._Buffer ); + + return clone; + } + public int tデコード後のサイズを調べる( string strファイル名, out int _nHandle ) { //Trace.TraceInformation("tデコード後のサイズを調べる、を開始。"); @@ -588,6 +613,7 @@ namespace FDK private int n一時停止回数; private int n現在のPCM側の位置byte; private int n現在書き込み許可待ちのバッファ番号; + private SoundBuffer _Buffer; private void tストリーム再生位置リセット() { @@ -597,7 +623,7 @@ namespace FDK this.n現在のPCM側の位置byte = 0; } } - private void tデコーダの現在の読み出し位置から1バッファ分のPCMを指定されたバッファに書き込む( SecondarySoundBuffer buffer, int n書込先バッファ番号, bool bPCMの末尾に達したら先頭に戻る ) + private void tデコーダの現在の読み出し位置から1バッファ分のPCMを指定されたバッファに書き込む( SoundBuffer buffer, int n書込先バッファ番号, bool bPCMの末尾に達したら先頭に戻る ) { if( !this.bDispose完了済み && ( this.nHandle >= 0 ) ) { diff --git a/FDK17プロジェクト/コード/03.サウンド/CSound管理.cs b/FDK17プロジェクト/コード/03.サウンド/CSound管理.cs index 1c4dc312..a7b04033 100644 --- a/FDK17プロジェクト/コード/03.サウンド/CSound管理.cs +++ b/FDK17プロジェクト/コード/03.サウンド/CSound管理.cs @@ -20,7 +20,17 @@ namespace FDK // プロパティ - public DirectSound Device { get; private set; } +// public DirectSound Device { get; private set; } + private DirectSound Device; + private void setDevice( DirectSound Device_ ) + { + Device = Device_; + } + public DirectSound getDevice() + { + return Device; + } + public int n登録サウンド数 { get @@ -93,11 +103,17 @@ namespace FDK if ( (item = this.tCheckAndDecode(strファイル名)) == null) throw new Exception( "OggVorbis, mp3, XA, RIFF ACM のいずれでもデコードに失敗しました。" ); - lock( this.obj排他用 ) + item.setDevice( ref this.Device ); + tサウンドを登録する( item ); + + return item; + } + public void tサウンドを登録する( CSound sound ) + { + lock ( this.obj排他用 ) { - this.listSound.Add( item ); + this.listSound.Add( sound ); } - return item; } public void t再生中の処理をする( object o ) // #26122 2011.9.1 yyagi; delegate経由の呼び出し用 -- 2.11.0