public static void WaveInToWaveOutSample() { using (var waveOut = new WaveOut(WaveOut.WaveMapper, 44100, 16, 2)) using (var waveIn = new WaveIn(WaveIn.WaveMapper, 44100, 16, 2)) { waveIn.OnData += waveOut.Write; waveIn.Start(16, 44100); Application.Run(new Form()); } }
private void Form1_Load(object sender, EventArgs e) { // WaveOut を初期化する。 waveOut = new WaveOut(WaveOut.WaveMapper, 44100, 16, 2); // WaveOutの状態を気にしつつ、データを出力するためのタイマー timer1.Interval = 10; timer1.Tick += new EventHandler(delegate(object sender_, EventArgs e_) { Feed(); }); // 自動ループ機能を使ってOggVorbisデコーダを初期化する。引数の単位は頭からのサンプル数。 // Oggファイルをそのまま聴くとフェードアウトになってるんですが、ゲーム中は切れ目なくループ再生したいわけで。 // ループの先頭と末尾の位置は、Wave編集ソフトとかで開いて波形を見て決める。 // ループしたい場所のなるべく近くで、左右チャンネルとも音量がほぼ0になっているタイミングを見つけて指定。 // ループ位置を繋いだときに波形がジャンプしているとクリックノイズがのってしまう。 // 100サンプル程度前後しても、その程度の音飛び・リズム狂いに気づける人はほとんどいないはずなので、 // つなぎ目の音量優先で位置を決めましょう。 waveStream = new OggDecodeStream(File.OpenRead("SampleBGM.ogg"), 251000, 815518); }
public static void Mp3ToWaveOutSample(string path) { byte[] mp3buf = System.IO.File.ReadAllBytes(path); using(var waveOut = new WaveOut(WaveOut.WaveMapper, 44100, 16, 2)) using (var mp3 = new AcmMp3Decoder(65536)) { int i = 0; byte[] wavebuf = mp3.Decode(mp3buf); Console.WriteLine(""+wavebuf.Length + "bytes decoded."); while(wavebuf.Length > 0) { while (waveOut.EnqueuedBufferSize > 262144) Thread.Sleep(1); Console.WriteLine("Writing... {0}", i++); waveOut.Write(wavebuf); wavebuf = mp3.Decode(new byte[0]); Console.WriteLine("" + wavebuf.Length + "bytes decoded."); } Console.ReadLine(); } }