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); } } }
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); } } }
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); } }
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(); } }
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); } }
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(); } }
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(); } }
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); } } } }
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); } } }
public ReadonlyGraph(GraphSetup setup) { Setup = setup; }