我正在尝试创建NAudio的MixingWaveProvider32的16位PCM版本,该版本在16位PCM样本上运行,而不是32位浮点数。
每个16位立体声样本都打包在字节数组中,如下所示
<表类>
字节0
字节1
字节2
字节3
通道1(左)Lo
通道1 Hi
通道2(右)Lo
通道2 Hi
表类>
你总是可以使用不安全的代码,这应该会更快,因为你节省了一堆方法调用和对象分配:
// setup some input data
byte[] b1 = {0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0};
byte[] b2 = new byte[b1.Length];
Array.Copy(b1, b2, b1.Length);
byte[] result = new byte[b1.Length];
fixed (byte* b1Ptr = b1)
{
fixed (byte* b2Ptr = b2)
{
fixed (byte* rPtr = result)
{
var s1Ptr = (short*) b1Ptr;
var s2Ptr = (short*) b2Ptr;
var srPtr = (short*) rPtr;
var length = b1.Length / 2;
for (int i = 0; i < length; i++)
{
var v = s1Ptr[i] + s2Ptr[i];
srPtr[i] = (short) v;
Console.WriteLine($"{s1Ptr[i]} + {s2Ptr[i]} -> {srPtr[i]}");
}
}
}
}
注意求和值可能会导致溢出。您可能应该对两个样本取平均值,或者夹紧结果以避免这种情况。