Пример #1
0
        private IList <SoundItem4NAudio> _queueInternal; //встроенная очередь элементов.
        public async Task <bool> PlayFile(IEnumerable <SoundItem> sounds, CancellationToken cts)
        {
            SetVolume(0.9f);

            //Создадим все проигрываемые объекты--------------------------------
            _queueInternal = sounds.Select(item => new SoundItem4NAudio(item)).ToList();

            //Проиграем все объекты --------------------------------------------
            try
            {
                for (var i = 0; i < _queueInternal.Count; i++)
                {
                    var item = _queueInternal[i];
                    _playingItem = item;
                    await PlaySoundItem(item, cts); //При сработке cts, генерируется исключение и мы попадаем в блок finally.

                    _playingItem = null;
                    await Task.Delay(item.SoundItem.PauseTime ?? 0, cts);
                }
            }
            finally
            {
                //Уничтожим все проигранные объекты --------------------------
                foreach (var elem in _queueInternal)
                {
                    elem.Dispose();
                }
            }

            return(true);
        }
Пример #2
0
        private Task <PlaybackState> PlaySoundItem(SoundItem4NAudio soundItem4NAudio, CancellationToken ct)
        {
            var waveOutDevice = soundItem4NAudio.WaveOutDevice;
            var cts           = new CancellationTokenSource();

            //ЗАПУСК ВОСПРОИЗВЕДЕНИЯ-----------------------------------------------------------------
            try
            {
                if (waveOutDevice.PlaybackState == PlaybackState.Paused ||
                    waveOutDevice.PlaybackState == PlaybackState.Stopped)
                {
                    waveOutDevice.Play();
                }
            }
            catch (Exception ex)
            {
                //LOG
                cts.Cancel();
                _tcsPlaySoundItem.TrySetException(ex);
            }

            //ЗАПУСК ЗАДАЧИ ОЖИДАНИЯ КОНЦА ВОСПРОИЗВЕДЕНИЯ--------------------------------------------
            _tcsPlaySoundItem = new TaskCompletionSource <PlaybackState>();
            Task.Run(() =>
            {
                while (!cts.Token.IsCancellationRequested)
                {
                    if (ct.IsCancellationRequested)                        //ЗАВЕРЕШЕНИЕ ЗАДАЧИ ВНЕШНИМ ТОКЕНОМ ОТМЕНЫ
                    {
                        cts.Cancel();
                        _tcsPlaySoundItem.TrySetCanceled();
                        break;
                    }

                    switch (waveOutDevice.PlaybackState)
                    {
                    case PlaybackState.Stopped:                           //ЗАВЕРШЕНИЕ ЗАДАЧИ ПО ОКОНЧАНИЮ ПРОИГРЫВАНИЯ
                        cts.Cancel();
                        _tcsPlaySoundItem.TrySetResult(waveOutDevice.PlaybackState);
                        break;
                    }
                }
            }, cts.Token);

            return(_tcsPlaySoundItem.Task);
        }
Пример #3
0
        /// <summary>
        /// Проиграть 1 звуковой элемент (1 файл).
        /// </summary>
        public async Task <bool> PlayFile(SoundItem soundItem, CancellationToken cts)
        {
            SetVolume(0.9f);
            var item = new SoundItem4NAudio(soundItem);

            try
            {
                _playingItem = item;
                await PlaySoundItem(item, cts); //При сработке cts, генерируется исключение и мы попадаем в блок finally.

                _playingItem = null;
            }
            finally
            {
                item.Dispose();
            }
            return(true);
        }