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 に答える