2011-09-06 207 views
1

我创建了一个MIDI播放器,但问题也出现在视频/声音播放器中。我在发送MIDI事件之间使用usleep/Sleep功能。当CPU不是很忙时这很好,但当CPU忙时音乐会变慢。视频/声音/ MIDI播放器时间

我想我需要得到一个“全球时间”,并作出更正。什么是便携式(Windows/Linux)方式(库?)来做到这一点?

标准库日期/时间函数的精度为1s。我需要1ms的至少(1美元将是首选,但我想这是不可能在Windows上)...提升是大的我的小球员;)

感谢 斯坦

+0

你正在写一个播放器来发送MIDI事件到一个现有的合成器,或者你在写合成器接受事件吗? – AShelly

回答

1

睡眠的确是一个糟糕的主意,因为你根本不知道你真的睡了多久,而且你可能会用你的主线程的其他部分。

你想要做的是确保你的MIDI事件在正确的时间发送。提前发送消息并使用时间戳会让MIDI系统在正确的时间发送这些事件。也就是说,如果你有一个有时间戳的MIDI API。

Mac/iOS上的MIDI API:CoreMIDI运行良好,发送时可以为您的MIDI事件添加时间戳。

MIDI API的Windows:传统MME API没有时间戳。 DirectMusic确实添加了时间戳,因此它取决于您试图发送MIDI的位置,以确定您可以使用哪个API。

Linux上的MIDI API:我相信有些ALSA项目允许在发送MIDI事件时使用时间戳。虽然看起来原始的ALSA MIDI没有时间戳。 1]如果没有时间戳系统(例如MME,ALSA raw),您需要设置一个定时器,尽可能频繁地调用您,并使用系统时间来确定哪些MIDI事件需要立即发送。这将工作正常,除非系统非常繁忙,并且定时器变慢。

2]使用时间戳系统(例如CoreMIDI,DirectMusic),您基本上对Timer执行相同的操作,但是您可以将所有将要发生的消息发送到MIDI API并提供时间戳让MIDI API准确知道事件应该发送的时间。