} //Read /// <summary> /// データの読み出し。 /// </summary> /// <param name="l">左チャネルのデータ格納先。</param> /// <param name="r">右チャネルのデータ格納先。</param> /// <returns>実際に読み出したサンプル数。</returns> public int Read(short[] l, short[] r) { uint length = (uint)l.Length; int i = WaveReader.Read(this.reader, this.header, l, r); this.dataLength -= (uint)i; return(i); } //Read
/// <summary> /// Wave の生データをそのまま読み出す。 /// </summary> /// <param name="data">読込先</param> /// <param name="offset">読込先の開始オフセット(バイト数)</param> /// <param name="length">読み出す長さ(バイト数)</param> /// <returns>実際に読み込んだ長さ(バイト数)</returns> public int ReadRawData(byte[] data, int offset, int length) { if (this.dataLength * this.header.blockSize < length) { length = (int)(this.dataLength * this.header.blockSize); } length = WaveReader.ReadRawData(this.reader, data, offset, length); this.dataLength -= (uint)(length / this.header.blockSize); return(length); }
} //Read /// <summary> /// データの読み出し。 /// </summary> /// <param name="length">読み出すサンプル数。</param> /// <param name="l">左チャネルのデータ格納先。</param> /// <param name="r">右チャネルのデータ格納先。</param> /// <returns>実際に読み出したサンプル数。</returns> public int Read(uint length, out short[] l, out short[] r) { l = null; r = null; if (this.reader == null) { return(0); } int i = WaveReader.Read(this.reader, this.header, length, out l, out r); this.dataLength -= (uint)i; return(i); } //Read
/// <summary> /// データ読み出し。 /// </summary> /// <param name="reader">読み出し元ストリーム</param> /// <param name="header">Wave ヘッダ</param> /// <param name="length">読み出したい長さ</param> /// <param name="l">読み出し先配列(L ch)</param> /// <param name="r">読み出し先配列(R ch)</param> /// <returns>読み出したデータサンプル数</returns> public static int Read(BinaryReader reader, FormatHeader header, uint length, out short[] l, out short[] r) { if (header.IsStereo) { l = new short[length]; r = new short[length]; } else { l = new short[length]; r = null; } return(WaveReader.Read(reader, header, l, r)); }
} //Read /// <summary> /// データを読み飛ばす。 /// </summary> /// <param name="length">読み飛ばす長さ</param> /// <returns>ファイルの末尾まで到達したら false を返す</returns> public bool Skip(int length) { if (this.reader == null) { return(false); } if (!WaveReader.Skip(this.reader, this.header, length)) { this.dataLength = 0; return(false); } this.dataLength -= (uint)length; return(true); } //Skip
/// <summary> /// Wave ファイルを開く。 /// </summary> /// <param name="reader">Wave ファイルを格納したストリーム</param> public void Open(BinaryReader reader) { if (this.reader != null) { this.reader.Close(); } this.reader = reader; // ヘッダ読み出し this.header = WaveReader.ReadHeader(reader); if (this.header.id != 0x0001) { throw new WaveException("対応していないフォーマットです。"); } // data chunk 読み出し int length = ReadDataChunk(reader); this.dataLength = (uint)(length / this.header.blockSize); } //Open
} //Skip /// <summary> /// ウェーブデータの先頭に戻る。 /// </summary> public void Restart() { this.reader.BaseStream.Seek(0, SeekOrigin.Begin); WaveReader.ReadDataChunk(this.reader); }
}//Read /// <summary> /// ファイルから Wave データを読み出し。 /// (後ろ0詰め) /// </summary> /// <param name="filename">ファイル名</param> /// <param name="length">読み込む長さ</param> /// <param name="skip">ファイルの先頭を読み飛ばす長さ</param> /// <param name="threshold">閾値。この値以下の音は無音とみなす</param> /// <param name="relative">閾値にピーク値からみた相対値を使う</param> /// <param name="dstLength">コピー後の配列の長さ</param> /// <returns>読み出したデータ</returns> static WaveData Read( string filename, int skip, int length, double threshold ,bool relative, int dstLength) { WaveReader reader = null; FormatHeader header; double[] l; double[] r; using(reader = new WaveReader(filename)) { header = reader.Header; reader.Read(reader.Length, out l, out r); } if(relative) threshold *= Math.Max(GetPeekValue(l), GetPeekValue(r)); skip += Math.Min(GetSilentLength(l, threshold), GetSilentLength(r, threshold)); if(skip < 0 || skip + length >= l.Length) skip = 0; if(header.IsStereo) return new WaveTime(header, CopyArray(l, skip, length, dstLength), CopyArray(r, skip, length, dstLength)); return new WaveMonaural(header, CopyArray(l, skip, length, dstLength)); }//Read
}//Read /// <summary> /// ファイルから Wave データを読み出し。 /// (後ろ0詰め) /// </summary> /// <param name="filename">ファイル名</param> /// <param name="length">読み込む長さ</param> /// <param name="skip">ファイルの先頭を読み飛ばす長さ</param> /// <param name="dstLength">コピー後の配列の長さ</param> /// <returns>読み出したデータ</returns> static WaveData Read(string filename, int skip, int length, int dstLength) { WaveReader reader = null; FormatHeader header; double[] l; double[] r; using(reader = new WaveReader(filename)) { header = reader.Header; reader.Skip(skip); reader.Read((uint)length, out l, out r); } if(header.IsStereo) return new WaveTime(header, CopyArray(l, 0, length, dstLength), CopyArray(r, 0, length, dstLength)); return new WaveMonaural(header, CopyArray(l, 0, length, dstLength)); }//Read
public WaveStream(WaveReader reader) { this.reader = reader; this.buffer = null; }