/// <summary> /// 定位音频播放位置 /// </summary> /// <param name="position">音频播放位置</param> public void Seek(TimeSpan position) { if (m_DeviceID != 0) { MCI_SEEK_PARMS sp = new MCI_SEEK_PARMS(); sp.dwCallback = IntPtr.Zero; sp.dwTo = Convert.ToUInt32(position.TotalMilliseconds); IntPtr spPointer = Marshal.AllocHGlobal(Marshal.SizeOf(sp)); try { Marshal.StructureToPtr(sp, spPointer, false); UInt32 errorCode = mciSendCommand(m_DeviceID, (UInt32)MCI_Command.MCI_SEEK, (UInt32)(MCI_SeekFlags.MCI_WAIT | MCI_SeekFlags.MCI_TO), spPointer); CheckError(errorCode); if (Paused == true) { return; } else { m_Paused = true; Play(); } } finally { Marshal.FreeHGlobal(spPointer); } } else { throw new InvalidOperationException("Sound device has already closed."); } }
private void SeekToAny(int Value) { int err; StringBuilder buf = new StringBuilder(1000); MCI_SEEK_PARMS SeekParms = new MCI_SEEK_PARMS(); if (deviceID > 0) { if (Value > 0 && Value < Length) { SeekParms.dwTo = Value; //跳转的目标时间,时间单位为毫秒 err = mciSendCommandA(deviceID, MCI_SEEK, MCI_TO | MCI_WAIT, ref SeekParms); if (err != 0) { mciGetErrorStringA(err, buf, 1000); //throw new ApplicationException(buf.ToString()); } Play(); } else if (Value >= Length) Next(); else Previous(); } }
private static extern int mciSendCommandSeek(int wDeviceID, int uMessage, int dwParam1, ref MCI_SEEK_PARMS dwParam2);
private static extern int mciSendCommandA( Int32 wDeviceID, UInt32 uMessage, Int32 dwParam, ref MCI_SEEK_PARMS Any);