private void RunInternal(IEventInput input, CancellationToken cancellationToken) { if (Output == null) { throw new Exception("SynthesizerPlayer was not initialized"); } Output.Play(); updateADSR(); updateFrequencyFilter(); bool exit = false; while (!input.Exit && !exit && !cancellationToken.IsCancellationRequested) { var result = input.Read(); if (input.Event == null) { continue; } switch (result) { case EventReadResult.Failed: exit = true; Console.WriteLine("Failed to read next buffer"); continue; case EventReadResult.Timeout: continue; } if (DebugPrint) { Console.WriteLine($"Event : {input.Event}"); } switch (input.Event.Type) { case ToneEventType.Key: var key = (ToneKeyEvent)input.Event; handleKeyEvent(key); break; case ToneEventType.Thumb: var thumb = (ToneThumbEvent)input.Event; handleThumbEvent(thumb); break; case ToneEventType.Filter: handleFilterEvent(); break; case ToneEventType.Wave: handleWaveEvent(); break; } } Output.Buffer -= OutputOnBuffer; Output.Stop(); if (DebugPrint) { Console.WriteLine("Output has stopped"); } Output.Dispose(); if (DebugPrint) { Console.WriteLine("Thread exited successfully"); } }