/// <summary> /// Link the next element to the given <see cref="SplitterDestination"/>. /// </summary> /// <param name="next">The given <see cref="SplitterDestination"/> to link.</param> public void Link(ref SplitterDestination next) { unsafe { fixed(SplitterDestination *nextPtr = &next) { _next = nextPtr; } } }
/// <summary> /// Set the head of the linked list of <see cref="Destinations"/>. /// </summary> /// <param name="newValue">A reference to a <see cref="SplitterDestination"/>.</param> public void SetDestination(ref SplitterDestination newValue) { unsafe { fixed(SplitterDestination *newValuePtr = &newValue) { _destinationsData = newValuePtr; } } }
/// <summary> /// Initialize <see cref="SplitterContext"/>. /// </summary> /// <param name="behaviourContext">The behaviour context.</param> /// <param name="parameter">The audio renderer configuration.</param> /// <param name="workBufferAllocator">The <see cref="WorkBufferAllocator"/>.</param> /// <returns>Return true if the initialization was successful.</returns> public bool Initialize(ref BehaviourContext behaviourContext, ref AudioRendererConfiguration parameter, WorkBufferAllocator workBufferAllocator) { if (!behaviourContext.IsSplitterSupported() || parameter.SplitterCount <= 0 || parameter.SplitterDestinationCount <= 0) { Setup(Memory <SplitterState> .Empty, Memory <SplitterDestination> .Empty, false); return(true); } Memory <SplitterState> splitters = workBufferAllocator.Allocate <SplitterState>(parameter.SplitterCount, SplitterState.Alignment); if (splitters.IsEmpty) { return(false); } int splitterId = 0; foreach (ref SplitterState splitter in splitters.Span) { splitter = new SplitterState(splitterId++); } Memory <SplitterDestination> splitterDestinations = workBufferAllocator.Allocate <SplitterDestination>(parameter.SplitterDestinationCount, SplitterDestination.Alignment); if (splitterDestinations.IsEmpty) { return(false); } int splitterDestinationId = 0; foreach (ref SplitterDestination data in splitterDestinations.Span) { data = new SplitterDestination(splitterDestinationId++); } SplitterState.InitializeSplitters(splitters.Span); Setup(splitters, splitterDestinations, behaviourContext.IsSplitterBugFixed()); return(true); }