/// <summary> /// /// </summary> /// <param name="synchronized"></param> private void Play(Boolean synchronized) { if (m_DeviceID == 0) { Load(); } // Play current audio file or resume playing if (m_DeviceID != 0) { if (m_Paused) { // Play from current position MCI_PLAY_PARMS pp = new MCI_PLAY_PARMS(); pp.dwCallback = IntPtr.Zero; IntPtr ppPointer = Marshal.AllocHGlobal(Marshal.SizeOf(pp)); try { Marshal.StructureToPtr(pp, ppPointer, false); UInt32 errorCode = mciSendCommand(m_DeviceID, (UInt32)MCI_Command.MCI_PLAY, (UInt32)(synchronized ? MCI_OpenFlags.MCI_WAIT : MCI_OpenFlags.MCI_NOTIFY), ppPointer); CheckError(errorCode); m_Paused = false; return; } finally { Marshal.FreeHGlobal(ppPointer); } } else { //Stop(); MCI_PLAY_PARMS pp = new MCI_PLAY_PARMS(); pp.dwCallback = IntPtr.Zero; pp.dwFrom = 0; IntPtr ppPointer = Marshal.AllocHGlobal(Marshal.SizeOf(pp)); try { Marshal.StructureToPtr(pp, ppPointer, false); UInt32 errorCode = mciSendCommand(m_DeviceID, (UInt32)MCI_Command.MCI_PLAY, (UInt32)((synchronized ? MCI_OpenFlags.MCI_WAIT : MCI_OpenFlags.MCI_NOTIFY) | MCI_OpenFlags.MCI_FROM), ppPointer); CheckError(errorCode); m_IsPlaying = true; return; } finally { Marshal.FreeHGlobal(ppPointer); } } } else { throw new InvalidOperationException("Sound device has already closed."); } }
/// <summary> /// 从当前位置开始或在一个指定区段播放多媒体文件。 /// </summary> public void Play() { int err; int flags = 0; StringBuilder buf = new StringBuilder(1000); if (deviceID > 0 && PlayState != PlayState.Play) { if ((devCaps & DevCaps.CanPlay) == DevCaps.CanPlay) { if (deviceType == DeviceType.CDAudio || deviceType == DeviceType.VideoDisc) { if (GetStatus(MCI_STATUS_MEDIA_PRESENT) <= 0) { //throw new ApplicationException("设备中没有光盘,请先放入光盘。"); } } if ((int)timer.Tag == 0) { timer.Tag = 1; timer.Start(); } MCI_PLAY_PARMS mciplay = new MCI_PLAY_PARMS(); if (useFrom && startPos != 0) { mciplay.dwFrom = startPos; flags |= MCI_FROM; useFrom = false; } if (useTo && endPos != 0) { mciplay.dwTo = endPos; flags |= MCI_TO; useTo = false; } err = mciSendCommandA(deviceID, MCI_PLAY, flags, ref mciplay); if (err != 0) { mciGetErrorStringA(err, buf, 1000); //throw new ApplicationException("播放出错," + buf.ToString()); } else { if (hWndDisplay == IntPtr.Zero) rect = new Rectangle(0, 0, VideoSize.Width, VideoSize.Height); ShowDisplay(rect); } } else { Close(); //throw new ApplicationException("播放出错,该文件不能播放。"); } } }
public static extern Int32 mciSendCommand(UInt32 wDeviceID, e_MSI_CONMMAND uMsg, UInt32 fdwCommand, ref MCI_PLAY_PARMS dwParam);
private static extern int mciSendCommandA( Int32 wDeviceID, UInt32 uMessage, Int32 dwParam, ref MCI_PLAY_PARMS Any);