public ドラムサウンド()
{
}
+
protected override void On活性化( デバイスリソース dr )
{
- this.KitXmlを読み込む();
+ this._KitXmlを読み込む();
}
+
protected override void On非活性化( デバイスリソース dr )
{
- this.すべてのコンテキストを初期化する();
+ this._すべてのコンテキストを初期化する();
}
+
public void 発声する( SSTFormat.チップ種別 chipType, float 音量0to1 )
{
- if( false == this.チップtoコンテキスト.ContainsKey( chipType ) )
- return; // コンテキスト未登録のチップなら何もしない。
- var context = this.チップtoコンテキスト[ chipType ];
-
- // 現在発声中のサウンドを全部止めるチップ種別の場合は止める。
- if( 0 != chipType.排他発声グループID() ) // ID = 0 は対象外。
+ lock( this._スレッド間同期 )
{
- // 同じ排他発声グループIDを持つコンテキストの Sounds[] を select する。
- var 停止するサウンド群 =
- from kvp in this.チップtoコンテキスト
- where ( kvp.Key.排他発声グループID() == chipType.排他発声グループID() )
- select kvp.Value.Sounds;
-
- // 集めた Sounds[] をすべて停止する。
- foreach( var sounds in 停止するサウンド群 )
- foreach( var sound in sounds )
- sound.再生を停止する();
- }
+ if( false == this._チップtoコンテキスト.ContainsKey( chipType ) )
+ return; // コンテキスト未登録のチップなら何もしない。
+ var context = this._チップtoコンテキスト[ chipType ];
- // 再生する。
- if( null != context.Sounds[ context.次に再生するSound番号 ] )
- {
- context.Sounds[ context.次に再生するSound番号 ].音量 = 音量0to1;
- context.Sounds[ context.次に再生するSound番号 ].再生を開始する();
- }
+ // 現在発声中のサウンドを全部止めるチップ種別の場合は止める。
+ if( 0 != chipType.排他発声グループID() ) // ID = 0 は対象外。
+ {
+ // 消音対象のコンテキストの Sounds[] を select する。
+ var 停止するサウンド群 =
+ from kvp in this._チップtoコンテキスト
+ where ( chipType.直前のチップを消音する( kvp.Key ) )
+ select kvp.Value.Sounds;
+
+ // 集めた Sounds[] をすべて停止する。
+ foreach( var sounds in 停止するサウンド群 )
+ foreach( var sound in sounds )
+ sound.Stop();
+ }
- // サウンドローテーション。
- context.次に再生するSound番号++;
- if( context.次に再生するSound番号 >= ドラムサウンド.多重度 )
- context.次に再生するSound番号 = 0;
+ // 再生する。
+ if( null != context.Sounds[ context.次に再生するSound番号 ] )
+ {
+ context.Sounds[ context.次に再生するSound番号 ].Volume = 音量0to1;
+ context.Sounds[ context.次に再生するSound番号 ].Play();
+ }
+
+ // サウンドローテーション。
+ context.次に再生するSound番号++;
+ if( context.次に再生するSound番号 >= ドラムサウンド._多重度 )
+ context.次に再生するSound番号 = 0;
+ }
}
- protected const int 多重度 = 2;
- protected readonly string KitXmlファイルパス = @"$(Static)\sounds\Kit.xml";
- protected class Cコンテキスト : IDisposable
+ private const int _多重度 = 2;
+
+ private class Cコンテキスト : IDisposable
{
- public FDK.メディア.サウンド.WASAPI排他.Sound[] Sounds = new FDK.メディア.サウンド.WASAPI排他.Sound[ ドラムサウンド.多重度 ];
+ public FDK.メディア.サウンド.WASAPI.Sound[] Sounds = new FDK.メディア.サウンド.WASAPI.Sound[ ドラムサウンド._多重度 ];
public int 次に再生するSound番号 = 0;
public void Dispose()
{
for( int i = 0; i < this.Sounds.Length; i++ )
{
- StrokeStyleT.Wasapiデバイス.サウンドをミキサーから削除する( this.Sounds[ i ] );
+ this.Sounds[ i ].Stop();
FDK.Utilities.解放する( ref this.Sounds[ i ] );
}
}
}
};
- protected Dictionary<SSTFormat.チップ種別, Cコンテキスト> チップtoコンテキスト = null;
- private void すべてのコンテキストを初期化する()
+ private Dictionary<SSTFormat.チップ種別, Cコンテキスト> _チップtoコンテキスト = null;
+
+ private readonly string _KitXmlファイルパス = @"$(Static)\sounds\Kit.xml";
+
+ private readonly object _スレッド間同期 = new object();
+
+ private void _すべてのコンテキストを初期化する()
{
// すでに存在しているなら解放する。
- if( null != this.チップtoコンテキスト )
+ if( null != this._チップtoコンテキスト )
{
- foreach( var kvp in this.チップtoコンテキスト )
+ foreach( var kvp in this._チップtoコンテキスト )
( (Cコンテキスト) kvp.Value ).Dispose();
}
// 生成する。
- this.チップtoコンテキスト = new Dictionary<SSTFormat.チップ種別, Cコンテキスト>();
+ this._チップtoコンテキスト = new Dictionary<SSTFormat.チップ種別, Cコンテキスト>();
}
- private void KitXmlを読み込む()
+
+ private void _KitXmlを読み込む()
{
- this.すべてのコンテキストを初期化する();
+ this._すべてのコンテキストを初期化する();
- string ファイルパス = FDK.フォルダ.絶対パスに含まれるフォルダ変数を展開して返す( this.KitXmlファイルパス );
+ string ファイルパス = FDK.フォルダ.絶対パスに含まれるフォルダ変数を展開して返す( this._KitXmlファイルパス );
if( false == File.Exists( ファイルパス ) )
{
- FDK.Log.WARNING( $"Kit ファイルが存在しません。ドラムサウンドは生成されません。[{this.KitXmlファイルパス}]" );
+ FDK.Log.WARNING( $"Kit ファイルが存在しません。ドラムサウンドは生成されません。[{this._KitXmlファイルパス}]" );
return;
}
if( File.Exists( サウンドファイルパス ) )
{
// すでに辞書に存在してるなら、解放して削除する。
- if( this.チップtoコンテキスト.ContainsKey( チップ種別 ) )
+ if( this._チップtoコンテキスト.ContainsKey( チップ種別 ) )
{
- this.チップtoコンテキスト[ チップ種別 ]?.Dispose();
- this.チップtoコンテキスト.Remove( チップ種別 );
+ this._チップtoコンテキスト[ チップ種別 ]?.Dispose();
+ this._チップtoコンテキスト.Remove( チップ種別 );
}
// コンテキストを作成する。
var context = new Cコンテキスト() {
- Sounds = new FDK.メディア.サウンド.WASAPI排他.Sound[ ドラムサウンド.多重度 ],
+ Sounds = new FDK.メディア.サウンド.WASAPI.Sound[ ドラムサウンド._多重度 ],
次に再生するSound番号 = 0,
};
- for( int i = 0; i < context.Sounds.Length; i++ )
- {
- // 多重度分のサウンドを生成しつつ、ミキサーにも登録。
- context.Sounds[ i ] = new FDK.メディア.サウンド.WASAPI排他.Sound( サウンドファイルパス );
- StrokeStyleT.Wasapiデバイス.サウンドをミキサーに追加する( context.Sounds[ i ] );
- }
+ // 多重度分のサウンドを生成する。
+ for( int i = 0; i < context.Sounds.Length; i++ )
+ context.Sounds[ i ] = StrokeStyleT.サウンドデバイス.CreateSound( サウンドファイルパス );
+
// コンテキストを辞書に追加する。
- this.チップtoコンテキスト.Add( チップ種別, context );
+ this._チップtoコンテキスト.Add( チップ種別, context );
}
else
{
- FDK.Log.WARNING( $"サウンドファイル {FDK.フォルダ.絶対パスをフォルダ変数付き絶対パスに変換して返す( サウンドファイルパス )} が存在しません。[{this.KitXmlファイルパス}]" );
+ FDK.Log.WARNING( $"サウンドファイル {FDK.フォルダ.絶対パスをフォルダ変数付き絶対パスに変換して返す( サウンドファイルパス )} が存在しません。[{this._KitXmlファイルパス}]" );
}
}
else
{
- FDK.Log.WARNING( $"未知の要素 {Sound要素のName属性.Value} をスキップします。[{this.KitXmlファイルパス}]" );
+ FDK.Log.WARNING( $"未知の要素 {Sound要素のName属性.Value} をスキップします。[{this._KitXmlファイルパス}]" );
}
break;
}
}
catch( Exception e )
{
- FDK.Log.ERROR( $"Kitファイルの読み込みに失敗しました。{e.Message}[{this.KitXmlファイルパス}]" );
+ FDK.Log.ERROR( $"Kitファイルの読み込みに失敗しました。{e.Message}[{this._KitXmlファイルパス}]" );
}
}
}