public static void Main(string[] args) { XtMix mix = new XtMix(48000, XtSample.Int16); XtFormat inputFormat = new XtFormat(mix, 2, 0, 0, 0); XtChannels inputChannels = new XtChannels(2, 0, 0, 0); XtFormat outputFormat = new XtFormat(mix, 0, 0, 2, 0); XtChannels outputChannels = new XtChannels(0, 0, 2, 0); using (XtAudio audio = new XtAudio(null, IntPtr.Zero, null, null)) { XtService service = XtAudio.GetServiceBySetup(XtSetup.SystemAudio); using (XtDevice input = service.OpenDefaultDevice(false)) using (XtDevice output = service.OpenDefaultDevice(true)) { if (input != null && input.SupportsFormat(inputFormat) && output != null && output.SupportsFormat(outputFormat)) { using (XtStream stream = service.AggregateStream( new XtDevice[] { input, output }, new XtChannels[] { inputChannels, outputChannels }, new double[] { 30.0, 30.0 }, 2, mix, true, false, output, OnAggregate, XRun, "user-data")) { stream.Start(); Console.WriteLine("Streaming aggregate, press any key to continue..."); Console.ReadLine(); stream.Stop(); } } } } }
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 XtMix GetMix() { IntPtr mix; XtNative.HandleError(XtNative.XtDeviceGetMix(d, out mix)); XtMix result = mix == IntPtr.Zero ? null : (XtMix)Marshal.PtrToStructure(mix, typeof(XtMix)); XtNative.XtAudioFree(mix); return(result); }
static extern ulong XtDeviceGetMix(IntPtr d, out bool valid, out XtMix mix);
internal static extern ulong XtServiceAggregateStream(IntPtr s, [MarshalAs(UnmanagedType.LPArray)] IntPtr[] devices, IntPtr channels, [MarshalAs(UnmanagedType.LPArray)] double[] bufferSizes, int count, XtMix mix, bool interleaved, IntPtr master, IntPtr streamCallback, IntPtr xRunCallback, IntPtr user, out IntPtr stream);
internal static extern IntPtr XtPrintMixToString(XtMix mix);