C++ 在directsound中,对于IDirectSoundBuffer,哪个方法负责缓冲区的写入位置。

C++ 在directsound中,对于IDirectSoundBuffer,哪个方法负责缓冲区的写入位置。,c++,winapi,audio,directsound,C++,Winapi,Audio,Directsound,在directsound中,我们知道,调用IDirectSoundBuffer::getcurrentposition(),将获得directsound缓冲区中的播放位置和写入位置。但我认为将数据复制到缓冲区应更改写入位置(此行为,更改写入位置,将由哪个方法引起,解锁?)。我认为只有复制数据功能才应该只影响缓冲区中的数据,而不是写入位置 但我认为将数据复制到缓冲区应该改变写入位置 缓冲区只为您跟踪一个位置,它是“当前位置”,即硬件播放发生的位置,大致返回给您,因为它随时间不断变化 您的数据操作显

在directsound中,我们知道,调用IDirectSoundBuffer::getcurrentposition(),将获得directsound缓冲区中的播放位置和写入位置。但我认为将数据复制到缓冲区应更改写入位置(此行为,更改写入位置,将由哪个方法引起,解锁?)。我认为只有复制数据功能才应该只影响缓冲区中的数据,而不是写入位置

但我认为将数据复制到缓冲区应该改变写入位置

缓冲区只为您跟踪一个位置,它是“当前位置”,即硬件播放发生的位置,大致返回给您,因为它随时间不断变化

您的数据操作显然不会影响此位置。相反,您通常希望在当前位置之前不断抛出越来越多的数据,以便播放不会碰到缓冲区不足,并平滑地播放数据。因此,您可以在内部跟踪自己的附加“写入位置”:在该位置添加数据,然后自己推进该指针

GetCurrentPosition
调用的第二个参数中返回给您的写入位置仅供参考,您可以知道哪个位置仍然可以安全写入(在播放位置和写入位置之间修改数据已经很晚了,因为此数据已被缓冲以供播放):

写入光标指示将新数据写入缓冲区的安全位置。写入光标始终领先播放光标,通常领先15毫秒左右的音频数据


我知道IDirectsoundbuffer::setcurrentposition()会更改写入位置。还有其他函数可以更改写入位置吗?因为我想在directsound中写入一个钩子,以获取数据,然后与其他波形数据混合,所以我无法设置额外的“写入位置”。一旦我发现数据来自dsound(来自hook IDirectSoundBuffer::unlock)不是新的(似乎很久以前就写入了缓冲区)。因此,我想知道应用程序是否调用Idirectsoundbuffer::lock,然后不写入数据,然后调用unlock,这与在unlock之前写入数据有什么不同。也就是说,我如何知道应用程序是否在调用unlock之前将数据写入缓冲区。很难说,因为您可以p缓冲区或使用COM聚合等。无论如何,您的出发点是写游标是应用程序的责任,而不是缓冲区。