我目前正在使用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;
}
答案 0 :(得分:0)
您应该通过创建自己的自定义ISampleProvider
来实现此功能,该自定义Read
将每个输入包装到您的调音台(装饰器模式)。然后有一个方法告诉它插入n个静音样本。然后在SampleProvider的OffsetSampleProvider
方法中,如果需要静音,则将所需数量的静默样本放入读缓冲区。当暂停结束时,再次开始从源提供程序返回样本。
您可以查看{{1}}的源代码以获取灵感,这样您就可以在流的开头添加指定数量的静音样本。