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); }
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); }
/// <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); }