OSDN Git Service

BGMを、途中からの再生に対応した。動画はまだ。
[strokestylet/CsWin10Desktop3.git] / FDK24 / メディア / サウンド / WASAPI排他 / Sound.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 " バックストア "