Newer
Older
Correlator / Correlator / ViewModels / AudioFileViewModel.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Controls;
using Correlator.Model;
using Correlator.Util;
using HandyControl.Controls;
using HandyControl.Data;
using NAudio.Wave;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Services.Dialogs;

namespace Correlator.ViewModels
{
    public class AudioFileViewModel : BindableBase, IDialogAware
    {
        #region 属性绑定

        public string Title { get; private set; } = string.Empty;
        public event Action<IDialogResult> RequestClose;
        private List<AudioFile> _totalFiles;

        private List<AudioFile> _audioFiles;

        public List<AudioFile> AudioFiles
        {
            get => _audioFiles;
            set
            {
                _audioFiles = value;
                RaisePropertyChanged();
            }
        }

        private string _audioState = "未播放";

        public string AudioState
        {
            get => _audioState;
            set
            {
                _audioState = value;
                RaisePropertyChanged();
            }
        }

        private int _pageIndex = 1;

        public int PageIndex
        {
            get => _pageIndex;
            set
            {
                _pageIndex = value;
                RaisePropertyChanged();
            }
        }

        private int _maxPage;

        public int MaxPage
        {
            get => _maxPage;
            set
            {
                _maxPage = value;
                RaisePropertyChanged();
            }
        }

        #endregion

        #region DelegateCommand

        public DelegateCommand GoBackCommand { get; set; }
        public DelegateCommand<DataGrid> ItemSelectedCommand { get; set; }
        public DelegateCommand PlayAudioCommand { get; set; }
        public DelegateCommand DeleteAudioCommand { get; set; }
        public DelegateCommand<FunctionEventArgs<int>> PageUpdatedCmd { get; set; }

        #endregion

        private AudioFile _selectedFile;
        private WaveOutEvent _waveOutEvent = new WaveOutEvent();
        private AudioFileReader _audioFileReader;

        public AudioFileViewModel(IDialogService dialogService)
        {
            GoBackCommand = new DelegateCommand(delegate
            {
                if (_audioFileReader != null)
                {
                    _audioFileReader.Dispose();
                    _audioFileReader = null;
                }

                if (_waveOutEvent != null)
                {
                    _waveOutEvent.Dispose();
                    _waveOutEvent = null;
                }

                RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
            });

            ItemSelectedCommand = new DelegateCommand<DataGrid>(delegate(DataGrid dataGrid)
            {
                _selectedFile = (AudioFile)dataGrid.SelectedItem;
            });

            PlayAudioCommand = new DelegateCommand(delegate
            {
                if (_selectedFile == null)
                {
                    dialogService.ShowDialog(
                        "AlertMessageDialog",
                        new DialogParameters
                        {
                            { "AlertType", AlertType.Error }, { "Title", "温馨提示" }, { "Message", "音频文件路径错误,无法播放" }
                        },
                        delegate { }
                    );
                    return;
                }

                if (_waveOutEvent.PlaybackState == PlaybackState.Playing)
                {
                    _waveOutEvent.Dispose();
                    _audioFileReader.Dispose();

                    AudioState = "未播放";
                }
                else
                {
                    try
                    {
                        _audioFileReader = new AudioFileReader(_selectedFile.FullPath);
                        _waveOutEvent.Init(_audioFileReader);
                        _waveOutEvent.Play();

                        //获取时长
                        AudioState = $"时长:{_audioFileReader.TotalTime.TotalSeconds}s";
                    }
                    catch (FormatException)
                    {
                        dialogService.ShowDialog(
                            "AlertMessageDialog",
                            new DialogParameters
                            {
                                { "AlertType", AlertType.Error }, { "Title", "温馨提示" }, { "Message", "音频文件已损坏,无法播放" }
                            },
                            delegate { }
                        );

                        // MessageBox.Show("音频文件损坏,无法播放", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Error);
                    }
                }
            });

            DeleteAudioCommand = new DelegateCommand(() =>
            {
                if (_selectedFile == null)
                {
                    Growl.Error("删除失败");
                    return;
                }

                if (_waveOutEvent.PlaybackState == PlaybackState.Playing)
                {
                    _waveOutEvent.Dispose();
                    _audioFileReader.Dispose();
                }

                try
                {
                    File.Delete(_selectedFile.FullPath);

                    //刷新数据
                    _totalFiles = GetTotalAudioFiles();
                    MaxPage = _totalFiles.Count.GetPageSize();
                    AudioFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList();
                }
                catch (IOException)
                {
                    Growl.Error("删除失败");
                }
            });

            PageUpdatedCmd = new DelegateCommand<FunctionEventArgs<int>>(args =>
            {
                AudioFiles = _totalFiles
                    .Skip((args.Info - 1) * RuntimeCache.PerPageItemCount)
                    .Take(RuntimeCache.PerPageItemCount)
                    .ToList();
            });
        }

        public bool CanCloseDialog()
        {
            return true;
        }

        public void OnDialogClosed()
        {
        }

        public void OnDialogOpened(IDialogParameters parameters)
        {
            _totalFiles = GetTotalAudioFiles();
            MaxPage = _totalFiles.Count.GetPageSize();
            AudioFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList();
        }

        private static List<AudioFile> GetTotalAudioFiles()
        {
            var audioFiles = new List<AudioFile>();
            var i = 1;
            //筛选大于1K的音频文件
            var files = new DirectoryInfo(DirectoryManager.GetAudioDir()).GetFiles("*", SearchOption.AllDirectories);
            foreach (var file in files)
            {
                if (file.Length < 1024)
                {
                    RuntimeCache.SmallAudioFiles.Add(file.FullName);
                }
                else
                {
                    var fileName = file.Name;
                    string fileSource;
                    if (fileName.Contains("听音"))
                    {
                        fileSource = "听音";
                    }
                    else
                    {
                        fileSource = "";
                    }

                    audioFiles.Add(new AudioFile
                    {
                        Order = i++,
                        FileName = fileName,
                        FileSource = fileSource,
                        FullPath = DirectoryManager.GetAudioDir() + "\\" + fileName,
                        FileSize = file.Length.FormatFileSize(),
                        CreationTime = file.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"),
                        IsPlaying = false
                    });
                }
            }

            return audioFiles;
        }
    }
}