这里有人使用过 DirectSound 缓冲区吗?我试图通过使用计时器在每次播放 % 时将新数据写入缓冲区来获得一个连续的循环缓冲区。我正在使用 ms 计时器来执行此操作。
private void tick(object sender, EventArgs e)
{
Int32 read, write;
buffer.GetCurrentPosition(out read, out write);
if (read > 0)
Main.Record(buffer, (write / 2), (read / 2) - 1);
}
当我使用 Record() 函数时,执行以下操作:
short[] data;
int size;
if (end > start)
size = end - start;
else
size = BUFFER_SIZE - end + start;
data = new short[size];
foreach (Voice v in voices)
for (int i = 0; i < size; i++)
{
data[i] += v.Record();
v.incLife();
}
buffer.Write(start, data, LockFlag.None);
我正在使用 LockFlag.None 因为我不希望缓冲区被锁定,所以我可以连续写入它。但是,如果我使用 LockFlag.None,我会得到一个 ArgumentException。如果我使用 LockFlag.EntireBuffer,我会得到一个 AccessViolationException。
有没有人对此有解释或如何解决它(或关于更好的循环缓冲区实现的建议)?