From fa87af256b555c298ebdfd963dbc259403401b86 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E3=81=8F=E3=81=BE=E3=81=8B=E3=81=BF=E5=B7=A5=E6=88=BF?= Date: Tue, 29 Nov 2016 15:42:48 +0900 Subject: [PATCH] =?utf8?q?=E3=82=A4=E3=83=B3=E3=82=B9=E3=83=88=E3=83=BC?= =?utf8?q?=E3=83=A9=E3=81=A7=E3=82=A4=E3=83=B3=E3=82=B9=E3=83=88=E3=83=BC?= =?utf8?q?=E3=83=AB=E3=81=97=E3=81=9F=20SSTFEditor=20=E3=82=92=E8=B5=B7?= =?utf8?q?=E5=8B=95=E3=81=99=E3=82=8B=E3=81=A8=E3=83=A1=E3=83=83=E3=82=BB?= =?utf8?q?=E3=83=BC=E3=82=B8=E3=81=8C=E8=A6=8F=E5=AE=9A=EF=BC=88=E8=8B=B1?= =?utf8?q?=E8=AA=9E=EF=BC=89=E3=81=AB=E3=81=AA=E3=82=8B=E3=83=9F=E3=82=B9?= =?utf8?q?=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit インストールスクリプトに ja-JP を追加。 他、こまごまと文言修正。 --- FDK24/Log.cs | 8 +++ FDK24/カウンタ/FPS.cs | 6 ++ FDK24/カウンタ/QPCTimer.cs | 4 ++ .../単純増加後不変カウンタ.cs | 6 ++ .../単純増加後反復カウンタ.cs | 6 ++ FDK24/カウンタ/定間隔進行.cs | 2 + .../サウンド/WASAPI/DecodedWaveSource.cs | 8 ++- FDK24/メディア/サウンド/WASAPI/Device.cs | 31 +++++----- FDK24/メディア/サウンド/WASAPI/Mixer.cs | 39 ++++++++----- FDK24/メディア/サウンド/WASAPI/Sound.cs | 48 ++++++++++++++-- FDK24/メディア/テクスチャ.cs | 13 +++++ FDK24/メディア/テクスチャフォント.cs | 1 + FDK24/メディア/デバイスリソース.cs | 19 +++++- FDK24/メディア/動画.cs | 13 +++++ FDK24/メディア/文字列画像.cs | 4 ++ FDK24/メディア/画像.cs | 1 + FDK24/メディア/画像フォント.cs | 1 + FDK24/入力/個別/Keyboard.cs | 4 ++ FDK24/入力/個別/MidiIn.cs | 5 ++ FDK24/同期/AutoD3DDeviceLock.cs | 1 + FDK24/同期/RWLock.cs | 1 + FDK24/同期/TriStateEvent.cs | 4 ++ StrokeStyleT/StrokeStyleT.cs | 67 ++++++++++++++-------- .../InnoSetupScript for SST.iss | 15 +++-- StrokeStyleT/ステージ/ドラムセット.cs | 13 +++++ StrokeStyleT/ステージ/フェードアウト.cs | 1 + StrokeStyleT/ステージ/フェードイン.cs | 1 + .../ログイン/ログインステージ.cs | 1 + StrokeStyleT/ステージ/演奏/コンボ.cs | 6 ++ .../ステージ/演奏/コンボジャンプ.cs | 8 +++ .../ステージ/演奏/スクロール譜面.cs | 9 +++ .../ステージ/演奏/ドラムサウンド.cs | 4 ++ .../演奏/ヒット判定文字列.cs | 3 + StrokeStyleT/ステージ/演奏/回転羽.cs | 3 + .../ステージ/演奏/演奏ステージ.cs | 19 ++++++ .../ステージ/結果/結果ステージ.cs | 4 ++ .../ステージ/起動/起動ステージ.cs | 4 ++ .../ステージ/選曲/曲パネルビュー.cs | 11 +++- .../ステージ/選曲/選曲ステージ.cs | 4 ++ StrokeStyleT/曲/MusicNode.cs | 2 + StrokeStyleT/曲/Node.cs | 1 + StrokeStyleT/曲/タイトルテクスチャ.cs | 12 +++- 42 files changed, 339 insertions(+), 74 deletions(-) diff --git a/FDK24/Log.cs b/FDK24/Log.cs index e4af081..5f93ba7 100644 --- a/FDK24/Log.cs +++ b/FDK24/Log.cs @@ -106,6 +106,7 @@ namespace FDK } private const double _最小区切り時間 = 2.0; // 区切り線を入れる最小の間隔[秒]。 + private static string _日時とスレッドID { get @@ -116,8 +117,11 @@ namespace FDK return $"{DateTime.Now.ToLongTimeString()} [{NETスレッドID:00},0x{Win32スレッドID:x}{スレッド識別文字列}]"; } } + private static readonly Dictionary _IDto名前 = new Dictionary(); + private static Dictionary _識別キー別最終表示時刻 = new Dictionary(); + private static TimeSpan _経過時間 { get @@ -128,8 +132,11 @@ namespace FDK return 経過時間; } } + private static DateTime _最終表示時刻 = DateTime.Now; + private static int _深さ = 0; + private static readonly object _スレッド間同期 = new object(); private static void _一定時間が経過していたら区切り線を表示する() @@ -137,6 +144,7 @@ namespace FDK if( Log._最小区切り時間 < Log._経過時間.TotalSeconds ) Trace.TraceInformation( "・・・" ); } + private static string _インデックスを返す( int 長さ ) { string index = " "; diff --git a/FDK24/カウンタ/FPS.cs b/FDK24/カウンタ/FPS.cs index 6f9c778..d157c9f 100644 --- a/FDK24/カウンタ/FPS.cs +++ b/FDK24/カウンタ/FPS.cs @@ -81,11 +81,17 @@ namespace FDK.カウンタ } private int _現在のFPS = 0; + private int _現在のVPS = 0; + private int _fps用カウンタ = 0; + private int _vps用カウンタ = 0; + private FDK.カウンタ.定間隔進行 _定間隔進行 = null; + private bool _初めてのFPS更新 = true; + private readonly object _スレッド間同期 = new object(); } } diff --git a/FDK24/カウンタ/QPCTimer.cs b/FDK24/カウンタ/QPCTimer.cs index aaf1cb1..33686c3 100644 --- a/FDK24/カウンタ/QPCTimer.cs +++ b/FDK24/カウンタ/QPCTimer.cs @@ -173,9 +173,13 @@ namespace FDK.カウンタ } private long _前回リセットした時点の生カウント = 0; + private long _最後にキャプチャされたカウント = 0; + private long _稼働中に一時停止した時点のキャプチャカウント = 0; + private int _一時停止回数 = 0; + private readonly object _スレッド間同期 = new object(); } } diff --git a/FDK24/カウンタ/単純増加後不変カウンタ.cs b/FDK24/カウンタ/単純増加後不変カウンタ.cs index f0bb380..5f35c68 100644 --- a/FDK24/カウンタ/単純増加後不変カウンタ.cs +++ b/FDK24/カウンタ/単純増加後不変カウンタ.cs @@ -158,11 +158,17 @@ namespace FDK.カウンタ } private int _開始値 = 0; + private int _終了値 = 0; + private int _現在値 = 0; + private bool _動作中 = false; + private long _間隔ms = QPCTimer.未使用; + private 定間隔進行 _定間隔進行 = null; + private readonly object _スレッド間同期 = new object(); /// diff --git a/FDK24/カウンタ/単純増加後反復カウンタ.cs b/FDK24/カウンタ/単純増加後反復カウンタ.cs index 91acff2..4ab389a 100644 --- a/FDK24/カウンタ/単純増加後反復カウンタ.cs +++ b/FDK24/カウンタ/単純増加後反復カウンタ.cs @@ -138,11 +138,17 @@ namespace FDK.カウンタ } private int _開始値 = 0; + private int _終了値 = 0; + private int _現在値 = 0; + private bool _動作中 = false; + private long _間隔ms = QPCTimer.未使用; + private 定間隔進行 _定間隔進行 = null; + private readonly object _スレッド間同期 = new object(); /// diff --git a/FDK24/カウンタ/定間隔進行.cs b/FDK24/カウンタ/定間隔進行.cs index ffedf1c..89bbb4c 100644 --- a/FDK24/カウンタ/定間隔進行.cs +++ b/FDK24/カウンタ/定間隔進行.cs @@ -84,7 +84,9 @@ namespace FDK.カウンタ } private long _前回の進行時刻ms = QPCTimer.未使用; + private readonly QPCTimer _タイマ = new QPCTimer(); + private readonly object _スレッド間同期 = new object(); } } diff --git a/FDK24/メディア/サウンド/WASAPI/DecodedWaveSource.cs b/FDK24/メディア/サウンド/WASAPI/DecodedWaveSource.cs index 0cca0f3..74929f6 100644 --- a/FDK24/メディア/サウンド/WASAPI/DecodedWaveSource.cs +++ b/FDK24/メディア/サウンド/WASAPI/DecodedWaveSource.cs @@ -119,14 +119,16 @@ namespace FDK.メディア.サウンド.WASAPI } private CSCore.MediaFoundation.MFMediaType _MediaType = null; + private byte[] _EncodedWaveData = null; + private long _Position = 0; private void _初期化する( string path ) { try { - // SharpDX ではなく CSCore を使う。(MediaType から WaveFormat に一発で変換できるので。) + // SourceReader は、SharpDX ではなく CSCore のものを使う。(MediaType から WaveFormat に一発で変換できるので。) using( var sourceReader = new CSCore.MediaFoundation.MFSourceReader( path ) ) using( var waveStream = new System.IO.MemoryStream() ) { @@ -146,7 +148,7 @@ namespace FDK.メディア.サウンド.WASAPI // 完成されたメディアタイプを取得する。 this._MediaType = sourceReader.GetCurrentMediaType( (int) SharpDX.MediaFoundation.SourceReaderIndex.FirstAudioStream ); - // メディアタイプからフォーマットを取得する。(同じのはずだが念のため) + // メディアタイプからフォーマットを取得する。(同じであるはずだが念のため) this.WaveFormat = this._MediaType.ToWaveFormat( CSCore.MediaFoundation.MFWaveFormatExConvertFlags.Normal ); // 最初のオーディオストリームが選択されていることを保証する。 @@ -202,7 +204,7 @@ namespace FDK.メディア.サウンド.WASAPI } catch( Exception e ) { - FDK.Log.ERROR( $"WASAPI.Decoder の初期化に失敗しました。[{e.Message}]" ); + FDK.Log.ERROR( $"MediaFoundation SourceReader の初期化に失敗しました。[{e.Message}]" ); this._EncodedWaveData = new byte[] { }; } diff --git a/FDK24/メディア/サウンド/WASAPI/Device.cs b/FDK24/メディア/サウンド/WASAPI/Device.cs index aabf4d5..c673c1b 100644 --- a/FDK24/メディア/サウンド/WASAPI/Device.cs +++ b/FDK24/メディア/サウンド/WASAPI/Device.cs @@ -202,7 +202,7 @@ namespace FDK.メディア.サウンド.WASAPI } } - #region " 解放; Dispose-Finallize パターン " + #region " 解放; Dispose-Finalize パターン " //---------------- ~Device() { @@ -240,7 +240,6 @@ namespace FDK.メディア.サウンド.WASAPI //---------------- #endregion - private volatile CSCore.SoundOut.PlaybackState _レンダリング状態 = CSCore.SoundOut.PlaybackState.Stopped; private CSCore.CoreAudioAPI.AudioClientShareMode _共有モード; @@ -267,7 +266,6 @@ namespace FDK.メディア.サウンド.WASAPI private bool _dispose済み = false; - private void _初期化する( CSCore.WaveFormat 希望フォーマット ) { lock( this._スレッド間同期 ) @@ -281,7 +279,7 @@ namespace FDK.メディア.サウンド.WASAPI // MMDevice を取得する。 this._MMDevice = CSCore.CoreAudioAPI.MMDeviceEnumerator.DefaultAudioEndpoint( - CSCore.CoreAudioAPI.DataFlow.Render, // 方向:再生 + CSCore.CoreAudioAPI.DataFlow.Render, // 方向:書き込み CSCore.CoreAudioAPI.Role.Console ); // 用途:ゲーム、システム通知音、音声命令 // AudioClient を取得する。 @@ -326,7 +324,7 @@ namespace FDK.メディア.サウンド.WASAPI } } - // イベント駆動用に使うイベントを生成し、AudioClient へ登録する。 + // イベント駆動に使うイベントを生成し、AudioClient へ登録する。 this._レンダリングイベント = new System.Threading.EventWaitHandle( false, System.Threading.EventResetMode.AutoReset ); this._AudioClient.SetEventHandle( this._レンダリングイベント.SafeWaitHandle.DangerousGetHandle() ); @@ -384,12 +382,12 @@ namespace FDK.メディア.サウンド.WASAPI } else if( null != 最も近いフォーマット ) { - // (B) AudioClient が推奨フォーマットを返してきたなら、それを採択する。 + // (B) AudioClient が推奨フォーマットを返してきたので、それを採択する。 最終的に決定されたフォーマット = 最も近いフォーマット; } else { - // (C) AudioClient からの提案がなかった場合は、共有モードのフォーマットを採択する。 + // (C) AudioClient からの提案がなかったので、共有モードのフォーマットを採択してみる。 var 共有モードのフォーマット = this._AudioClient.GetMixFormat(); @@ -399,7 +397,7 @@ namespace FDK.メディア.サウンド.WASAPI } else { - // (D) AudioClient が共有モードのフォーマットもNGである場合は、以下から探す。 + // (D) 共有モードのフォーマットも NG である場合は、以下から探す。 CSCore.WaveFormat closest = null; @@ -415,9 +413,9 @@ namespace FDK.メディア.サウンド.WASAPI /* * 24bit PCM には対応しない。 * + * https://msdn.microsoft.com/ja-jp/library/cc371566.aspx * > wFormatTag が WAVE_FORMAT_PCM の場合、wBitsPerSample は 8 または 16 でなければならない。 * > wFormatTag が WAVE_FORMAT_EXTENSIBLE の場合、この値は、任意の 8 の倍数を指定できる。 - * https://msdn.microsoft.com/ja-jp/library/cc371566.aspx * * また、Realtek HD Audio の場合、IAudioClient.IsSupportedFormat() は 24bit PCM でも true を返してくるが、 * 単純に 1sample = 3byte で書き込んでも正常に再生できない。 @@ -440,7 +438,7 @@ namespace FDK.メディア.サウンド.WASAPI } .FirstOrDefault( ( format ) => ( this._AudioClient.IsFormatSupported( this._共有モード, format ) ) ); - // (E) それでも見つからなかったら null 。 + // (E) それでも見つからなかったら null のまま。 } } @@ -489,7 +487,7 @@ namespace FDK.メディア.サウンド.WASAPI { int イベント番号 = System.Threading.WaitHandle.WaitAny( waitHandles: イベントs, - millisecondsTimeout: (int) ( 3000.0 * this.遅延sec ), // 適正値は レイテンシ×3 [ms] (MSDN) + millisecondsTimeout: (int) ( 3000.0 * this.遅延sec ), // 適正値は レイテンシ×3 [ms] (MSDNより) exitContext: false ); if( イベント番号 == System.Threading.WaitHandle.WaitTimeout ) @@ -509,7 +507,7 @@ namespace FDK.メディア.サウンド.WASAPI if( 0 < 読み込むサイズsample ) { - // ミキサーからの出力をバッファに取得する。 + // ミキサーからの出力(32bit-float)をバッファに取得する。 int 読み込んだサイズsample = this._Mixer.Read( バッファ, 0, 読み込むサイズsample ); // バッファのデータを変換しつつ、AudioRenderClient へ出力する。 @@ -522,8 +520,9 @@ namespace FDK.メディア.サウンド.WASAPI { if( 24 == this.WaveFormat.BitsPerSample ) { - #region " (A) Mixer:32bit-float → AudioRenderClient:24bit-PCM の場合 " + #region " (A) (Mixer)32bit-float → (AudioRenderClient)24bit-PCM の場合 " //---------------- + // 以下のコードでは、まだ、まともに再生できない。おそらくザーッという大きいノイズだらけの音になる。 unsafe { byte* ptr = (byte*) bufferPtr.ToPointer(); // AudioRenderClient のバッファは GC 対象外なのでピン止め不要。 @@ -546,7 +545,7 @@ namespace FDK.メディア.サウンド.WASAPI } else if( 16 == this.WaveFormat.BitsPerSample ) { - #region " (B) Mixer:32bit-float → AudioRenderClient:16bit-PCM の場合 " + #region " (B) (Mixer)32bit-float → (AudioRenderClient)16bit-PCM の場合 " //---------------- unsafe { @@ -569,7 +568,7 @@ namespace FDK.メディア.サウンド.WASAPI } else if( 8 == this.WaveFormat.BitsPerSample ) { - #region " (C) Mixer:32bit-float → AudioRenderClient:8bit-PCM の場合 " + #region " (C) (Mixer)32bit-float → (AudioRenderClient)8bit-PCM の場合 " //---------------- unsafe { @@ -591,7 +590,7 @@ namespace FDK.メディア.サウンド.WASAPI } else if( encoding == AudioEncoding.IeeeFloat ) { - #region " (D) Mixer:32bit-float → AudioRenderClient:32bit-float の場合 " + #region " (D) (Mixer)32bit-float → (AudioRenderClient)32bit-float の場合 " //---------------- Marshal.Copy( バッファ, 0, bufferPtr, 読み込んだサイズsample ); //---------------- diff --git a/FDK24/メディア/サウンド/WASAPI/Mixer.cs b/FDK24/メディア/サウンド/WASAPI/Mixer.cs index 4c29f26..ef2e802 100644 --- a/FDK24/メディア/サウンド/WASAPI/Mixer.cs +++ b/FDK24/メディア/サウンド/WASAPI/Mixer.cs @@ -13,7 +13,7 @@ namespace FDK.メディア.サウンド.WASAPI internal class Mixer : CSCore.ISampleSource { /// - /// 音量。0.0(無音)~1.0(原音)。 + /// 音量。0.0(無音)~1.0(原音)。 /// public float Volume { @@ -62,6 +62,9 @@ namespace FDK.メディア.サウンド.WASAPI this._WaveFormat = deviceWaveFormat; } + /// + /// ミキサに登録されているサウンドをすべて停止し解放する。 + /// public void Dispose() { lock( this._スレッド間同期 ) @@ -84,11 +87,11 @@ namespace FDK.メディア.サウンド.WASAPI if( null == sound ) throw new ArgumentNullException(); - if( ( sound.SampleSource.WaveFormat.Channels != this._WaveFormat.Channels ) || - ( sound.SampleSource.WaveFormat.SampleRate != this._WaveFormat.SampleRate ) || - ( sound.SampleSource.WaveFormat.WaveFormatTag != AudioEncoding.IeeeFloat ) ) // IWaveSource.ToSampleSource() で作成した ISampleSource ならすべて 32bit-float であるはず。 + if( ( sound.SampleSource.WaveFormat.Channels != this._WaveFormat.Channels ) || // 同じチャンネル数、 + ( sound.SampleSource.WaveFormat.SampleRate != this._WaveFormat.SampleRate ) || // 同じ周波数、 + ( sound.SampleSource.WaveFormat.WaveFormatTag != AudioEncoding.IeeeFloat ) ) // 常に 32bit-float であること。 { - // これらの変換は面倒なのでサポートしない。 + // 違った場合の変換はサポートしない。 throw new ArgumentException( "ミキサーと同じチャンネル数、サンプルレート、かつ 32bit float 型である必要があります。" ); } @@ -115,7 +118,9 @@ namespace FDK.メディア.サウンド.WASAPI /// /// Sound がミキサーに登録されているかを調べる。 /// - /// Sound がミキサーに追加済みなら true 。 + /// + /// Sound がミキサーに追加済みなら true 。 + /// public bool Contains( Sound sound ) { if( null == sound ) @@ -127,7 +132,9 @@ namespace FDK.メディア.サウンド.WASAPI /// /// バッファにサウンドデータを出力する。 /// - /// 実際に出力したサンプル数。 + /// + /// 実際に出力したサンプル数。 + /// public int Read( float[] バッファ, int バッファの出力開始位置, int 出力サンプル数 ) { // ミキサに登録されている Sound の入力とこのメソッドが出力するデータはいずれも常に 32bit-float であり、 @@ -138,12 +145,12 @@ namespace FDK.メディア.サウンド.WASAPI lock( this._スレッド間同期 ) { // 中間バッファが十分あることを確認する。足りなければ新しく確保して戻ってくる。 - this._中間バッファ = this._中間バッファ.CheckBuffer( 出力サンプル数 ); // サンプル数であって、フレーム数(サンプル数×チャンネル数)ではない。 + this._中間バッファ = this._中間バッファ.CheckBuffer( 出力サンプル数 ); // サンプル数であり、フレーム数(サンプル数×チャンネル数)ではない。 - // 無音を出力する。 + // まずは無音で埋める。 Array.Clear( バッファ, 0, 出力サンプル数 ); - // ミキサに登録されているすべての Sound を出力する。 + // その上に、ミキサに登録されているすべての Sound を加算合成する。 if( 0 < this._Sounds.Count ) { for( int m = this._Sounds.Count - 1; m >= 0; m-- ) // リストから Remove する場合があるので、リストの後ろから進める。 @@ -153,14 +160,14 @@ namespace FDK.メディア.サウンド.WASAPI // 中間バッファにサウンドデータを受け取る。 int 受け取ったサンプル数 = sound.SampleSource.Read( this._中間バッファ, 0, 出力サンプル数 ); - // 中間バッファから出力バッファへ転送する。 + // 中間バッファから出力バッファへ合成する。 for( int i = バッファの出力開始位置, n = 0; n < 受け取ったサンプル数; i++, n++ ) { float data = this._中間バッファ[ n ] // 原音 - * sound.Volume // 個別音量 - * this._Volume; // ミキサ音量 + * sound.Volume // 個別音量(Sound) + * this._Volume; // マスタ音量(ミキサ) - // ベースに無音を出力済みなので、上書きじゃなく常に加算。 + // 先に無音を出力済みなので、上書きかどうかを気にしないで常に加算。 バッファ[ i ] += data; } @@ -178,9 +185,13 @@ namespace FDK.メディア.サウンド.WASAPI } private float _Volume = 1.0f; + private CSCore.WaveFormat _WaveFormat = null; + private readonly List _Sounds = new List(); + private float[] _中間バッファ = null; + private readonly object _スレッド間同期 = new object(); } } diff --git a/FDK24/メディア/サウンド/WASAPI/Sound.cs b/FDK24/メディア/サウンド/WASAPI/Sound.cs index 30efec7..0ccc571 100644 --- a/FDK24/メディア/サウンド/WASAPI/Sound.cs +++ b/FDK24/メディア/サウンド/WASAPI/Sound.cs @@ -12,6 +12,7 @@ namespace FDK.メディア.サウンド.WASAPI { get { return this._SampleSource.Length; } } + public double 長さsec { get { return this._SampleToSec( this.長さsample ); } @@ -22,6 +23,7 @@ namespace FDK.メディア.サウンド.WASAPI get { return this._SampleSource.Position; } set { this._SampleSource.Position = value; } } + public double 位置sec { get @@ -44,6 +46,7 @@ namespace FDK.メディア.サウンド.WASAPI get; protected set; } = false; + public bool 再生停止中である { get { return !this.再生中である; } @@ -54,6 +57,7 @@ namespace FDK.メディア.サウンド.WASAPI { get { return this._SampleSource; } } + public CSCore.IWaveSource WaveSource { get { return this._WaveSource; } @@ -75,17 +79,32 @@ namespace FDK.メディア.サウンド.WASAPI } /// - /// Sound の生成は、コンストラクタではなく Device.CreateSound() で行うこと。 - /// (Device 内部で持っている Mixer への参照が必要なため。) + /// Sound の生成は、コンストラクタではなく Device.CreateSound() で行うこと。 + /// (Device 内部で持っている Mixer への参照が必要なため。) /// - /// サウンドファイルパス - /// 使用する Mixer。 + /// + /// サウンドファイルパス + /// + /// + /// 使用する Mixer。 + /// internal Sound( string path, Mixer mixer ) { this._MixerRef = new WeakReference( mixer ); this._WaveSource = new DecodedWaveSource( path, mixer.WaveFormat ); this._SampleSource = this._WaveSource.ToSampleSource(); } + + /// + /// Sound の生成は、コンストラクタではなく Device.CreateSound() で行うこと。 + /// (Device 内部で持っている Mixer への参照が必要なため。) + /// + /// + /// サウンドの IWaveSource インスタンス。 + /// + /// + /// 使用する Mixer。 + /// internal Sound( IWaveSource source, Mixer mixer ) { this._MixerRef = new WeakReference( mixer ); @@ -93,6 +112,9 @@ namespace FDK.メディア.サウンド.WASAPI this._SampleSource = this._WaveSource.ToSampleSource(); } + /// + /// サウンドデータを解放する。 + /// public void Dispose() { this.Stop(); @@ -102,6 +124,12 @@ namespace FDK.メディア.サウンド.WASAPI this._MixerRef = null; } + /// + /// 再生を開始する。 + /// + /// + /// 再生開始位置。サンプル単位。(フレーム単位じゃない。) + /// public void Play( long 再生開始位置sample = 0 ) { this.位置sample = 再生開始位置sample; @@ -114,11 +142,20 @@ namespace FDK.メディア.サウンド.WASAPI } } + /// + /// 再生を開始する。 + /// + /// + /// 再生開始位置。秒単位。 + /// public void Play( double 再生開始位置sec ) { this.Play( this._SecToSample( 再生開始位置sec ) ); } + /// + /// 再生を停止する。 + /// public void Stop() { Mixer mixer; @@ -129,8 +166,11 @@ namespace FDK.メディア.サウンド.WASAPI } private CSCore.IWaveSource _WaveSource = null; + private CSCore.ISampleSource _SampleSource = null; + private System.WeakReference _MixerRef = null; + private float _Volume = 1.0f; private long _SecToSample( double 時間sec ) diff --git a/FDK24/メディア/テクスチャ.cs b/FDK24/メディア/テクスチャ.cs index abb602a..438437e 100644 --- a/FDK24/メディア/テクスチャ.cs +++ b/FDK24/メディア/テクスチャ.cs @@ -203,13 +203,19 @@ namespace FDK.メディア } protected SharpDX.Size2 ユーザ指定サイズdpx; + protected SharpDX.Direct3D11.Texture2D Texture = null; private string _画像ファイルパス = null; + private SharpDX.Direct3D11.Buffer _ConstantBuffer = null; + private SharpDX.Direct3D11.ShaderResourceView _ShaderResourceView = null; + private SharpDX.Size2F _ShaderResourceViewSize; + private SharpDX.Direct3D11.BindFlags _bindFlags; + private struct ST定数バッファの転送元データ { public SharpDX.Matrix World; // ワールド変換行列 @@ -226,8 +232,10 @@ namespace FDK.メディア public float dummy2; // float4境界に合わせるためのダミー public float dummy3; // float4境界に合わせるためのダミー }; + private ST定数バッファの転送元データ _定数バッファの転送元データ; + // (2) 全インスタンス共通項目(static) public static void 全インスタンスで共有するリソースを作成する( FDK.メディア.デバイスリソース dr ) @@ -360,10 +368,15 @@ namespace FDK.メディア } private static SharpDX.Direct3D11.VertexShader _VertexShader = null; + private static SharpDX.Direct3D11.PixelShader _PixelShader = null; + private static SharpDX.Direct3D11.BlendState _BlendState通常合成 = null; + private static SharpDX.Direct3D11.BlendState _BlendState加算合成 = null; + private static SharpDX.Direct3D11.RasterizerState _RasterizerState = null; + private static SharpDX.Direct3D11.SamplerState _SamplerState = null; } } diff --git a/FDK24/メディア/テクスチャフォント.cs b/FDK24/メディア/テクスチャフォント.cs index 6bd1da7..992a82f 100644 --- a/FDK24/メディア/テクスチャフォント.cs +++ b/FDK24/メディア/テクスチャフォント.cs @@ -64,6 +64,7 @@ namespace FDK.メディア } private FDK.メディア.テクスチャ _文字盤 = null; + private FDK.メディア.矩形リスト _文字矩形リスト = null; } } diff --git a/FDK24/メディア/デバイスリソース.cs b/FDK24/メディア/デバイスリソース.cs index 2814467..74d17ae 100644 --- a/FDK24/メディア/デバイスリソース.cs +++ b/FDK24/メディア/デバイスリソース.cs @@ -19,7 +19,7 @@ namespace FDK.メディア { get { - var カメラの位置 = new SharpDX.Vector3( 0f, 0f, ( -2f * this.dz( this.設計画面サイズdpx.Height, this.視野角deg ) ) ); + var カメラの位置 = new SharpDX.Vector3( 0f, 0f, ( -2f * this._dz( this.設計画面サイズdpx.Height, this.視野角deg ) ) ); var カメラの注視点 = new SharpDX.Vector3( 0f, 0f, 0f ); var カメラの上方向 = new SharpDX.Vector3( 0f, 1f, 0f ); var mat = SharpDX.Matrix.LookAtLH( カメラの位置, カメラの注視点, カメラの上方向 ); @@ -32,7 +32,7 @@ namespace FDK.メディア { get { - float dz = this.dz( this.設計画面サイズdpx.Height, this.視野角deg ); + float dz = this._dz( this.設計画面サイズdpx.Height, this.視野角deg ); var mat = SharpDX.Matrix.PerspectiveFovLH( SharpDX.MathUtil.DegreesToRadians( 視野角deg ), 設計画面サイズdpx.Width / 設計画面サイズdpx.Height, // アスペクト比 @@ -551,21 +551,34 @@ namespace FDK.メディア } private SharpDX.Direct2D1.Factory2 _D2DFactory2 = null; + private SharpDX.DirectWrite.Factory _DWriteFactory = null; + private SharpDX.WIC.ImagingFactory2 _WicImagingFactory2 = null; + private SharpDX.MediaFoundation.DXGIDeviceManager _DXGIDeviceManager = null; + private SharpDX.DXGI.SwapChain1 _SwapChain1 = null; + private SharpDX.Mathematics.Interop.RawViewportF[] _D3DViewPort = new SharpDX.Mathematics.Interop.RawViewportF[ 1 ]; + private SharpDX.Direct3D11.DepthStencilState _D3DDepthStencilState = null; + private SharpDX.Direct3D11.RenderTargetView _D3DRenderTargetView = null; + private SharpDX.Direct3D11.Texture2D _D3DDepthStencil = null; + private SharpDX.Direct3D11.DepthStencilView _D3DDepthStencilView = null; + private SharpDX.Direct3D11.DeviceDebug _D3DDeviceDebug = null; + private SharpDX.Direct2D1.Device1 _D2DDevice1 = null; + private SharpDX.Direct2D1.DeviceContext1 _D2DContext1 = null; + private SharpDX.Direct2D1.Bitmap1 _D2DRenderTargetBitmap = null; - private float dz( float 高さdpx, float 視野角deg ) + private float _dz( float 高さdpx, float 視野角deg ) { return (float) ( 高さdpx / ( 4.0 * Math.Tan( SharpDX.MathUtil.DegreesToRadians( 視野角deg / 2.0f ) ) ) ); } diff --git a/FDK24/メディア/動画.cs b/FDK24/メディア/動画.cs index 7925e11..454e00a 100644 --- a/FDK24/メディア/動画.cs +++ b/FDK24/メディア/動画.cs @@ -342,6 +342,7 @@ namespace FDK.メディア } private int _キューのサイズ = 0; + private class FrameQueueItem : IDisposable { public double 表示時刻sec = 0; @@ -352,16 +353,27 @@ namespace FDK.メディア FDK.Utilities.解放する( ref this.D2DBitmap ); } } + private ConcurrentQueue _フレームキュー = null; + private FrameQueueItem _最後に表示したフレーム = null; + private bool _ループ再生する = false; + private System.Threading.Tasks.Task _デコードタスク = null; + private System.Threading.AutoResetEvent _デコードタスク起動完了 = null; + private System.Threading.ManualResetEvent _キューが空いた = null; + private System.Threading.AutoResetEvent _デコードタスクを終了せよ = null; + private SharpDX.MediaFoundation.SourceReaderEx _SourceReaderEx = null; + private SharpDX.MediaFoundation.MediaType _MediaType = null; + private SharpDX.WIC.Bitmap _WicBitmap = null; // MediaFoundation は WICBitmap に出力する。 + private SharpDX.Direct2D1.DeviceContext1 _デコードタスク用D2DDeviceContext参照 = null; // D2Dはスレッドセーフであること。 private void _キューをクリアする() @@ -410,6 +422,7 @@ namespace FDK.メディア } ); } + // 以下、デコードタスク用。 private FDK.同期.RWLock _再生タイマ = new 同期.RWLock<カウンタ.QPCTimer>(); diff --git a/FDK24/メディア/文字列画像.cs b/FDK24/メディア/文字列画像.cs index d89b648..1e4feaf 100644 --- a/FDK24/メディア/文字列画像.cs +++ b/FDK24/メディア/文字列画像.cs @@ -200,9 +200,13 @@ namespace FDK.メディア } private string _前回の表示文字列 = null; + private SharpDX.DirectWrite.TextFormat _テキストフォーマット = null; + private SharpDX.DirectWrite.TextLayout _テキストレイアウト = null; + private SharpDX.Direct2D1.SolidColorBrush _白ブラシ = null; + private SharpDX.Direct2D1.SolidColorBrush _黒ブラシ = null; } } diff --git a/FDK24/メディア/画像.cs b/FDK24/メディア/画像.cs index 3fb684b..5e2c219 100644 --- a/FDK24/メディア/画像.cs +++ b/FDK24/メディア/画像.cs @@ -139,6 +139,7 @@ namespace FDK.メディア } protected string 画像ファイルパス = null; + protected SharpDX.Direct2D1.Bitmap1 Bitmap = null; protected void 画像を生成する( FDK.メディア.デバイスリソース dr, SharpDX.Direct2D1.BitmapProperties1 bitmapProperties1 = null ) diff --git a/FDK24/メディア/画像フォント.cs b/FDK24/メディア/画像フォント.cs index 751aa16..c4dcab8 100644 --- a/FDK24/メディア/画像フォント.cs +++ b/FDK24/メディア/画像フォント.cs @@ -54,6 +54,7 @@ namespace FDK.メディア } private FDK.メディア.画像 _文字盤 = null; + private FDK.メディア.矩形リスト _文字矩形リスト = null; } } diff --git a/FDK24/入力/個別/Keyboard.cs b/FDK24/入力/個別/Keyboard.cs index 14515d3..febd740 100644 --- a/FDK24/入力/個別/Keyboard.cs +++ b/FDK24/入力/個別/Keyboard.cs @@ -227,12 +227,16 @@ namespace FDK.入力 } private const int _デバイスの入力バッファサイズ = 32; + private SharpDX.DirectInput.Keyboard _Device = null; // キーボードがアタッチされていない場合は null 。 + private IntPtr _Window = IntPtr.Zero; + /// /// ポーリングごとに累積更新された最終の結果。 /// private readonly bool[] _現在のキーの押下状態 = new bool[ 256 ]; + private readonly List _入力イベントリスト = new List(); } } diff --git a/FDK24/入力/個別/MidiIn.cs b/FDK24/入力/個別/MidiIn.cs index cc365d7..cd01146 100644 --- a/FDK24/入力/個別/MidiIn.cs +++ b/FDK24/入力/個別/MidiIn.cs @@ -207,10 +207,15 @@ namespace FDK.入力 } private List _MIDI入力デバイスハンドルリスト = null; + private List _蓄積用入力イベントリスト = null; // コールバック関数で蓄積され、ポーリング時にキャッシュへコピー&クリアされる。 + private List _入力イベントリストキャッシュ = null; // ポーリング時のキャッシュ。 + private MidiInProc _midiInProc = null; // 全MIDI入力デバイスで共通のコールバックのデリゲートとGCHandleと本体メソッド。 + private System.Runtime.InteropServices.GCHandle _midiInProcGCh; + private readonly object _コールバック同期 = new object(); #region " Win32 API " diff --git a/FDK24/同期/AutoD3DDeviceLock.cs b/FDK24/同期/AutoD3DDeviceLock.cs index 6b29e12..2bd2486 100644 --- a/FDK24/同期/AutoD3DDeviceLock.cs +++ b/FDK24/同期/AutoD3DDeviceLock.cs @@ -26,6 +26,7 @@ namespace FDK.同期 } private SharpDX.MediaFoundation.DXGIDeviceManager _DeviceManager = null; + private IntPtr _DeviceHandle = IntPtr.Zero; /// diff --git a/FDK24/同期/RWLock.cs b/FDK24/同期/RWLock.cs index 11e1a7b..c5c149d 100644 --- a/FDK24/同期/RWLock.cs +++ b/FDK24/同期/RWLock.cs @@ -64,6 +64,7 @@ namespace FDK.同期 } private T _Value = default( T ); + private readonly ReaderWriterLockSlim _スレッド間同期; } } diff --git a/FDK24/同期/TriStateEvent.cs b/FDK24/同期/TriStateEvent.cs index 3a2477f..b42caf1 100644 --- a/FDK24/同期/TriStateEvent.cs +++ b/FDK24/同期/TriStateEvent.cs @@ -113,9 +113,13 @@ namespace FDK.同期 } private 状態種別 _状態 = 状態種別.OFF; + private ManualResetEvent _無効イベント = null; + private ManualResetEvent _ONイベント = null; + private ManualResetEvent _OFFイベント = null; + private readonly object _スレッド間同期 = new object(); } } diff --git a/StrokeStyleT/StrokeStyleT.cs b/StrokeStyleT/StrokeStyleT.cs index 7b103ea..2ef6bb1 100644 --- a/StrokeStyleT/StrokeStyleT.cs +++ b/StrokeStyleT/StrokeStyleT.cs @@ -85,7 +85,6 @@ namespace SST StrokeStyleT.MIDI入力?.ポーリングする(); } - static StrokeStyleT() { // フォルダ変数を真っ先に登録する。(ほかのメンバのコンストラクタでフォルダ変数を利用できるようにするため。) @@ -115,9 +114,9 @@ namespace SST this._MainForm = new RenderForm(); this._MainForm.BackColor = System.Drawing.Color.Black; this._MainForm.AllowUserResizing = false; // ユーザはフォームサイズを変更できない。 - this._MainForm.UserResized += フォームサイズが変更された; + this._MainForm.UserResized += _フォームサイズが変更された; this._MainForm.FormClosing += ( sender, e ) => { - this.終了する(); + this._終了する(); }; } @@ -134,19 +133,19 @@ namespace SST switch( this._State ) { case ApplicationState.起動: - this.起動する(); + this._起動する(); this._State = ApplicationState.初期化; break; // 初期化に移る前に、一度ウィンドウメッセージ処理を行わせて、画面を再描画させる。 case ApplicationState.初期化: - this.初期化する(); + this._初期化する(); this._State = ApplicationState.進行描画; break; case ApplicationState.進行描画: - this.進行描画する(); + this._進行描画する(); if( this._State == ApplicationState.終了 ) - this.終了する(); + this._終了する(); break; case ApplicationState.終了: @@ -223,30 +222,52 @@ namespace SST #endregion private enum ApplicationState { 起動, 初期化, 進行描画, 終了 } + private ApplicationState _State; + private SST.RenderForm _MainForm = null; + private SharpDX.Size2F _設計画面サイズdpx = SharpDX.Size2F.Empty; + private ConcurrentQueue _ビュアーメッセージキュー = new ConcurrentQueue(); + private FDK.メディア.デバイスリソース _デバイスリソース = null; + private SST.ステージ.ステージ _最初のダミーステージ = null; + private SST.ステージ.起動.起動ステージ _起動ステージ = null; + private SST.ステージ.タイトル.タイトルステージ _タイトルステージ = null; + private SST.ステージ.ログイン.ログインステージ _ログインステージ = null; + private SST.ステージ.選曲.選曲ステージ _選曲ステージ = null; + private SST.ステージ.曲読込.曲読込ステージ _曲読込ステージ = null; + private SST.ステージ.演奏.演奏ステージ _演奏ステージ = null; + private SST.ステージ.結果.結果ステージ _結果ステージ = null; + private SST.ステージ.ステージ _現在のステージ = null; + private static SST.フォルダ _フォルダ = null; + private static FDK.入力.Keyboard _キーボード入力 = null; + private static FDK.入力.MidiIn _MIDI入力 = null; + private static FDK.メディア.サウンド.WASAPI.Device _サウンドデバイス = null; + private static readonly System.Random _乱数 = new Random( DateTime.Now.Millisecond ); + private static SST.ユーザ.ユーザ管理 _ユーザ管理 = null; + private static SST.曲.曲ツリー管理 _曲ツリー管理 = null; + private static SST.設定.Config _Config = null; - private void 起動する() + private void _起動する() { FDK.Log.現在のスレッドに名前をつける( "Render" ); FDK.Log.BeginInfo( $"{FDK.Utilities.現在のメソッド名}" ); @@ -277,7 +298,7 @@ namespace SST FDK.Log.EndInfo( $"{FDK.Utilities.現在のメソッド名}" ); } - private void 初期化する() + private void _初期化する() { FDK.Log.BeginInfo( $"{FDK.Utilities.現在のメソッド名}" ); @@ -365,7 +386,7 @@ namespace SST // F11 → 画面モードの切り替え if( arg.KeyCode == System.Windows.Forms.Keys.F11 ) { - this.全画面モードとウィンドウモードを切り替える(); + this._全画面モードとウィンドウモードを切り替える(); arg.Handled = true; } }; @@ -376,7 +397,7 @@ namespace SST FDK.Log.EndInfo( $"{FDK.Utilities.現在のメソッド名}" ); } - private void 終了する() + private void _終了する() { FDK.Log.BeginInfo( $"{FDK.Utilities.現在のメソッド名}" ); Debug.Assert( null != this._デバイスリソース, "デバイスリソースが解放される前であること。" ); @@ -395,7 +416,7 @@ namespace SST this._選曲ステージ = null; this._曲読込ステージ = null; this._演奏ステージ.BGMを停止する(); - this._演奏ステージ?.BGMのキャッシュを解放する(); // BGMのキャッシュ(デコード済み WaveSrouce)を解放。 + this._演奏ステージ?.BGMのキャッシュを解放する(); // BGMのキャッシュ(デコード済み WaveSource)を解放。 this._演奏ステージ = null; this._結果ステージ = null; //---------------- @@ -455,7 +476,7 @@ namespace SST FDK.Log.EndInfo( $"{FDK.Utilities.現在のメソッド名}" ); } - private void 進行描画する() + private void _進行描画する() { #region " D3Dデバイスが消失していれば再構築する。" //---------------- @@ -532,7 +553,7 @@ namespace SST { // ビュアー用ユーザでログインする。 FDK.Log.Info( "ビュアーモード: AutoPlayer ユーザでログインします。" ); - this.ログインする( Properties.Resources.AUTOPLAYER ); + this._ログインする( Properties.Resources.AUTOPLAYER ); // 曲読込ステージ向けの初期設定。 StrokeStyleT.曲ツリー管理.現在の管理対象ツリー = null; @@ -672,7 +693,7 @@ namespace SST #region " ビュアーメッセージがあれば処理する。" //---------------- - var msg = this.ビュアーメッセージを取得する(); + var msg = this._ビュアーメッセージを取得する(); StrokeStyleT.最後に取得したビュアーメッセージ = msg; // 保存する。(演奏ステージに対して公開する) @@ -785,7 +806,7 @@ namespace SST #endregion } - private void デバイス依存リソースを解放する() + private void _デバイス依存リソースを解放する() { FDK.Log.BeginInfo( $"{FDK.Utilities.現在のメソッド名}" ); Debug.Assert( null != this._デバイスリソース ); // 解放前であること。 @@ -795,7 +816,7 @@ namespace SST FDK.Log.EndInfo( $"{FDK.Utilities.現在のメソッド名}" ); } - private void デバイス依存リソースを再構築する() + private void _デバイス依存リソースを再構築する() { FDK.Log.BeginInfo( $"{FDK.Utilities.現在のメソッド名}" ); Debug.Assert( null != this._デバイスリソース ); // 再生成済みであること。 @@ -805,7 +826,7 @@ namespace SST FDK.Log.EndInfo( $"{FDK.Utilities.現在のメソッド名}" ); } - private void フォームサイズが変更された( object sender, EventArgs e ) + private void _フォームサイズが変更された( object sender, EventArgs e ) { FDK.Log.BeginInfo( $"{FDK.Utilities.現在のメソッド名}" ); FDK.Log.Info( $"新しいクライアントサイズ = {this._MainForm.ClientSize}" ); @@ -844,7 +865,7 @@ namespace SST FDK.Log.Info( $"現在、全画面モードである = {this._MainForm.IsFullscreen}" ); // (1) リソースを解放して、 - this.デバイス依存リソースを解放する(); + this._デバイス依存リソースを解放する(); this._デバイスリソース.サイズに依存するリソースを解放する(); // (2) 物理画面サイズを変更して、 @@ -852,12 +873,12 @@ namespace SST // (3) リソースを再構築する。 this._デバイスリソース.サイズに依存するリソースを作成する(); - this.デバイス依存リソースを再構築する(); + this._デバイス依存リソースを再構築する(); FDK.Log.EndInfo( $"{FDK.Utilities.現在のメソッド名}" ); } - private void 全画面モードとウィンドウモードを切り替える() + private void _全画面モードとウィンドウモードを切り替える() { FDK.Log.BeginInfo( $"{FDK.Utilities.現在のメソッド名}" ); @@ -867,7 +888,7 @@ namespace SST FDK.Log.EndInfo( $"{FDK.Utilities.現在のメソッド名}" ); } - private void ログインする( string ユーザ名 ) + private void _ログインする( string ユーザ名 ) { StrokeStyleT.ユーザ管理.ユーザを選択する( ユーザ名 ); FDK.Log.Info( $"ユーザが選択されました。[{StrokeStyleT.ユーザ管理.現在選択されているユーザ.名前}]" ); @@ -876,7 +897,7 @@ namespace SST /// /// メッセージがない場合は null を返す。 /// - private ViewerMessage ビュアーメッセージを取得する() + private ViewerMessage _ビュアーメッセージを取得する() { var msg = (ViewerMessage) null; diff --git a/StrokeStyleT/インストーラー/InnoSetupScript for SST.iss b/StrokeStyleT/インストーラー/InnoSetupScript for SST.iss index ce07a7b..f86332a 100644 --- a/StrokeStyleT/インストーラー/InnoSetupScript for SST.iss +++ b/StrokeStyleT/インストーラー/InnoSetupScript for SST.iss @@ -7,7 +7,7 @@ #define MyAppName "StrokeStyle" #define MyAppName2 "SSTEditor" #define MyAppFolderName "StrokeStyleT" -#define MyAppVersion "1.2.17" +#define MyAppVersion "1.18" #define MyAppPublisher "‚­‚Ü‚©‚ݍH–[" #define MyAppExeName "StrokeStyleT.exe" #define MyAppExeName2 "SSTFEditor.exe" @@ -26,16 +26,19 @@ OutputDir= ; setup ƒtƒ@ƒCƒ‹–¼B OutputBaseFilename=sstsetup-{#MyAppVersion} ; ƒAƒvƒŠ–¼B -AppName={#MyAppName} ; ƒAƒvƒŠ‚̃o[ƒWƒ‡ƒ“BiƒRƒ“ƒgƒ[ƒ‹ƒpƒlƒ‹—pj +AppName={#MyAppName} +; ƒAƒvƒŠ‚̃o[ƒWƒ‡ƒ“BiƒRƒ“ƒgƒ[ƒ‹ƒpƒlƒ‹—pj AppVersion={#MyAppVersion} ; ƒAƒvƒŠ–¼{ƒo[ƒWƒ‡ƒ“B AppVerName={#MyAppName} {#MyAppVersion} ; ƒAƒvƒŠ‚Ì”z•zŒ³B(ƒRƒ“ƒgƒ[ƒ‹ƒpƒlƒ‹—pj -AppPublisher={#MyAppPublisher} ; ƒAƒvƒŠ‚Ì”z•zŒ³WebƒTƒCƒg‚ÌURLBiƒRƒ“ƒgƒ[ƒ‹ƒpƒlƒ‹—pj +AppPublisher={#MyAppPublisher} +; ƒAƒvƒŠ‚Ì”z•zŒ³WebƒTƒCƒg‚ÌURLBiƒRƒ“ƒgƒ[ƒ‹ƒpƒlƒ‹—pj ;AppPublisherURL= ; Žg—p‹–‘ø LicenseFile=Licence.txt -; ƒpƒXƒ[ƒh ;Password= +; ƒpƒXƒ[ƒh +;Password= ; ƒCƒ“ƒXƒg[ƒ‹‚ÌŽÀs‘O‚É•\Ž¦‚·‚éî•ñB ;InfoBeforeFile= ; ƒ†[ƒUî•ñ‚Ì“ü—͉æ–Ê‚ðo‚·H @@ -52,7 +55,8 @@ DefaultGroupName={#MyAppFolderName} DisableReadyPage=no ; ƒCƒ“ƒXƒg[ƒ‹‚ÌŽÀsŒã‚É•\Ž¦‚·‚éî•ñB ;InfoAfterFile= -; uƒZƒbƒgƒAƒbƒv‚ªI—¹‚µ‚Ü‚µ‚½v‰æ–Ê‚ðo‚³‚È‚¢H DisableFinishedPage=no +; uƒZƒbƒgƒAƒbƒv‚ªI—¹‚µ‚Ü‚µ‚½v‰æ–Ê‚ðo‚³‚È‚¢H +DisableFinishedPage=no ; ˆ³kŒ`Ž®B Compression=lzma2/max SolidCompression=yes @@ -80,6 +84,7 @@ Source: "{#MyAppBin}\SSTFormat.dll"; DestDir: "{app}"; Flags: ignoreversion recu Source: "{#MyAppBin}\StrokeStyleT.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs ;Source: "{#MyAppBin}\StrokeStyleT.exe.config"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs Source: "{#MyAppBin}\SSTFEditor.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs +Source: "{#MyAppBin}\ja-JP\*"; DestDir: "{app}\ja-JP"; Flags: ignoreversion recursesubdirs Source: "{#MyAppBin}\images\*"; DestDir: "{app}\images"; Flags: ignoreversion recursesubdirs Source: "{#MyAppBin}\sounds\*"; DestDir: "{app}\sounds"; Flags: ignoreversion recursesubdirs Source: "{#MyAppBin}\songs\*"; DestDir: "{app}\songs"; Flags: ignoreversion recursesubdirs diff --git a/StrokeStyleT/ステージ/ドラムセット.cs b/StrokeStyleT/ステージ/ドラムセット.cs index fdb0f04..07963a8 100644 --- a/StrokeStyleT/ステージ/ドラムセット.cs +++ b/StrokeStyleT/ステージ/ドラムセット.cs @@ -66,18 +66,31 @@ namespace SST.ステージ } private float _ハイハットの開度 = 1.0f; + private FDK.メディア.画像 _HiHatTop; + private FDK.メディア.画像 _HiHatBottom; + private FDK.メディア.画像 _Snare; + private FDK.メディア.画像 _Bass; + private FDK.メディア.画像 _HiTom; + private FDK.メディア.画像 _LowTom; + private FDK.メディア.画像 _FloorTom; + private FDK.メディア.画像 _LCymbal; + private FDK.メディア.画像 _LCymbalStand; + private FDK.メディア.画像 _LCymbalTop; + private FDK.メディア.画像 _RCymbal; + private FDK.メディア.画像 _RCymbalStand; + private FDK.メディア.画像 _RCymbalTop; } } diff --git a/StrokeStyleT/ステージ/フェードアウト.cs b/StrokeStyleT/ステージ/フェードアウト.cs index 72e6b28..ad60d00 100644 --- a/StrokeStyleT/ステージ/フェードアウト.cs +++ b/StrokeStyleT/ステージ/フェードアウト.cs @@ -51,6 +51,7 @@ namespace SST.ステージ } private float _総フェード時間sec = 1.0f; + private FDK.カウンタ.単純増加後不変カウンタ _透明度カウンタ = new FDK.カウンタ.単純増加後不変カウンタ(); } } diff --git a/StrokeStyleT/ステージ/フェードイン.cs b/StrokeStyleT/ステージ/フェードイン.cs index d9eb5c6..9c47d98 100644 --- a/StrokeStyleT/ステージ/フェードイン.cs +++ b/StrokeStyleT/ステージ/フェードイン.cs @@ -51,6 +51,7 @@ namespace SST.ステージ } private float _総フェード時間sec = 1.0f; + private FDK.カウンタ.単純増加後不変カウンタ _透明度カウンタ = new FDK.カウンタ.単純増加後不変カウンタ(); } } diff --git a/StrokeStyleT/ステージ/ログイン/ログインステージ.cs b/StrokeStyleT/ステージ/ログイン/ログインステージ.cs index aad32c3..cd747c5 100644 --- a/StrokeStyleT/ステージ/ログイン/ログインステージ.cs +++ b/StrokeStyleT/ステージ/ログイン/ログインステージ.cs @@ -123,6 +123,7 @@ namespace SST.ステージ.ログイン } private List _ユーザパネル = null; + private FDK.メディア.文字列画像 _ログイン画面見出し = null; } } diff --git a/StrokeStyleT/ステージ/演奏/コンボ.cs b/StrokeStyleT/ステージ/演奏/コンボ.cs index 32cb673..4d90741 100644 --- a/StrokeStyleT/ステージ/演奏/コンボ.cs +++ b/StrokeStyleT/ステージ/演奏/コンボ.cs @@ -150,13 +150,19 @@ namespace SST.ステージ.演奏 } private const float _ドラムコンボの文字間隔 = 2f; + private const int _表示可能な最小コンボ数 = 11; private EMode _現在のモード; + private int _前回のCOMBO値 = 0; + private long _コンボが切れた時刻 = FDK.カウンタ.QPCTimer.未使用; + private int _コンボが切れたときのCOMBO値 = 0; + private コンボジャンプ _単位付き数値 = null; + private ReaderWriterLockSlim スレッド間同期 = null; } } diff --git a/StrokeStyleT/ステージ/演奏/コンボジャンプ.cs b/StrokeStyleT/ステージ/演奏/コンボジャンプ.cs index 2e9c890..ffd7b84 100644 --- a/StrokeStyleT/ステージ/演奏/コンボジャンプ.cs +++ b/StrokeStyleT/ステージ/演奏/コンボジャンプ.cs @@ -134,7 +134,9 @@ namespace SST.ステージ.演奏 } private int _現在の数値 = -1; + private FDK.メディア.画像 _数値と単位の画像 = null; + private readonly List _文字矩形dpx = new List() { #region " [0]~[9]: '0'~'9', [10]:'COMBO' " //---------------- @@ -152,11 +154,17 @@ namespace SST.ステージ.演奏 //---------------- #endregion }; + private const int _桁ごとのジャンプの遅れ = 50; // 1桁につき 50 インデックス遅れる + private const float _不透明度0to1 = 0.7f; + private int _ジャンプインデックス値 = 9999; + private int[] _ジャンプ差分値 = new int[ 180 ]; + private FDK.カウンタ.定間隔進行 _ジャンプインデックス進行 = null; + private System.Threading.ReaderWriterLockSlim _スレッド間同期 = null; } } diff --git a/StrokeStyleT/ステージ/演奏/スクロール譜面.cs b/StrokeStyleT/ステージ/演奏/スクロール譜面.cs index ba1198e..45461d1 100644 --- a/StrokeStyleT/ステージ/演奏/スクロール譜面.cs +++ b/StrokeStyleT/ステージ/演奏/スクロール譜面.cs @@ -192,16 +192,22 @@ namespace SST.ステージ.演奏 } private bool _活性化した直後である = false; + /// /// 演奏スコア.チップリスト[] のうち、描画を始めるチップのインデックス番号を示す。 /// 演奏開始直後は 0 で始まり、対象番号のチップが描画範囲を流れ去るたびに +1 される。 /// 未演奏時・演奏終了時は -1 。 /// private int _描画開始チップ番号 = -1; + private FDK.メディア.画像 _チップ画像 = null; + private FDK.メディア.矩形リスト _チップ画像の矩形リスト = null; + private Dictionary _ヒット判定を行うチップと対応するレーン = null; + private FDK.カウンタ.単純増加後反復カウンタ _チップアニメ = new FDK.カウンタ.単純増加後反復カウンタ(); + private readonly Dictionary _レーン種別toレーンフレーム左端からの相対X位置dpx = new Dictionary() { { SSTFormat.レーン種別.LeftCrash, +36f }, { SSTFormat.レーン種別.HiHat, +105f }, @@ -213,8 +219,11 @@ namespace SST.ステージ.演奏 { SSTFormat.レーン種別.Tom3, +544f }, { SSTFormat.レーン種別.RightCrash, +632f }, }; + private float _画面の高さdpx = 0f; // 進行スレッドからはデバイスリソースを参照しないので、ここにキャッシュしておく。 + private FDK.同期.TriStateEvent _高頻度進行タスクへのイベント = null; + private readonly object _スレッド間同期 = new object(); private void _画面内に収まるチップをすべて進行描画する( デバイスリソース dr, Action<デバイスリソース, SSTFormat.チップ, float> 描画アクション, double 現在の演奏時刻sec ) diff --git a/StrokeStyleT/ステージ/演奏/ドラムサウンド.cs b/StrokeStyleT/ステージ/演奏/ドラムサウンド.cs index 419dac5..7e67ea5 100644 --- a/StrokeStyleT/ステージ/演奏/ドラムサウンド.cs +++ b/StrokeStyleT/ステージ/演奏/ドラムサウンド.cs @@ -62,6 +62,7 @@ namespace SST.ステージ.演奏 } private const int _多重度 = 2; + private class Cコンテキスト : IDisposable { public FDK.メディア.サウンド.WASAPI.Sound[] Sounds = new FDK.メディア.サウンド.WASAPI.Sound[ ドラムサウンド._多重度 ]; @@ -79,8 +80,11 @@ namespace SST.ステージ.演奏 } } }; + private Dictionary _チップtoコンテキスト = null; + private readonly string _KitXmlファイルパス = @"$(Static)\sounds\Kit.xml"; + private readonly object _スレッド間同期 = new object(); private void _すべてのコンテキストを初期化する() diff --git a/StrokeStyleT/ステージ/演奏/ヒット判定文字列.cs b/StrokeStyleT/ステージ/演奏/ヒット判定文字列.cs index 19be4a8..215fb5c 100644 --- a/StrokeStyleT/ステージ/演奏/ヒット判定文字列.cs +++ b/StrokeStyleT/ステージ/演奏/ヒット判定文字列.cs @@ -233,7 +233,9 @@ namespace SST.ステージ.演奏 this.透明度0to1 = 1.0f; } } + private Dictionary<ヒットレーン種別, 進行描画コンテキスト> _ヒット判定レーンto進行描画コンテキスト = null; + private readonly Dictionary<ヒット判定種別, FDK.メディア.画像> _文字列画像 = new Dictionary<ヒット判定種別, 画像>() { { ヒット判定種別.PERFECT, new 画像( @"$(Static)\images\Judge Perfect.png" ) }, { ヒット判定種別.GREAT, new 画像( @"$(Static)\images\Judge Great.png" ) }, @@ -242,6 +244,7 @@ namespace SST.ステージ.演奏 { ヒット判定種別.MISS, new 画像( @"$(Static)\images\Judge Miss.png" ) }, { ヒット判定種別.AUTO, new 画像( @"$(Static)\images\Judge Auto.png" ) }, }; + private readonly object _スレッド間同期 = new object(); } } diff --git a/StrokeStyleT/ステージ/演奏/回転羽.cs b/StrokeStyleT/ステージ/演奏/回転羽.cs index 6dbd69d..e0a8a4c 100644 --- a/StrokeStyleT/ステージ/演奏/回転羽.cs +++ b/StrokeStyleT/ステージ/演奏/回転羽.cs @@ -120,8 +120,11 @@ namespace SST.ステージ.演奏 public float サイズ; public FDK.カウンタ.単純増加後不変カウンタ 進行カウンタ; } + private コンテキスト[] _コンテキスト = null; + private FDK.メディア.画像 _羽画像 = null; + private readonly object _スレッド間同期 = new object(); } } diff --git a/StrokeStyleT/ステージ/演奏/演奏ステージ.cs b/StrokeStyleT/ステージ/演奏/演奏ステージ.cs index c5f175b..82f9a57 100644 --- a/StrokeStyleT/ステージ/演奏/演奏ステージ.cs +++ b/StrokeStyleT/ステージ/演奏/演奏ステージ.cs @@ -336,27 +336,44 @@ namespace SST.ステージ.演奏 } private bool _活性化した直後である = false; + private double _演奏開始時刻sec = 0.0; + private bool _Autoチップのドラム音を再生する = true; + private readonly SST.ステージ.演奏.コンボ _コンボ; + private readonly SST.ステージ.演奏.レーンフレーム _レーンフレーム; + private readonly SST.ステージ.演奏.スクロール譜面 _スクロール譜面; + private readonly SST.ステージ.演奏.ヒット判定文字列 _ヒット判定文字列; + private readonly SST.ステージ.演奏.回転羽 _回転羽 = new 回転羽( 32 ); + private readonly SST.ステージ.演奏.ドラムサウンド _ドラムサウンド; + private readonly SST.ステージ.ドラムセット _ドラムセット; + private readonly FDK.メディア.画像 _判定バー; + private readonly FDK.メディア.画像 _ステージ台; + private readonly FDK.メディア.文字列画像 _FPS画像; + private FDK.同期.RWLock _背景動画開始済み = new FDK.同期.RWLock( false ); + private bool _BGM再生開始済み = false; + private FDK.同期.RWLock _現在進行描画中の譜面スクロール速度の倍率 = new FDK.同期.RWLock( 0.0 ); + /// /// 停止と解放は、演奏ステージクラスの非活性化後に、外部から行われる。 /// /// /// private FDK.メディア.サウンド.WASAPI.Sound _BGM = null; + /// /// BGM の生成もとになるデコード済みサウンドデータ。 /// @@ -365,7 +382,9 @@ namespace SST.ステージ.演奏 /// 演奏ステージインスタンスを破棄する際に、このインスタンスもDisposeすること。 /// private FDK.メディア.サウンド.WASAPI.DecodedWaveSource _デコード済みWaveSource = null; + private FDK.メディア.動画 _背景動画 = null; + private FDK.カウンタ.FPS _FPS = null; private double _現在の演奏時刻secを返す() diff --git a/StrokeStyleT/ステージ/結果/結果ステージ.cs b/StrokeStyleT/ステージ/結果/結果ステージ.cs index e264137..e2873d1 100644 --- a/StrokeStyleT/ステージ/結果/結果ステージ.cs +++ b/StrokeStyleT/ステージ/結果/結果ステージ.cs @@ -101,9 +101,13 @@ namespace SST.ステージ.結果 } private bool _活性化した直後である = false; + private FDK.メディア.動画 _背景動画; + private FDK.メディア.画像 _背景画像; + private FDK.メディア.画像 _結果表示パラメータパネル; + private FDK.メディア.画像フォント _結果表示パラメータ; } } diff --git a/StrokeStyleT/ステージ/起動/起動ステージ.cs b/StrokeStyleT/ステージ/起動/起動ステージ.cs index cac63ab..c1bd8c3 100644 --- a/StrokeStyleT/ステージ/起動/起動ステージ.cs +++ b/StrokeStyleT/ステージ/起動/起動ステージ.cs @@ -131,9 +131,13 @@ namespace SST.ステージ.起動 } private FDK.カウンタ.単純増加後不変カウンタ _フェーズカウンタ = null; + private readonly FDK.メディア.画像 _背景画像; + private readonly FDK.メディア.画像 _フェードインアウト兼用パネル; + private readonly SST.ステージ.フェードイン _フェードイン; + private readonly SST.ステージ.フェードアウト _フェードアウト; } } diff --git a/StrokeStyleT/ステージ/選曲/曲パネルビュー.cs b/StrokeStyleT/ステージ/選曲/曲パネルビュー.cs index 6fda5ff..878f3cc 100644 --- a/StrokeStyleT/ステージ/選曲/曲パネルビュー.cs +++ b/StrokeStyleT/ステージ/選曲/曲パネルビュー.cs @@ -194,7 +194,7 @@ namespace SST.ステージ.選曲 } else { - this.パネルを一枚描画する( dr, 描画する曲, パネル位置, これはカーソル位置のパネルである: false ); + this._パネルを一枚描画する( dr, 描画する曲, パネル位置, これはカーソル位置のパネルである: false ); } // 次のノードへ移動。(選択ノードは移動しない。) @@ -207,7 +207,7 @@ namespace SST.ステージ.選曲 if( ( 0 <= this._カーソル位置.X ) && ( 9 > this._カーソル位置.X ) && ( 0 <= this._カーソル位置.Y ) && ( 3 > this._カーソル位置.Y ) ) { - this.パネルを一枚描画する( + this._パネルを一枚描画する( dr, カーソル位置の曲, // 先の for ループ内で取得済み。 this._カーソル位置, @@ -218,14 +218,19 @@ namespace SST.ステージ.選曲 } private const float _カーソル位置のパネルの拡大率 = 1.25f; + private bool _活性化した直後である = false; + private FDK.メディア.テクスチャ _Nullパネルの画像; + private FDK.カウンタ.定間隔進行 _横スクロール用カウンタ = null; + /// /// 左上隅のパネルを (0,0) とした時の、カーソル位置の座標。 /// 負数も可。 /// private SharpDX.Point _カーソル位置 = new SharpDX.Point( 4, 1 ); + /// /// -63~63。パネル全体の表示位置を、負数は å·¦ へ、正数は 右 へずらす 。(正負と左右の対応に注意。) /// @@ -240,7 +245,7 @@ namespace SST.ステージ.選曲 /// /// null 可。 /// - private void パネルを一枚描画する( デバイスリソース dr, 曲.Node パネルノード, SharpDX.Point パネル位置, bool これはカーソル位置のパネルである = false ) + private void _パネルを一枚描画する( デバイスリソース dr, 曲.Node パネルノード, SharpDX.Point パネル位置, bool これはカーソル位置のパネルである = false ) { // 画面を見ながら直観的に調整した固定パラメータたち。 const float 見かけの倍率 = 3.0f; diff --git a/StrokeStyleT/ステージ/選曲/選曲ステージ.cs b/StrokeStyleT/ステージ/選曲/選曲ステージ.cs index 7749ad7..121387b 100644 --- a/StrokeStyleT/ステージ/選曲/選曲ステージ.cs +++ b/StrokeStyleT/ステージ/選曲/選曲ステージ.cs @@ -137,9 +137,13 @@ namespace SST.ステージ.選曲 } private bool _活性化した直後である = false; + private FDK.メディア.動画 _背景動画 = null; + private FDK.メディア.画像 _ステージ台 = null; + private SST.ステージ.ドラムセット _ドラムセット = null; + private 曲パネルビュー _曲パネルビュー = null; } } diff --git a/StrokeStyleT/曲/MusicNode.cs b/StrokeStyleT/曲/MusicNode.cs index c24495c..e0f28a3 100644 --- a/StrokeStyleT/曲/MusicNode.cs +++ b/StrokeStyleT/曲/MusicNode.cs @@ -78,7 +78,9 @@ namespace SST.曲 } private FDK.メディア.テクスチャ _サムネイル画像 = null; + private readonly string[] _対応する動画の拡張子 = { ".mp4", ".avi" }; + private readonly string[] _対応するサムネイル画像名 = { "thumb.png", "thumb.bmp", "thumb.jpg", "thumb.jpeg" }; } } diff --git a/StrokeStyleT/曲/Node.cs b/StrokeStyleT/曲/Node.cs index 6ada294..333fcdc 100644 --- a/StrokeStyleT/曲/Node.cs +++ b/StrokeStyleT/曲/Node.cs @@ -115,6 +115,7 @@ namespace SST.曲 } private タイトルテクスチャ _タイトル文画像 = null; + private static FDK.メディア.テクスチャ _既定の曲画像 = null; // 全インスタンスで共有 } } diff --git a/StrokeStyleT/曲/タイトルテクスチャ.cs b/StrokeStyleT/曲/タイトルテクスチャ.cs index 4348a08..3f71491 100644 --- a/StrokeStyleT/曲/タイトルテクスチャ.cs +++ b/StrokeStyleT/曲/タイトルテクスチャ.cs @@ -18,7 +18,7 @@ namespace SST.曲 protected override void Onデバイス依存リソースの作成( デバイスリソース dr ) { - this.テクスチャを更新する( dr ); + this._テクスチャを更新する( dr ); } protected override void Onデバイス依存リソースの解放( デバイスリソース dr ) @@ -40,21 +40,27 @@ namespace SST.曲 // 表示文字列が変更されているなら、ここで表示ビットマップの再構築を行う。 if( false == string.Equals( this.表示文字列, this._前回の表示文字列 ) ) - this.テクスチャを更新する( dr ); + this._テクスチャを更新する( dr ); // テクスチャを描画する。 base.描画する( dr, ワールド行列変換, 転送元矩形 ); } private float _フォントサイズpt = 30.0f; + private string _フォント名 = "メイリオ"; + private string _前回の表示文字列 = null; + private SharpDX.DirectWrite.TextFormat _テキストフォーマット = null; + private SharpDX.DirectWrite.TextLayout _テキストレイアウト = null; + private SharpDX.Direct2D1.SolidColorBrush _白ブラシ = null; + private SharpDX.Direct2D1.SolidColorBrush _黒ブラシ = null; - private void テクスチャを更新する( デバイスリソース dr ) + private void _テクスチャを更新する( デバイスリソース dr ) { this._前回の表示文字列 = this.表示文字列; -- 2.11.0