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();
}
}