Articles of waveoutwrite

什么是从waveOutWrite API方法callback的延迟(或延迟)时间?

我正在和另一个论坛上的一些开发者就准确产生MIDI事件(注意消息等等)进行辩论。 人耳对微小的定时误差非常敏感,我认为他们的主要问题来自他们使用相对较低分辨率的定时器,这些定时器在大约15毫秒的时间间隔内量化它们的事件(这足以导致可察觉的不准确性)。 大约十年前,我写了一个示例应用程序(Windows 95上的Visual Basic 5),它是一个组合软件合成器和MIDI播放器。 基本的前提是一个跨越缓冲区的重放系统,每个缓冲器的持续时间是十六分音符(例如:每分钟120个四分音符,每个四分音符是500ms,因此每个十六分音符都是125ms,所以每个缓冲区是5513个样本)。 每个缓冲区都是通过waveOutWrite方法播放的,而这个方法的callback函数被用来排队下一个缓冲区并发送MIDI信息。 这使基于WAV的audio和MIDIaudio保持同步。 在我的耳边,这种方法奏效完美 – MIDI音符听起来甚至略有失调(而如果使用普通定时器精确到15毫秒来播放MIDI音符,它们会听起来明显失调)。 从理论上讲,这种方法会产生精确到样本的MIDI定时,或0.0227毫秒(因为每毫秒有44.1个样本)。 我怀疑这是这种方法的真正延迟,因为在缓冲区结束和waveOutWritecallback被通知的时间之间大概有一些小的延迟。 有谁知道这个延迟实际上有多大?

为什么waveOutWrite()会在debugging堆中导致exception?

在研究这个问题的时候,我在网上发现了多个关于以下场景的提及,总是在编程论坛上没有答案的问题。 我希望在这里发表,至less可以logging我的发现。 首先,症状:运行使用waveOutWrite()输出PCMaudio的相当标准的代码时,有时在debugging器下运行时会出现这种情况: ntdll.dll!_DbgBreakPoint@0() ntdll.dll!_RtlpBreakPointHeap@4() + 0x28 bytes ntdll.dll!_RtlpValidateHeapEntry@12() + 0x113 bytes ntdll.dll!_RtlDebugGetUserInfoHeap@20() + 0x96 bytes ntdll.dll!_RtlGetUserInfoHeap@20() + 0x32743 bytes kernel32.dll!_GlobalHandle@4() + 0x3a bytes wdmaud.drv!_waveCompleteHeader@4() + 0x40 bytes wdmaud.drv!_waveThread@4() + 0x9c bytes kernel32.dll!_BaseThreadStart@8() + 0x37 bytes 虽然明显的嫌疑人会在代码中的其他地方堆积腐败,但我发现事实并非如此。 此外,我能够使用下面的代码重现此问题(这是基于对话框的MFC应用程序的一部分:) void CwaveoutDlg::OnBnClickedButton1() { WAVEFORMATEX wfx; wfx.nSamplesPerSec = 44100; /* sample rate */ wfx.wBitsPerSample = 16; /* sample […]