OSDN Git Service

BGMを、途中からの再生に対応した。動画はまだ。
authorくまかみ工房 <kumakamikoubou@gmail.com>
Mon, 7 Nov 2016 10:46:52 +0000 (19:46 +0900)
committerくまかみ工房 <kumakamikoubou@gmail.com>
Mon, 7 Nov 2016 10:46:52 +0000 (19:46 +0900)
FDK24/メディア/サウンド/WASAPI排他/Sound.cs
StrokeStyleT/ステージ/演奏/スクロール譜面.cs
StrokeStyleT/ステージ/演奏/演奏ステージ.cs

index 6fe4eb4..805a595 100644 (file)
@@ -34,6 +34,16 @@ namespace FDK.メディア.サウンド.WASAPI排他
                                }
                        }
                }
+               public double 長さsec
+               {
+                       get
+                       {
+                               lock( this.排他利用 )
+                               {
+                                       return ( this.サウンドデータサイズsample / this.WAVEフォーマット.SampleRate );
+                               }
+                       }
+               }
 
                public Sound()
                {
@@ -74,11 +84,11 @@ namespace FDK.メディア.サウンド.WASAPI排他
                                        {
                                                mediaType.Set<Guid>( SharpDX.MediaFoundation.MediaTypeAttributeKeys.MajorType, SharpDX.MediaFoundation.MediaTypeGuids.Audio );
                                                mediaType.Set<Guid>( SharpDX.MediaFoundation.MediaTypeAttributeKeys.Subtype, SharpDX.MediaFoundation.AudioFormatGuids.Pcm );
-                                               mediaType.Set<int>( SharpDX.MediaFoundation.MediaTypeAttributeKeys.AudioNumChannels, 2 );
-                                               mediaType.Set<int>( SharpDX.MediaFoundation.MediaTypeAttributeKeys.AudioSamplesPerSecond, 44100 );
-                                               mediaType.Set<int>( SharpDX.MediaFoundation.MediaTypeAttributeKeys.AudioBlockAlignment, 4 );
-                                               mediaType.Set<int>( SharpDX.MediaFoundation.MediaTypeAttributeKeys.AudioAvgBytesPerSecond, 4 * 44100 );
-                                               mediaType.Set<int>( SharpDX.MediaFoundation.MediaTypeAttributeKeys.AudioBitsPerSample, 16 );
+                                               mediaType.Set<int>( SharpDX.MediaFoundation.MediaTypeAttributeKeys.AudioNumChannels, this.WAVEフォーマット.Channels );
+                                               mediaType.Set<int>( SharpDX.MediaFoundation.MediaTypeAttributeKeys.AudioSamplesPerSecond, this.WAVEフォーマット.SampleRate );
+                                               mediaType.Set<int>( SharpDX.MediaFoundation.MediaTypeAttributeKeys.AudioBlockAlignment, this.WAVEフォーマット.BlockAlign );
+                                               mediaType.Set<int>( SharpDX.MediaFoundation.MediaTypeAttributeKeys.AudioAvgBytesPerSecond, this.WAVEフォーマット.AverageBytesPerSecond );
+                                               mediaType.Set<int>( SharpDX.MediaFoundation.MediaTypeAttributeKeys.AudioBitsPerSample, this.WAVEフォーマット.BitsPerSample );
                                                mediaType.Set<int>( SharpDX.MediaFoundation.MediaTypeAttributeKeys.AllSamplesIndependent, 1 ); // TRUE
 
                                                // 作成したメディアタイプを sourceReader にセットする。sourceReader は、必要なデコーダをロードするだろう。
@@ -165,15 +175,19 @@ namespace FDK.メディア.サウンド.WASAPI排他
                                this.作成済み = true;
                        }
                }
-               public void 再生を開始する()
+               public void 再生を開始する( double 再生開始位置sec = 0.0 )
                {
                        lock( this.排他利用 )
                        {
                                if( false == this.作成済み )
                                        return;     // エラーにはしない。サウンド作成失敗時には、何も再生しないようにするだけ。
 
-                               this.再生状態 = E再生状態.再生中;
-                               this.再生位置sample = 0;    // 再生位置を先頭へ。
+                               int 開始位置sample = (int) ( 再生開始位置sec * this.WAVEフォーマット.SampleRate );
+                               if( 開始位置sample < this.サウンドデータサイズsample )
+                               {
+                                       this.再生状態 = E再生状態.再生中;
+                                       this.再生位置sample = 開始位置sample;
+                               }
                        }
                }
                public void 再生を一時停止する()
@@ -340,6 +354,7 @@ namespace FDK.メディア.サウンド.WASAPI排他
                private int サウンドデータサイズbyte = 0;
                private int サウンドデータサイズsample = 0;
                private int 再生位置sample = 0;
+               private readonly SharpDX.Multimedia.WaveFormat WAVEフォーマット = new SharpDX.Multimedia.WaveFormat( 44100, 16, 2 );      // 固定
                private readonly object 排他利用 = new object();
 
                #region " バックストア "
index 208b44f..dfced54 100644 (file)
@@ -13,7 +13,8 @@ namespace SST.ステージ.演奏
                public Action コンボリセット = null;
                public Action コンボ加算 = null;
                public Action<ヒット判定種別> ヒット判定数加算 = null;
-               public Action 背景動画再生開始 = null;
+               public Func<double> 背景動画の長さsec = null;
+               public Action<double> 背景動画再生開始 = null;
                public Action<SSTFormat.チップ> チップヒット = null;
                public Action ステージクリア = null;
                public Func<double> リアルタイム演奏時刻sec = null;
@@ -71,6 +72,7 @@ namespace SST.ステージ.演奏
                        if( null == スコア )
                                return 0.0;
 
+                       double 演奏開始時刻sec = 0.0;
                        for( int i = 0; i < スコア.チップリスト.Count; i++ )
                        {
                                var チップ = スコア.チップリスト[ i ];
@@ -82,11 +84,27 @@ namespace SST.ステージ.演奏
                                else
                                {
                                        this.描画開始チップ番号 = i;
-                                       return チップ.発声時刻sec - 0.5; // ちょっと早めの時刻を返す。
+                                       演奏開始時刻sec = チップ.発声時刻sec - 0.5; // ちょっと早めの時刻にする。
+                                       break;
+                               }
+                       }
+
+                       // 背景動画チップがあり、かつ再生中の位置であるなら、適切な位置から再生を開始する。
+                       foreach( var チップ in スコア.チップリスト )
+                       {
+                               if( チップ.チップ種別 == SSTFormat.チップ種別.背景動画 )
+                               {
+                                       if( ( チップ.発声時刻sec <= 演奏開始時刻sec ) &&
+                                               ( 演奏開始時刻sec < ( チップ.発声時刻sec + this.背景動画の長さsec() ) ) )
+                                       {
+                                               this.背景動画再生開始( 演奏開始時刻sec - チップ.発声時刻sec );
+                                       }
+                                       break;
                                }
                        }
 
-                       return 0.0;
+
+                       return 演奏開始時刻sec;
                }
 
                public void 演奏を停止する()
@@ -224,7 +242,7 @@ namespace SST.ステージ.演奏
                                if( chip.チップ種別 == SSTFormat.チップ種別.背景動画 )
                                {
                                        // (A) 背景動画の場合。
-                                       this.背景動画再生開始?.Invoke();
+                                       this.背景動画再生開始?.Invoke( 0.0 );
                                }
                                else
                                {
index 869b1f1..f2ed87f 100644 (file)
@@ -64,9 +64,13 @@ namespace SST.ステージ.演奏
                        this.スクロール譜面.ヒット判定数加算 = ( hitType ) => {
                                this.ヒットした回数[ hitType ]++;
                        };
-                       this.スクロール譜面.背景動画再生開始 = () => {
+                       this.スクロール譜面.背景動画の長さsec = () => {
+                               return ( null != this.BGM ) ? this.BGM.長さsec : 0.0;
+                       };
+                       this.スクロール譜面.背景動画再生開始 = ( 開始位置sec ) => {
+                               //this.背景動画.再生位置を移動する( 開始位置sec );
                                this.背景動画開始済み.Value = true;
-                               this.BGM?.再生を開始する();
+                               this.BGM?.再生を開始する( 開始位置sec );
                                this.BGM再生開始済み = true;
                        };
                        this.スクロール譜面.チップヒット = ( chip ) => {