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(string path, AudioStreamPolicy streamPolicy, CancellationToken cancellationToken) { var tcs = new TaskCompletionSource <bool>(); Native.WavPlayerCompletedCallback cb = (id_, _) => tcs.TrySetResult(true); using (ObjectKeeper.Get(cb)) { Native.Start(path, streamPolicy.Handle, cb, IntPtr.Zero, out var id). Validate("Failed to play."); using (RegisterCancellationAction(tcs, cancellationToken, id)) { await tcs.Task; } } }