在每个输入源上插入可调延迟

时间:2015-02-11 20:43:27

标签: c# naudio

我目前正在使用Naudio创建一个具有多个输入和多个输出的混音器。

对于每个输入,在播放音频时,我希望能够在我选择时添加样本大小的延迟。 效果将类似于暂停,例如100个样本,然后再次播放。 例如,mixedSampleProvider当前正在播放音频以使用multiplexingSampleProvider输出通道5。在某个按钮上单击,我希望将samplesSampleProvider延迟200个样本,然后再从暂停的点开始播放。

我想知道是否可以这样做,以及可以通过哪些方案来实现这一效果。

编辑: 需要修复的具体问题是我在将零填充到缓冲区时的知识差距,同时在播放音频的同时将所有其余样本推回。在这里,我不是在寻找要编写的代码,而是在寻找资源来尝试创建一个新类来解决这个问题。或者甚至是否可能。

编辑2:我尝试过的代码(失败)

 public int Read(float[] buffer, int offset, int count)
    {
        int sampleRead = source.Read(buffer,offset,count);
        int delaySamples = Math.Min(count, DelayBySamples - delayPos);
        float[] copyBuffer = buffer;

        for (int n = 0; n < delaySamples;n++ )
        {
            buffer[offset + n] = 0;
        }
        for (int n = 0; n < sampleRead;n++ )
        {
            buffer[offset + delaySamples + n] = copyBuffer[offset+n];
        }


        delayPos += delaySamples;
        sampleRead += delaySamples;


        return sampleRead;
    }

1 个答案:

答案 0 :(得分:0)

您应该通过创建自己的自定义ISampleProvider来实现此功能,该自定义Read将每个输入包装到您的调音台(装饰器模式)。然后有一个方法告诉它插入n个静音样本。然后在SampleProvider的OffsetSampleProvider方法中,如果需要静音,则将所需数量的静默样本放入读缓冲区。当暂停结束时,再次开始从源提供程序返回样本。

您可以查看{{1}}的源代码以获取灵感,这样您就可以在流的开头添加指定数量的静音样本。

相关问题