Windows waveOutGetPosition始终返回零

Windows waveOutGetPosition始终返回零,windows,audio,wave,Windows,Audio,Wave,我用waveOutWrite写了几个小的缓冲区,每个80毫秒。在播放时,我调用此函数以获取播放位置: uint GetWaveOutPosInMS() { WinMM.MMTIME mmtime = new WinMM.MMTIME(); mmtime.wType = 1; WinMM.MMRESULT ret = WinMM.waveOutGetPosition(WaveOut, ref mmtime, (uint)Marshal

我用waveOutWrite写了几个小的缓冲区,每个80毫秒。在播放时,我调用此函数以获取播放位置:

    uint GetWaveOutPosInMS()
    {
        WinMM.MMTIME mmtime = new WinMM.MMTIME();
        mmtime.wType = 1;
        WinMM.MMRESULT ret = WinMM.waveOutGetPosition(WaveOut, ref mmtime, (uint)Marshal.SizeOf(typeof(WinMM.MMTIME)));
        return (mmtime.val);
    }
以下是相关的额外费用:

    [DllImport("winmm.dll")]
    public static extern MMRESULT waveOutGetPosition(IntPtr hwo, ref MMTIME info, uint cbi);

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct MMTIME
    {
        public uint wType;
        public uint val;
    }

waveOutGetPosition返回0无错误,但mmtime.val始终为零。MSDN并不清楚播放位置相对于什么,只是在waveOutOpen和waveOutReset上重置。。但它是否总是在多个waveOutWrite调用中不断增加?你知道为什么它总是为我返回零吗?

我错误地声明了MMTIME结构。奇怪的是,这个函数没有报告错误,但是根据我读到的其他内容,这个函数依赖于OEM,所以可以看到各种奇怪的结果。另外,要求MS的测试似乎不如要求样品的测试好,所以我只要求样品,自己计算MS

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct MMTIME
    {
        public uint wType;
        public uint val;

        // Padding because val is actually a union
        public uint pad;
    }