我正在使用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()调用中继续增加?关于为什么它总会为我返回零的任何想法?
答案 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;
}