static void Main(string[] args) { OptionFeature optionFeature = new OptionFeature(); optionFeature.material = new Material(); Fabric fabric = (Fabric)optionFeature.material; }
static void Main(string[] args) { OptionFeature optionFeature = new OptionFeature(); optionFeature.material = new Material(); Fabric fabric = (Fabric)optionFeature.material; List <Material> materials = new List <Material>(); List <Fabric> fabrics = materials.Select(x => (Fabric)x).ToList(); }
static void Play(string [] args) { var world = new World(); world.LoadAll(); var plugins = new List <Plugin> (); var instances = new List <Instance> (); var buffers = new Dictionary <Port, float []> (); foreach (var arg in args.Skip(1)) { var plugin = world.AllPlugins.GetByUri(world.NewUri(arg)); if (plugin != null) { plugins.Add(plugin); } else { Console.Error.WriteLine($"Plugin {arg} not found."); } } if (!plugins.Any()) { plugins.Add(world.AllPlugins.Last(p => p.RequiredFeatures == null || p.RequiredFeatures.Count == 0)); } Func <float []> allocate = () => new float [1000]; List <GCHandle> gcHandles = new List <GCHandle> (); var audioSource = allocate(); float [] audioDestination = null; var ctrlSource = allocate(); var dummySource = allocate(); for (int i = 0; i < audioSource.Length; i++) { audioSource [i] = (float)Math.Sin(i / 100.0); ctrlSource [i] = 0.5f; } unsafe { gcHandles.Add(GCHandle.Alloc(audioSource, GCHandleType.Pinned)); gcHandles.Add(GCHandle.Alloc(ctrlSource, GCHandleType.Pinned)); var inPtr = Marshal.UnsafeAddrOfPinnedArrayElement(audioSource, 0); var ctrlPtr = Marshal.UnsafeAddrOfPinnedArrayElement(ctrlSource, 0); var dummyPtr = Marshal.UnsafeAddrOfPinnedArrayElement(dummySource, 0); var ports = new Dictionary <string, Port> (); IntPtr currentAudioIn = inPtr; var features = new List <Feature> (); var uriMappings = new Dictionary <string, uint> (); var uridMapFeature = new URIDFeature((ptr, uri) => { Console.WriteLine("urid mapper invoked: " + uri); if (!uriMappings.TryGetValue(uri, out _)) { uriMappings [uri] = (uint)(uriMappings.Count + 1); } return(uriMappings [uri]); }); // FIXME: adjust values var optionFeature = new OptionFeature(0, 0, 0, 0, 0, IntPtr.Zero); gcHandles.Add(GCHandle.Alloc(Lv2ExtUris.FeatureUridMap, GCHandleType.Pinned)); features.Add(new Feature { URI = Lv2ExtUris.FeatureUridMap, Data = uridMapFeature }); //features.Add (new Feature { URI = Lv2ExtUris.FeatureOptions, Data = optionFeature }); bool aborted = false; var featuresArray = features.ToArray(); foreach (var plugin in plugins) { Console.Write("---- Plugin: "); Console.WriteLine(plugin.Name.Value); var instance = plugin.Instantiate(44100, featuresArray); if (instance == null) { aborted = true; break; } Dump(instance); IntPtr currentAudioOut = IntPtr.Zero; for (uint i = 0; i < plugin.NumPorts; i++) { Console.WriteLine($" -- Port {i} --"); var port = plugin.GetPortByIndex(i); Dump(port); if (port.IsAudioIn()) { instance.ConnectPort(i, currentAudioIn); } else if (port.IsAudioOut()) { audioDestination = allocate(); currentAudioOut = Marshal.UnsafeAddrOfPinnedArrayElement(audioDestination, 0); gcHandles.Add(GCHandle.Alloc(audioDestination)); instance.ConnectPort(i, currentAudioOut); buffers [port] = audioDestination; } else if (port.IsControlIn()) { instance.ConnectPort(i, ctrlPtr); } else { instance.ConnectPort(i, dummyPtr); } } currentAudioIn = currentAudioOut; instances.Add(instance); } if (aborted) { return; } Console.WriteLine("-> Activate"); foreach (var instance in instances) { instance.Activate(); } Console.WriteLine("-> Run"); foreach (var instance in instances) { instance.Run((uint)audioSource.Length); } Console.WriteLine("-> Deactivate"); foreach (var instance in instances) { instance.Deactivate(); } foreach (var f in audioDestination) { Console.Write(f); Console.Write(' '); } Console.WriteLine(); foreach (var gch in gcHandles) { gch.Free(); } } }