waveOutGetPosition总是返回零

时间:2012-06-07 04:05:44

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

1 个答案:

答案 0 :(得分:0)

我的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;
    }