2 using System.Collections.Generic;
3 using System.Diagnostics;
10 namespace FDK.メディア.サウンド.WASAPI
13 /// 指定されたメディアファイル(動画, 音楽)を Vorbis としてデコードして、CSCore.IWaveSource オブジェクトを生成する。
16 public class NVorbisResampledWaveSource : IWaveSource
18 public bool CanSeek => true; // オンメモリなので常にサポートできる。
21 /// デコード&リサンプル後のオーディオデータのフォーマット。
23 public WaveFormat WaveFormat
30 /// デコード後のオーディオデータのすべての長さ[byte]。
33 => this._EncodedWaveData.Length;
43 => this._Position = FDKUtilities.位置をブロック境界単位にそろえて返す( value, this.WaveFormat.BlockAlign );
49 /// 指定されたVorbisファイルを指定されたフォーマットでデコードし、内部にオンメモリで保管する。
51 public NVorbisResampledWaveSource( Stream stream, WaveFormat deviceFormat )
53 this.WaveFormat = new WaveFormat(
54 deviceFormat.SampleRate,
56 deviceFormat.Channels,
57 AudioEncoding.IeeeFloat );
59 // リサンプルなし版で生成して、それを this.WaveFormat に合わせてリサンプルしたデータ(byte[])を保管する。
60 using( var vorbisSource = new NVorbisSampleSource( stream, deviceFormat ) )
61 using( var resampler = new DmoResampler( vorbisSource.ToWaveSource(), this.WaveFormat ) )
63 // resampler.Length はサンプル単位ではなくフレーム単位。
64 var サイズbyte = resampler.Length * resampler.WaveFormat.Channels; // 実際のサイズはチャンネル倍ある。
66 this._EncodedWaveData = new byte[ サイズbyte ];
67 resampler.Read( this._EncodedWaveData, 0, (int) サイズbyte ); // でもこっちはバイト単位。
72 /// 連続したデータを読み込み、<see cref="Position"/> を読み込んだ数だけ進める。
74 /// <param name="buffer">読み込んだデータを格納するための配列。</param>
75 /// <param name="offset"><paramref name="buffer"/> に格納を始める位置。</param>
76 /// <param name="count">読み込む最大のデータ数。</param>
77 /// <returns><paramref name="buffer"/> に読み込んだデータの総数。</returns>
78 public int Read( byte[] buffer, int offset, int count )
80 // ※ 音がめちゃくちゃになるとうざいので、このメソッド内では例外を出さないこと。
81 if( ( null == this._EncodedWaveData ) || ( null == buffer ) )
84 long 読み込み可能な最大count = ( this.Length - this._Position );
85 if( count > 読み込み可能な最大count )
86 count = (int) 読み込み可能な最大count;
91 src: this._EncodedWaveData,
92 srcOffset: (int) this._Position,
97 this._Position += count;
106 public void Dispose()
108 this._EncodedWaveData = null;
111 private byte[] _EncodedWaveData = null;
112 private long _Position = 0;