重复使用带有NAudio的混合频道

时间:2015-01-08 22:04:34

标签: c# naudio

我肯定错过了NAudio的基本原则。我试图播放两次相同的声音而不能。发生了什么事?

var path = @"\Rim Shot 2.wav";
var path2 = @"\Rim Shot 4.wav";

var mStream1 = new MemoryStream(File.ReadAllBytes(path));
var mStream2 = new MemoryStream(File.ReadAllBytes(path2));

var stream1 = (new WaveFileReader(mStream1)).ToStandardWaveStream();
var stream2 = (new WaveFileReader(mStream2)).ToStandardWaveStream();

stream1.WaveFormat.Dump();
stream2.WaveFormat.Dump();

var channel1 = new SampleChannel(stream1);
var channel2 = new SampleChannel(stream2);

var format = stream1.WaveFormat;
format = WaveFormat.CreateIeeeFloatWaveFormat(format.SampleRate, format.Channels);
var mixer = new MixingSampleProvider(format);
mixer.ReadFully = true;

try
{
    output.Init(mixer);
    output.Play();

    mixer.AddMixerInput(channel1);
    Task.Delay(10).Wait();

    mixer.AddMixerInput(channel2);
    Task.Delay(10).Wait();

    mixer.AddMixerInput(channel1);
    Task.Delay(2000).Wait();
}
catch(Exception ex)
{
    ex.Dump();
}
finally
{
    if(mStream1 != null) mStream1.Dispose();
    if(mStream2 != null) mStream2.Dispose();

    if(stream1 != null) stream1.Dispose();
    if(stream2 != null) stream2.Dispose();
}

其中ToStandardWaveStream()是我的扩展方法:

public static WaveStream ToStandardWaveStream(this WaveStream stream)
{
    if(stream == null) throw new ArgumentNullException("The expected Wave Stream is not here.");

    var encoding = stream.WaveFormat.Encoding;
    var isNotPcmFormat = (encoding != WaveFormatEncoding.Pcm);
    var isNotIeeeFloatFormat = (encoding != WaveFormatEncoding.IeeeFloat);

    Func<WaveStream> convert = () =>
    {
        stream = WaveFormatConversionStream.CreatePcmStream(stream);
        stream = new BlockAlignReductionStream(stream);
        return stream;
    };

    return (isNotPcmFormat && isNotIeeeFloatFormat) ? convert() : stream;
}

1 个答案:

答案 0 :(得分:1)

您无法将相同的流作为输入添加到调音台两次。您需要创建第二个全新的流读取来自相同的WAV文件才能添加。第二个流将在开头。为了提高效率,我需要在鼓机中缓存声音数据(正如您所做),但您仍然需要创建新的WaveFileReaders(或RawSourceStreams),因此它们从头开始

有关此操作的示例,请查看WPF Drum machine demo的NAudio源代码。