OSDN Git Service

排他モードと共有モードの両方の実相を完了。
[strokestylet/CsWin10Desktop3.git] / StrokeStyleT / ステージ / 演奏 / 演奏ステージ.cs
index f2ed87f..ca4871a 100644 (file)
@@ -68,9 +68,13 @@ namespace SST.ステージ.演奏
                                return ( null != this.BGM ) ? this.BGM.長さsec : 0.0;
                        };
                        this.スクロール譜面.背景動画再生開始 = ( 開始位置sec ) => {
-                               //this.背景動画.再生位置を移動する( 開始位置sec );
+                               this.背景動画.再生を開始する( 開始位置sec );
                                this.背景動画開始済み.Value = true;
-                               this.BGM?.再生を開始する( 開始位置sec );
+                               if( null != this.BGM )
+                               {
+                                       this.BGM.位置sec = 開始位置sec;
+                                       this.BGM?.Play();
+                               }
                                this.BGM再生開始済み = true;
                        };
                        this.スクロール譜面.チップヒット = ( chip ) => {
@@ -102,10 +106,8 @@ namespace SST.ステージ.演奏
                                // 動画を子リストに追加。
                                this.子リスト.Add( this.背景動画 = new 動画( StrokeStyleT.演奏スコア.背景動画ファイル名, StrokeStyleT.Config.動画デコーダのキューサイズ ) );
 
-                               // 動画から BGM を作成してミキサーに追加。
-                               this.BGM = new FDK.メディア.サウンド.WASAPI排他.Sound();
-                               this.BGM.ファイルから作成する( StrokeStyleT.演奏スコア.背景動画ファイル名 );
-                               StrokeStyleT.Wasapiデバイス.サウンドをミキサーに追加する( this.BGM ); // 作成に失敗した Sound を追加しても鳴らないだけなので、ノーチェックで大丈夫。
+                               // 動画から BGM を作成。
+                               this.BGM = StrokeStyleT.サウンドデバイス.CreateSound( StrokeStyleT.演奏スコア.背景動画ファイル名 );
                        }
                        else
                        {
@@ -160,15 +162,21 @@ namespace SST.ステージ.演奏
                                this.FPS = new FDK.カウンタ.FPS();
 
                                double 演奏開始位置の先頭からの時間sec = 0.0;
+                               int 演奏開始小節番号 = 0;
                                var msg = StrokeStyleT.最後に取得したビュアーメッセージ;
                                if( null != msg )
                                {
-                                       演奏開始位置の先頭からの時間sec = this.スクロール譜面.演奏開始小節番号を設定しその時刻secを返す( msg.演奏開始小節番号 );
+                                       演奏開始小節番号 = msg.演奏開始小節番号;
                                        this.Autoチップのドラム音を再生する = msg.ドラムチップ発声;
                                }
+                               演奏開始位置の先頭からの時間sec = this.スクロール譜面.演奏開始小節番号を設定しその時刻secを返す( 演奏開始小節番号 );
+
+                               long position, qpcPosition, frequency;
+                               StrokeStyleT.サウンドデバイス.GetClock( out position, out qpcPosition, out frequency );
+
                                this.演奏開始時刻sec = 
-                                       this.サウンドタイマ.現在のデバイス位置secを取得する( StrokeStyleT.Wasapiデバイス.AudioClock ) -        // '+' じゃないので注意!
-                                       演奏開始位置の先頭からの時間sec;
+                                       this.サウンドタイマ.現在のデバイス位置secを取得する( position, qpcPosition, frequency )
+                                       - 演奏開始位置の先頭からの時間sec;                // 「+」じゃないので注意!
                        }
                        //----------------
                        #endregion
@@ -205,7 +213,7 @@ namespace SST.ステージ.演奏
                                // 背景動画が再生されているのにBGMがまだ再生されていないなら、再生を開始する。
                                if( false == this.BGM再生開始済み )
                                {
-                                       this.BGM?.再生を開始する();
+                                       this.BGM?.Play();
                                        this.BGM再生開始済み = true;
                                }
                        }
@@ -259,7 +267,7 @@ namespace SST.ステージ.演奏
                {
                        if( null != this.BGM )  // 背景動画がなければ BGM も null である
                        {
-                               StrokeStyleT.Wasapiデバイス.サウンドをミキサーから削除する( this.BGM );
+                               this.BGM.Stop();
                                FDK.Utilities.解放する( ref this.BGM );
                        }
                }
@@ -269,8 +277,8 @@ namespace SST.ステージ.演奏
                protected bool BGM再生開始済み = false;
                protected FDK.同期.RWLock<double> 現在進行描画中の譜面スクロール速度の倍率 = new FDK.同期.RWLock<double>( 0.0 );
                protected double 演奏開始時刻sec = 0.0;
-               protected bool Autoチップのドラム音を再生する = false;
-               protected readonly FDK.メディア.サウンド.WASAPI排他.SoundTimer サウンドタイマ = new FDK.メディア.サウンド.WASAPI排他.SoundTimer();
+               protected bool Autoチップのドラム音を再生する = true;
+               protected readonly FDK.メディア.サウンド.WASAPI.SoundTimer サウンドタイマ = new FDK.メディア.サウンド.WASAPI.SoundTimer();
                protected readonly SST.ステージ.演奏.コンボ コンボ;
                protected readonly SST.ステージ.演奏.レーンフレーム レーンフレーム;
                protected readonly SST.ステージ.演奏.スクロール譜面 スクロール譜面;
@@ -285,7 +293,7 @@ namespace SST.ステージ.演奏
                /// 解放は、演奏ステージクラスの非活性化後に、外部から行われる。
                /// <see cref="SST.ステージ.演奏.演奏ステージ.BGMを解放する"/>
                /// </remarks>
-               protected FDK.メディア.サウンド.WASAPI排他.Sound BGM = null;
+               protected FDK.メディア.サウンド.WASAPI.Sound BGM = null;
                protected FDK.カウンタ.FPS FPS = null;
                /// <summary>
                /// 動的子Activity。背景動画を再生しない場合は null のまま。
@@ -294,7 +302,10 @@ namespace SST.ステージ.演奏
 
                private double 現在の演奏時刻secを返す()
                {
-                       return this.サウンドタイマ.現在のデバイス位置secを取得する( StrokeStyleT.Wasapiデバイス.AudioClock ) - this.演奏開始時刻sec;
+                       long position, qpcPosition, frequency;
+                       StrokeStyleT.サウンドデバイス.GetClock( out position, out qpcPosition, out frequency );
+
+                       return this.サウンドタイマ.現在のデバイス位置secを取得する( position, qpcPosition, frequency ) - this.演奏開始時刻sec;
                }
        }
 }