一直疑惑的问题,流式播放,在DirectSound的辅助buffer上设四个even ,每个even都处于缓冲区的各1/4处,用LOCK锁住后,应该是播放完多少字节就填充多少,但看一个example,总是按lock的第二参数指定值大小65536填充数据,而这个例子的辅助缓冲区大小正是65536。按理说播放完了1/4后触发事件,应该将刚刚播放完毕的部分添充1/4大小的数据才对,应该是16384字节,可这里为什么添充65536呢?辅助缓冲区总共才65536,那岂不是将未播放数据覆盖了?DSBUFFERDESC dsbuffesc;
dsbuffesc.dwBufferBytes = 65536; lock_size = 65536;
ds_buffer->Lock(lock_pos, lock_size, (void**)&ptr1, &size1, (void**)&ptr2, &size2, 0)还有就是既然缓冲区总共就65536字节,每次触发事件都要填充65536字节,那么lock_pos为什么还要每次偏移16384字节大小?直接从0开始就好了。我也知道SoundBuffer是个环状结构,但不论是不是环状结构,分配的辅助buffer总大小都是65536,每次填充都是65536,这个偏移的意义何在?不明白~
实测将lock_pos不偏移,每次置为0后,声音播放是短短续续的。

解决方案 »

  1.   

    个人本身没有做过相关的工作,不过看LZ所描述的,是不是落下了LOCK这个功能,我做以下假设,如果一个even没有播放完毕,那么它处于被LOCK的状态,那么他就不能被填充,而一旦填充完毕又将进入LOCK状态,在没有被播放前不能被填充。
    按lock的第二参数指定值大小65536填充数据,意思是缓冲区如果没有被LOCK他将允许填充数据,而一旦碰到被lock的even数据填充被暂停或者终止。
    如果以上猜测都正确,我认为将第二个参数65536改为65536*3/4,应该对播放影响不大,楼主可以尝试一下。