1

这里有人使用过 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。

有没有人对此有解释或如何解决它(或关于更好的循环缓冲区实现的建议)?

4

0 回答 0