iVocaloid论坛

标题: 【编辑器】额……遇到关于音频播放循环缓冲器的棘手问题 [打印本页]

作者: Zleepwalking    时间: 2013/6/5 17:02     标题: 【编辑器】额……遇到关于音频播放循环缓冲器的棘手问题

本帖最后由 Zleepwalking 于 2013/6/5 19:40 编辑

目前进行开发的CVSEditor是一个迷你版的编辑器,用来编辑微调CVS文件。虽然实时播放合成功能已经写出来了,但是播放的速度似乎比正常速度慢了一丁点,如果播放一段时间就会看到明显的偏差……

当前的方案是:





XP下这个问题已经解决,方法是把采样率转到44100,避免被winmm二转。
但是win7下新问题又出现了,win7下第一次按合成按钮无法播放!第二次才发出声音,而且发出声音的位置和指定发声的位置不一样!过了几秒就卡机程序退出。。。
win7下sndPlaySoundA的特性改变了吗。。?




用PlaySound代替sndPlaySoundA无果,win7照样出错。。。
源码我传到GitHub上去了
https://github.com/Sleepwalking/Rocaloid/tree/master/RocaloidDevelopSuit/CVSEditor/CEditor

作者: rgwan    时间: 2013/6/5 17:44

本帖最后由 rgwan 于 2013/6/5 17:46 编辑

WINMM就是内置了病毒的一个巨坑……
作者: Zleepwalking    时间: 2013/6/6 11:52

我大概猜出怎么回事了
经过分析发现,win7下合成器和调度等等完全没问题。
问题出在WINMM的PlaySound上。
xp的winmm的playsound,指定SND_MEMORY时直接从内存里播放声音。
win7的winmm的playsound可能是从内存里先拷贝一遍再播放声音,这样对声音的实时更改就无效化了,导致第一次按下按钮放不出来,第二次按下按钮放出来的不同步。
那么。。。理论上只要换个函数,比如用WaveOutOpen+WaveOutWrite+WaveOutReset+WaveOutClose改写就行了。。。?

作者: Zleepwalking    时间: 2013/6/6 13:35

我决定暂时不修改这个win7下的bug了
反正到时候还要用C++重写
反正waveOutOpen用vb.net实现很麻烦




欢迎光临 iVocaloid论坛 (http://bbs.ivocaloid.com/) Powered by Discuz! X2