C#でNAudioを使って .wav ファイルを再生する時にループ再生ってどうやるのかなと思い、調べた内容をメモしておきます。
結論としては、以下のページにチュートリアルがあって、こちらに書いてあるクラスをコピペして使用したらループ再生できました。
https://www.markheath.net/post/looped-playback-in-net-with-naudio
こちらの記事にもクラスのコードを貼っておきます。
public class LoopStream : WaveStream
{
WaveStream sourceStream;
public LoopStream(WaveStream sourceStream)
{
this.sourceStream = sourceStream;
this.EnableLooping = true;
}
public bool EnableLooping { get; set; }
public override WaveFormat WaveFormat
{
get { return sourceStream.WaveFormat; }
}
public override long Length
{
get { return sourceStream.Length; }
}
public override long Position
{
get { return sourceStream.Position; }
set { sourceStream.Position = value; }
}
public override int Read(byte[] buffer, int offset, int count)
{
int totalBytesRead = 0;
while (totalBytesRead < count)
{
int bytesRead = sourceStream.Read(buffer, offset + totalBytesRead, count - totalBytesRead);
if (bytesRead == 0)
{
if (sourceStream.Position == 0 || !EnableLooping)
{
// something wrong with the source stream
break;
}
// loop
sourceStream.Position = 0;
}
totalBytesRead += bytesRead;
}
return totalBytesRead;
}
}
このクラスの使い方は以下です。
WaveFileReader reader = new WaveFileReader(@"C:\Music\Example.wav");
LoopStream loop = new LoopStream(reader);
waveOut = new WaveOut();
waveOut.Init(loop);
waveOut.Play();