0

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() 调用中继续增加?关于为什么它总是为我返回零的任何想法?

4

1 回答 1

0

我错误地声明了 MMTIME 结构。奇怪的是该函数没有报告错误,但根据我读过的其他内容,这个函数依赖于 OEM,因此可以看到各种奇怪的结果。似乎要求 MS 的测试不如要求 SAMPLES 好,所以我只要求样品,然后自己计算 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;
    }
于 2012-06-07T16:01:57.893 回答