private static IDisposable RegisterCancellationAction(TaskCompletionSource <bool> tcs, CancellationToken cancellationToken, int id) { if (cancellationToken.CanBeCanceled == false) { return(null); } return(cancellationToken.Register(() => { Native.Stop(id).Validate("Failed to cancel"); tcs.TrySetCanceled(); })); }
private static async Task StartAsyncCore(ToneType tone, AudioStreamPolicy streamPolicy, int durationMilliseconds, CancellationToken cancellationToken) { var tcs = new TaskCompletionSource <bool>(); Native.Start(tone, streamPolicy.Handle, durationMilliseconds, out var id). Validate("Failed to play tone."); using (RegisterCancellationAction(tcs, cancellationToken, id)) { await WaitForDuration(tcs, cancellationToken, durationMilliseconds); await tcs.Task; } }