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>
        /// RiffChunk を読み込みます。
        /// </summary>
        /// <param name="reader">BinaryReader。</param>
        /// <returns>RiffChunk。</returns>
        public static RiffChunk ReadFrom(BinaryReader reader)
        {
            var result = new RiffChunk();

            result.Header = ChunkHeader.ReadFrom(reader);
            result.Type   = reader.ReadUInt32();

            return(result);
        }
Exemple #3
0
        /// <summary>
        /// DataChunk を読み込みます。
        /// </summary>
        /// <param name="reader">BinaryReader。</param>
        /// <returns>DataChunk。</returns>
        public static WaveDataChunk ReadFrom(BinaryReader reader)
        {
            var result = new WaveDataChunk();

            result.Header = ChunkHeader.ReadFrom(reader);
            result.Data   = reader.ReadBytes(result.Header.Size);

            return(result);
        }
Exemple #4
0
        /// <summary>
        /// FormatChunk を読み込みます。
        /// </summary>
        /// <param name="reader">BinaryReader。</param>
        /// <returns>FormatChunk。</returns>
        public static WaveFormatChunk ReadFrom(BinaryReader reader)
        {
            var result = new WaveFormatChunk();

            result.Header     = ChunkHeader.ReadFrom(reader);
            result.Format     = reader.ReadInt16();
            result.Channels   = reader.ReadUInt16();
            result.SampleRate = reader.ReadUInt32();
            result.BytePerSec = reader.ReadUInt32();
            result.BlockAlign = reader.ReadUInt16();
            result.BitsWidth  = reader.ReadUInt16();

            // extension
            if (result.Format == 18)
            {
                result.ExtendedSize = reader.ReadUInt16();
                result.Extended     = reader.ReadBytes(result.ExtendedSize);
            }

            return(result);
        }