private bool CreateBufferNotifications() { uint dsErr = DSERR.DS_OK; // 获取IDirectSoundNotify8接口 Guid iid_dsNotify8 = new Guid(IID.IID_IDirectSoundNotify8); IntPtr pdsNotify8; IDirectSoundNotify8 dsNotify8; Marshal.QueryInterface(this.pdscb8, ref iid_dsNotify8, out pdsNotify8); dsNotify8 = Marshal.GetObjectForIUnknown(pdsNotify8) as IDirectSoundNotify8; try { tWAVEFORMATEX wfx; int pdwSizeWritten; dsErr = this.dscb8.GetFormat(out wfx, Marshal.SizeOf(typeof(tWAVEFORMATEX)), out pdwSizeWritten); if (dsErr != DSERR.DS_OK) { LibUtils.PrintLog("GetFormat失败, DSERROR = {0}", dsErr); return(false); } _DSBPOSITIONNOTIFY[] rgdsbpn = new _DSBPOSITIONNOTIFY[LibConsts.NotifyEvents]; this.notifyHwnd_close = new IntPtr[LibConsts.NotifyEvents]; for (int i = 0; i < LibConsts.NotifyEvents; i++) { this.notifyHwnd_close[i] = LibNatives.CreateEvent(IntPtr.Zero, true, false, null); } rgdsbpn[0].dwOffset = (uint)(wfx.nAvgBytesPerSec - 1); rgdsbpn[0].hEventNotify = this.notifyHwnd_close[0]; rgdsbpn[1].dwOffset = LibNatives.DSBPN_OFFSETSTOP; rgdsbpn[1].hEventNotify = this.notifyHwnd_close[1]; dsErr = dsNotify8.SetNotificationPositions(LibConsts.NotifyEvents, Marshal.UnsafeAddrOfPinnedArrayElement(rgdsbpn, 0)); if (dsErr != DSERR.DS_OK) { LibUtils.PrintLog("SetNotificationPositions失败, DSERROR = {0}", dsErr); return(false); } } finally { Marshal.Release(pdsNotify8); } return(true); }
private bool CreateBufferNotifications() { uint dsErr = DSERR.DS_OK; // 获取IDirectSoundNotify8接口 Guid iid_dsNotify8 = new Guid(IID.IID_IDirectSoundNotify8); IntPtr pdsNotify8; IDirectSoundNotify8 dsNotify8; Marshal.QueryInterface(this.pdsb8, ref iid_dsNotify8, out pdsNotify8); dsNotify8 = Marshal.GetObjectForIUnknown(pdsNotify8) as IDirectSoundNotify8; try { uint written; tWAVEFORMATEX wfx; dsErr = this.dsb8.GetFormat(out wfx, (uint)Marshal.SizeOf(typeof(tWAVEFORMATEX)), out written); if (dsErr != DSERR.DS_OK) { LibUtils.PrintLog("GetFormat失败, DSERR = {0}", dsErr); return(false); } this.rgdsbpn = new _DSBPOSITIONNOTIFY[LibConsts.BUFF_NOTIFY_TIMES]; this.notifyHwnd_close = new IntPtr[LibConsts.BUFF_NOTIFY_TIMES]; for (int idx = 0; idx < LibConsts.BUFF_NOTIFY_TIMES; idx++) { IntPtr pHandle = LibNatives.CreateEvent(IntPtr.Zero, false, false, null); this.notifyHwnd_close[idx] = pHandle; this.rgdsbpn[idx].dwOffset = (uint)(LibConsts.BUFF_NOTIFY_SIZE * idx); this.rgdsbpn[idx].hEventNotify = pHandle; } dsErr = dsNotify8.SetNotificationPositions(LibConsts.BUFF_NOTIFY_TIMES, Marshal.UnsafeAddrOfPinnedArrayElement(rgdsbpn, 0)); if (dsErr != DSERR.DS_OK) { LibUtils.PrintLog("SetNotificationPositions失败, DSERROR = {0}", dsErr); return(false); } } finally { Marshal.Release(pdsNotify8); } return(true); }