public unsafe XtStream AggregateStream(XtDevice[] devices, XtChannels[] channels, double[] bufferSizes, int count, XtMix mix, bool interleaved, bool raw, XtDevice master, XtStreamCallback streamCallback, XtXRunCallback xRunCallback, object user) { IntPtr str; IntPtr channelsPtr = IntPtr.Zero; IntPtr[] ds = devices.Select(d => d.d).ToArray(); XtStream stream = new XtStream(raw, streamCallback, xRunCallback, user); try { int size = Marshal.SizeOf(typeof(XtChannels)); channelsPtr = Marshal.AllocHGlobal(count * size); for (int i = 0; i < count; i++) { Marshal.StructureToPtr(channels[i], new IntPtr((byte *)channelsPtr + i * size), false); } XtNative.HandleError(XtNative.XtServiceAggregateStream(s, ds, channelsPtr, bufferSizes, count, mix, interleaved, master.d, stream.streamCallbackPtr, stream.xRunCallbackPtr, IntPtr.Zero, out str)); } finally { if (channelsPtr != IntPtr.Zero) { Marshal.FreeHGlobal(channelsPtr); } } stream.Init(str); return(stream); }
public XtStream OpenStream(XtFormat format, bool interleaved, bool raw, double bufferSize, XtStreamCallback streamCallback, XtXRunCallback xRunCallback, object user) { IntPtr s; XtStream stream = new XtStream(raw, streamCallback, xRunCallback, user); XtNative.Format native = XtNative.Format.ToNative(format); XtNative.HandleError(XtNative.XtDeviceOpenStream(d, ref native, interleaved, bufferSize, stream.streamCallbackPtr, stream.xRunCallbackPtr, IntPtr.Zero, out s)); stream.Init(s); return(stream); }
internal XtStream(bool raw, XtStreamCallback streamCallback, XtXRunCallback xRunCallback, object user) { this.raw = raw; this.user = user; this.xRunCallback = xRunCallback; this.streamCallback = streamCallback; this.win32StreamCallback = new XtNative.StreamCallbackWin32(StreamCallback); this.linuxStreamCallback = new XtNative.StreamCallbackLinux(StreamCallback); Delegate streamCallbackDelegate = Environment.OSVersion.Platform == PlatformID.Win32NT ? (Delegate)win32StreamCallback : linuxStreamCallback; streamCallbackPtr = Marshal.GetFunctionPointerForDelegate(streamCallbackDelegate); if (xRunCallback != null) { this.win32XRunCallback = new XtNative.XRunCallbackWin32(XRunCallback); this.linuxXRunCallback = new XtNative.XRunCallbackLinux(XRunCallback); Delegate xRunCallbackDelegate = Environment.OSVersion.Platform == PlatformID.Win32NT ? (Delegate)win32XRunCallback : linuxXRunCallback; xRunCallbackPtr = Marshal.GetFunctionPointerForDelegate(xRunCallbackDelegate); } }