Exemplo n.º 1
0
 /// <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;
         }
     }
 }
Exemplo n.º 2
0
 /// <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;
         }
     }
 }
Exemplo n.º 3
0
        /// <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);
        }