Accord.Audio.AudioSourceMixer.WorkerThread C# (CSharp) Method

WorkerThread() private method

Worker thread.
private WorkerThread ( ) : void
return void
        private unsafe void WorkerThread()
        {
            try
            {
                needToStop = false;

                // Rearm the auto reset events
                for (int i = 0; i < stopEvents.Length; i++)
                    stopEvents[i].Reset();


                if (Sources.Length == 1)
                {
                    // Single audio source
                    while (!needToStop)
                    {
                        stopEvents[0].WaitOne();
                        Signal signal = signals[0];
                        OnNewFrame(signal);
                    }
                }
                else
                {
                    // Multiple sources
                    while (!needToStop)
                    {
                        short[] dst = new short[frameSize * channels];

                        for (int i = 0; i < signals.Length; i++)
                        {
                            stopEvents[i].WaitOne();
                            Signal signal = signals[i];

                            short* src = (short*)signal.Data.ToPointer();

                            if (signal.Channels < channels)
                            {
                                for (int j = 0; j < frameSize; j += 2, src++)
                                {
                                    dst[j] = mix(dst[j], *src);
                                    dst[j + 1] = mix(dst[j + 1], *src);
                                }
                            }
                            else
                            {
                                for (int j = 0; j < dst.Length; j++, src++)
                                {
                                    dst[j] = mix(dst[j], *src);
                                }
                            }
                        }

                        OnNewFrame(dst);
                    }
                }
            }
            catch (Exception ex)
            {
                if (!needToStop)
                {
                    if (AudioSourceError != null)
                        AudioSourceError(this, new AudioSourceErrorEventArgs(ex.Message));
                    else throw;
                }
            }
            finally
            {
                for (int i = 0; i < Sources.Length; i++)
                    Sources[i].SignalToStop();
            }
        }