public unsafe void InterpolatesEmptyRange()
    {
        DSPNode node = default;

        using (var setup = new GraphSetup((graphSetup, graph, block) =>
        {
            node = graphSetup.CreateDSPNode <SingleParameterKernel.Parameters, NoProviders, SingleParameterKernel>();
        }))
        {
            setup.PumpGraph();

            long   dspClock = 0;
            float4 value    = 10.0f;

            // Get copy of node with populated fields
            node = setup.Graph.LookupNode(node.Handle);
            var nodeParameters = node.Parameters;
            var parameter      = nodeParameters[(int)SingleParameterKernel.Parameters.Parameter];
            var newKeyIndex    = setup.Graph.AppendKey(parameter.KeyIndex, DSPParameterKey.NullIndex, dspClock, value);

            for (int sampleOffset = 0; sampleOffset < 10; ++sampleOffset)
            {
                Assert.AreEqual(value[0], DSPParameterInterpolator.Generate(sampleOffset, setup.Graph.ParameterKeys.UnsafeDataPointer, newKeyIndex, dspClock, float.MinValue, float.MaxValue, value)[0], 0.001f);
            }
        }
    }
Ejemplo n.º 2
0
 protected override void Setup(GraphSetup setup)
 {
     setup
     .Add <ParentTrademark>()
     .Add <Category>()
     .Add <SkuBelongsToCategory>()
     .Add <AliasToBrandElement>()
     .Add <CategoryHasChild>()
     .Add <ReceiptHasOriginalName>()
     .Add <TrademarkElement>()
     .Add <GenericTrademark>()
     .Add <OriginalSkuName>()
     .Add <Barcode>()
     .Add <StatementHasAlias>()
     .Add <FilteredSkuName>()
     .Add <SkuOriginalNameToGenerikTrademark>()
     .Add <Receipt>()
     .Add <SkuNameHasStatement>()
     .Add <SkuNameFiltered>()
     .Add <TrademarkGenericToParent>()
     .Add <SkuNameHasBarcode>()
     .Add <Essence>()
     .Add <Client>()
     .Add <EssenceHasAlias>()
     .Add <ClientToSkuOriginalName>()
     .Add <SkuBelongsToEssence>()
     .Add <StatementAlias>()
     .Add <SkuNameStatement>()
     .Add <TrademarkElementToGeneric>()
     .Add <EssenceContainsCategory>()
     .Add <GenericTrademarkHasAlias>();
 }
    public void UncompletedBlock_IsNotExecuted(DSPGraph.ExecutionMode executionMode)
    {
        using (var setup = new GraphSetup())
        {
            var block = setup.Graph.CreateCommandBlock();
            var node  = block.CreateDSPNode <NoParameters, NoProviders, GenerateOne>();
            block.AddOutletPort(node, GraphSetup.ChannelCount, GraphSetup.SoundFormat);
            block.Connect(node, 0, setup.Graph.RootDSP, 0);

            using (var buffer = new NativeArray <float>(setup.Graph.DSPBufferSize * GraphSetup.ChannelCount, Allocator.Temp, NativeArrayOptions.ClearMemory))
            {
                setup.Graph.BeginMix(setup.Graph.DSPBufferSize, executionMode);
                setup.Graph.ReadMix(buffer, setup.Graph.DSPBufferSize, GraphSetup.ChannelCount);
                foreach (var sample in buffer)
                {
                    Assert.AreEqual(0.0f, sample, 0.001f);
                }

                block.Complete();
                setup.Graph.BeginMix(setup.Graph.DSPBufferSize, executionMode);
                setup.Graph.ReadMix(buffer, setup.Graph.DSPBufferSize, GraphSetup.ChannelCount);
                foreach (var sample in buffer)
                {
                    Assert.AreEqual(1.0f, sample, 0.001f);
                }

                using (block = setup.Graph.CreateCommandBlock())
                    block.ReleaseDSPNode(node);
            }
        }
    }
Ejemplo n.º 4
0
    public void ReleasingNode_InvalidatesHandle()
    {
        DSPNode node = default;

        using (var setup = new GraphSetup((graphSetup, graph, block) =>
        {
            node = graphSetup.CreateDSPNode <NoParameters, NoProviders, LifecycleTracking>();
            block.AddOutletPort(node, kChannelCount, kSoundFormat);
            block.Connect(node, 0, graph.RootDSP, 0);
            graphSetup.CleanupNodes = false;
        }))
        {
            // Ensure that node is created
            setup.PumpGraph();
            Assert.True(node.Valid);

            // Release node
            using (var block = setup.Graph.CreateCommandBlock())
                block.ReleaseDSPNode(node);
            setup.PumpGraph();

            // Ensure that node handle is no longer valid
            Assert.False(node.Valid);
        }
    }
 public void Completing_CanceledCommandBlock_DoesNotWarn()
 {
     using (var setup = new GraphSetup())
         using (var block = setup.Graph.CreateCommandBlock())
             block.Cancel();
     // Complete should have no effect (but also should not produce errors)
 }
 public void DSPClockIncrementsByLength(DSPGraph.ExecutionMode executionMode)
 {
     using (var setup = new GraphSetup())
     {
         for (int i = 0; i < 10; ++i)
         {
             Assert.AreEqual(i * setup.Graph.DSPBufferSize, setup.Graph.DSPClock);
             setup.PumpGraph();
         }
     }
 }
 public void CancelingBlock_InvalidatesHandle(DSPGraph.ExecutionMode executionMode)
 {
     using (var setup = new GraphSetup())
     {
         var block = setup.Graph.CreateCommandBlock();
         var node  = block.CreateDSPNode <NoParameters, NoProviders, GenerateOne>();
         block.AddOutletPort(node, GraphSetup.ChannelCount, GraphSetup.SoundFormat);
         block.Connect(node, 0, setup.Graph.RootDSP, 0);
         block.Cancel();
         Assert.False(block.Valid);
     }
 }
Ejemplo n.º 8
0
 public void AllocatingKernel_Works()
 {
     using (var setup = new GraphSetup((graphSetup, graph, block) =>
     {
         DSPNode node = graphSetup.CreateDSPNode <NoParameters, NoProviders, AllocatingKernel>();
         block.AddOutletPort(node, kChannelCount, kSoundFormat);
         block.Connect(node, 0, graph.RootDSP, 0);
     }))
     {
         setup.PumpGraph();
     }
 }
Ejemplo n.º 9
0
 public void LeakyKernel_EmitsWarning()
 {
     using (var setup = new GraphSetup((graphSetup, graph, block) =>
     {
         DSPNode node = graphSetup.CreateDSPNode <NoParameters, NoProviders, LeakyKernel>();
         block.AddOutletPort(node, kChannelCount, kSoundFormat);
         block.Connect(node, 0, graph.RootDSP, 0);
     }))
     {
         setup.PumpGraph();
         LogAssert.Expect(LogType.Warning, "1 leaked DSP node allocations");
     }
 }
    public void DSPNode_WithNoInputsOrOutputs_IsNotExecuted(DSPGraph.ExecutionMode executionMode)
    {
        DSPNode node = default;

        using (var setup = new GraphSetup((graphSetup, graph, block) =>
        {
            node = graphSetup.CreateDSPNode <NoParameters, NoProviders, LifecycleTracking>();
        }))
        {
            setup.PumpGraph();
            Assert.AreEqual(0, LifecycleTracking.Executed);
        }
    }
Ejemplo n.º 11
0
 public void LeakyGraph_DoesntCrash()
 {
     using (var setup = new GraphSetup((graphSetup, graph, block) =>
     {
         DSPNode node = graphSetup.CreateDSPNode <NoParameters, NoProviders, LifecycleTracking>();
         block.AddOutletPort(node, kChannelCount, kSoundFormat);
         block.Connect(node, 0, graph.RootDSP, 0);
     }))
     {
         setup.CleanupNodes = false;
         LogAssert.Expect(LogType.Warning, kNodeLeakMessage);
         setup.PumpGraph();
     }
 }
Ejemplo n.º 12
0
    public void AllocatingKernelMemory_DuringUpdateJob_Works()
    {
        var node = new DSPNode();

        using (var setup = new GraphSetup((graphSetup, graph, block) =>
        {
            node = graphSetup.CreateDSPNode <NoParameters, NoProviders, LifecycleTracking>();
            block.AddOutletPort(node, kChannelCount, kSoundFormat);
            block.Connect(node, 0, graph.RootDSP, 0);
        }))
        {
            using (var block = setup.Graph.CreateCommandBlock())
                block.CreateUpdateRequest <AllocatingUpdateJob, NoParameters, NoProviders, LifecycleTracking>(new AllocatingUpdateJob(), node, null);
            setup.PumpGraph();
        }
    }
Ejemplo n.º 13
0
 public void StateChange_InvokesLifecycleCallbacks()
 {
     using (var setup = new GraphSetup((graphSetup, graph, block) =>
     {
         DSPNode node = graphSetup.CreateDSPNode <NoParameters, NoProviders, LifecycleTracking>();
         block.AddOutletPort(node, kChannelCount, kSoundFormat);
         block.Connect(node, 0, graph.RootDSP, 0);
     }))
     {
         setup.PumpGraph();
         Assert.Greater(LifecycleTracking.Initialized, 0);
         Assert.Greater(LifecycleTracking.Executed, 0);
         Assert.AreEqual(LifecycleTracking.LifecyclePhase.Executing, LifecycleTracking.Phase);
     }
     Assert.AreEqual(LifecycleTracking.LifecyclePhase.Disposed, LifecycleTracking.Phase);
 }
 public void MultipleBeginMix_Works(DSPGraph.ExecutionMode executionMode)
 {
     using (var setup = new GraphSetup())
     {
         using (var buffer = new NativeArray <float>(setup.Graph.DSPBufferSize * GraphSetup.ChannelCount, Allocator.Temp))
         {
             int i;
             for (i = 0; i < 10; ++i)
             {
                 setup.Graph.BeginMix(setup.Graph.DSPBufferSize);
             }
             setup.Graph.ReadMix(buffer, setup.Graph.DSPBufferSize, GraphSetup.ChannelCount);
             Assert.AreEqual(i * setup.Graph.DSPBufferSize, setup.Graph.DSPClock);
         }
     }
 }
    public void Connect_WithInterleavedBlocks_DoesntCrash(DSPGraph.ExecutionMode executionMode)
    {
        using (var setup = new GraphSetup())
        {
            using (var outerBlock = setup.Graph.CreateCommandBlock())
            {
                var node = outerBlock.CreateDSPNode <NoParameters, NoProviders, NullAudioKernel>();
                using (var innerBlock = setup.Graph.CreateCommandBlock())
                {
                    innerBlock.AddOutletPort(node, GraphSetup.ChannelCount, GraphSetup.SoundFormat);
                    innerBlock.Connect(node, 0, setup.Graph.RootDSP, 0);
                }
            }

            LogAssert.Expect(LogType.Exception, kArgumentException);
        }
    }
    public void ReleasingDSPNode_InChain_KillsSignal(DSPGraph.ExecutionMode executionMode)
    {
        DSPNode generator   = default;
        DSPNode passthrough = default;

        using (var setup = new GraphSetup((graphSetup, graph, block) =>
        {
            generator = block.CreateDSPNode <NoParameters, NoProviders, GenerateOne>();
            block.AddOutletPort(generator, GraphSetup.ChannelCount, GraphSetup.SoundFormat);

            passthrough = block.CreateDSPNode <NoParameters, NoProviders, PassThrough>();
            block.AddInletPort(passthrough, GraphSetup.ChannelCount, GraphSetup.SoundFormat);
            block.AddOutletPort(passthrough, GraphSetup.ChannelCount, GraphSetup.SoundFormat);

            block.Connect(generator, 0, passthrough, 0);
            block.Connect(passthrough, 0, graph.RootDSP, 0);
        }))
        {
            using (var buffer = new NativeArray <float>(setup.Graph.DSPBufferSize * GraphSetup.ChannelCount, Allocator.Temp))
            {
                setup.Graph.BeginMix(setup.Graph.DSPBufferSize);
                setup.Graph.ReadMix(buffer, setup.Graph.DSPBufferSize, GraphSetup.ChannelCount);
                foreach (var sample in buffer)
                {
                    Assert.AreEqual(1.0f, sample, 0.001f);
                }

                using (var block = setup.Graph.CreateCommandBlock())
                    block.ReleaseDSPNode(passthrough);

                setup.Graph.BeginMix(setup.Graph.DSPBufferSize);
                setup.Graph.ReadMix(buffer, setup.Graph.DSPBufferSize, GraphSetup.ChannelCount);
                foreach (var sample in buffer)
                {
                    Assert.AreEqual(0.0f, sample, 0.001f);
                }

                using (var block = setup.Graph.CreateCommandBlock())
                    block.ReleaseDSPNode(generator);
            }
        }
    }
 public void MixOverwritesData(DSPGraph.ExecutionMode executionMode)
 {
     using (var setup = new GraphSetup((graphSetup, graph, block) =>
     {
         DSPNode node = graphSetup.CreateDSPNode <NoParameters, NoProviders, GenerateOne>();
         block.AddOutletPort(node, GraphSetup.ChannelCount, GraphSetup.SoundFormat);
         block.Connect(node, 0, graph.RootDSP, 0);
     }))
     {
         using (var buffer = new NativeArray <float>(setup.Graph.DSPBufferSize * GraphSetup.ChannelCount, Allocator.Temp, NativeArrayOptions.ClearMemory))
         {
             setup.Graph.BeginMix(setup.Graph.DSPBufferSize, executionMode);
             setup.Graph.ReadMix(buffer, setup.Graph.DSPBufferSize, GraphSetup.ChannelCount);
             foreach (var sample in buffer)
             {
                 Assert.AreEqual(1.0f, sample, 0.001f);
             }
         }
     }
 }
Ejemplo n.º 18
0
    public void WritingToInputBuffer_Throws(DSPGraph.ExecutionMode executionMode)
    {
        using (var setup = new GraphSetup((graphSetup, graph, block) =>
        {
            DSPNode generator = graphSetup.CreateDSPNode <NoParameters, NoProviders, GenerateOne>();
            block.AddOutletPort(generator, kChannelCount, kSoundFormat);

            DSPNode node = graphSetup.CreateDSPNode <NoParameters, NoProviders, WritingToInputBufferKernel>();
            block.AddInletPort(node, kChannelCount, kSoundFormat);
            block.AddOutletPort(node, kChannelCount, kSoundFormat);

            block.Connect(generator, 0, node, 0);
            block.Connect(node, 0, graph.RootDSP, 0);
        }))
        {
            using (var buff = new NativeArray <float>(200, Allocator.TempJob))
            {
                setup.Graph.BeginMix(0, executionMode);
                setup.Graph.ReadMix(buff, 200 / kChannelCount, kChannelCount);
            }
        }
    }
Ejemplo n.º 19
0
 public ReadonlyGraph(GraphSetup setup)
 {
     Setup = setup;
 }