}
}
}
+ public double 長さsec
+ {
+ get
+ {
+ lock( this.排他利用 )
+ {
+ return ( this.サウンドデータサイズsample / this.WAVEフォーマット.SampleRate );
+ }
+ }
+ }
public Sound()
{
{
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 は、必要なデコーダをロードするだろう。
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 再生を一時停止する()
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 " バックストア "