예제 #1
0
    static void Main(string[] args)
    {
        OptionFeature optionFeature = new OptionFeature();

        optionFeature.material = new Material();
        Fabric fabric = (Fabric)optionFeature.material;
    }
예제 #2
0
    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();
    }
예제 #3
0
    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();
            }
        }
    }