搜索

iVocaloid论坛

查看: 1658|回复: 3
打印 上一主题 下一主题

【编辑器】额……遇到关于音频播放循环缓冲器的棘手问题 [复制链接]

Sleepwalking

我不是技术宅!

Lv.5-章鱼须

Rank: 5Rank: 5Rank: 5

0
9
0


UID: 111156
权限: 40
属性: 宇宙人
发帖: 201 (1精)
积分: 540
章鱼: 3
大葱: 14
茄子: 2688
注册:2012/8/18
存在感:476
跳转到指定楼层
[1L]楼主
Zleepwalking 发表于 2013/6/5 17:02:06 |只看该作者 |倒序浏览
本帖最后由 Zleepwalking 于 2013/6/5 19:40 编辑

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

当前的方案是:
  • 按下播放键,WINMM的sndPlaySoundA开始循环播放一段内存中的wav;同时记录下点下按钮的时间。
  • 合成器开始合成
  • 合成器写入覆盖到内存中的wav,如果到达文件尾,跳回开头继续写入;计算出从点下按钮到现在所花的时间,与已写入的音频时长比较,防止合成器覆盖到当前播放的位置。(其实就是一个Circular Buffer)





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




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

知识共享许可协议 除非另有声明,本帖内容采用 署名-非商业-相同方式共享 3.0 许可协议 授权,且需注明出处,所有权利归发帖人。

使用道具 举报

Rank: 3

0
3
0


UID: 93325
权限: 20
属性: 難燃性
发帖: 74 (0精)
积分: 100
章鱼: 1
大葱: 2
茄子: 433
注册:2011/10/22
存在感:84
[2L]沙发
rgwan 发表于 2013/6/5 17:44:33 |只看该作者
本帖最后由 rgwan 于 2013/6/5 17:46 编辑

WINMM就是内置了病毒的一个巨坑……

使用道具 举报

Sleepwalking

我不是技术宅!

Lv.5-章鱼须

Rank: 5Rank: 5Rank: 5

0
9
0


UID: 111156
权限: 40
属性: 宇宙人
发帖: 201 (1精)
积分: 540
章鱼: 3
大葱: 14
茄子: 2688
注册:2012/8/18
存在感:476
[3L]板凳
Zleepwalking 发表于 2013/6/6 11:52:47 |只看该作者
我大概猜出怎么回事了
经过分析发现,win7下合成器和调度等等完全没问题。
问题出在WINMM的PlaySound上。
xp的winmm的playsound,指定SND_MEMORY时直接从内存里播放声音。
win7的winmm的playsound可能是从内存里先拷贝一遍再播放声音,这样对声音的实时更改就无效化了,导致第一次按下按钮放不出来,第二次按下按钮放出来的不同步。
那么。。。理论上只要换个函数,比如用WaveOutOpen+WaveOutWrite+WaveOutReset+WaveOutClose改写就行了。。。?

使用道具 举报

Sleepwalking

我不是技术宅!

Lv.5-章鱼须

Rank: 5Rank: 5Rank: 5

0
9
0


UID: 111156
权限: 40
属性: 宇宙人
发帖: 201 (1精)
积分: 540
章鱼: 3
大葱: 14
茄子: 2688
注册:2012/8/18
存在感:476
[4L]地板
Zleepwalking 发表于 2013/6/6 13:35:21 |只看该作者
我决定暂时不修改这个win7下的bug了
反正到时候还要用C++重写
反正waveOutOpen用vb.net实现很麻烦

使用道具 举报

您需要登录后才可以回帖 登录 | 注册/sign up

申请友链|Archiver|iVocaloid - 自由,开放,合作,共享    | 版权持有者点击这里进行举报

GMT+8, 2025/6/8 11:53

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部