Esempio n. 1
0
        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();
            }));
        }
Esempio n. 2
0
        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;
                }
            }
        }