Exemple #1
0
        /// <summary>
        /// インスタンスを生成します。
        /// StreamingWave が存在する間、ストリーミングのために input はオープン状態が継続され、
        /// Dispose メソッドでその Dispose メソッドが呼び出されます。
        /// </summary>
        /// <param name="input">Wave ファイルの Stream。</param>
        /// <param name="bufferDuration">バッファリングする再生時間。</param>
        public StreamingWave(Stream input, TimeSpan bufferDuration)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }
            this.input = input;

            reader = new BinaryReader(input);

            // 'data' chunk のデータ部の直前まで読み込みます。
            riffChunk       = RiffChunk.ReadFrom(reader);
            formatChunk     = WaveFormatChunk.ReadFrom(reader);
            dataChunkHeader = ChunkHeader.ReadFrom(reader);

            // 'data' chunk のデータ部の開始位置を記憶します。
            dataOffset = input.Position;

            int           sampleRate = (int)formatChunk.SampleRate;
            AudioChannels channels   = (AudioChannels)formatChunk.Channels;

            dynamicSound = new DynamicSoundEffectInstance(sampleRate, channels);
            dynamicSound.BufferNeeded += new EventHandler <EventArgs>(OnDynamicSoundBufferNeeded);

            bufferSize = dynamicSound.GetSampleSizeInBytes(bufferDuration);
            buffer     = new byte[bufferSize];

            readDataAsyncCaller = new ReadDataAsyncCaller(ReadData);
        }
Exemple #2
0
        /// <summary>
        /// WaveData を読み込みます。
        /// </summary>
        /// <param name="reader">Wave ファイルの BinaryReader。</param>
        /// <returns>WaveData。</returns>
        public static WaveData ReadFrom(BinaryReader reader)
        {
            var result = new WaveData();

            result.Riff   = RiffChunk.ReadFrom(reader);
            result.Format = WaveFormatChunk.ReadFrom(reader);
            result.Data   = WaveDataChunk.ReadFrom(reader);

            return(result);
        }