private async void Open_Click(object sender, RoutedEventArgs e) { var ofn = new OpenFileDialog { Filter = CodecFactory.SupportedFilesFilterEn }; if (ofn.ShowDialog() == true) { _soundOut.Stop(); if (_notificationSource != null) { _notificationSource.Dispose(); } var source = CodecFactory.Instance.GetCodec(ofn.FileName); source = new CachedSoundSource(source); source.Position = 0; await LoadWaveformsAsync(source); source.Position = 0; _sampleSource = source.ToSampleSource(); _notificationSource = new NotificationSource(_sampleSource) { Interval = 100 }; _notificationSource.BlockRead += (o, args) => { UpdatePosition(); }; _soundOut.Initialize(_notificationSource.ToWaveSource()); _soundOut.Play(); } }
private async void Open_Click(object sender, RoutedEventArgs e) { var ofn = new OpenFileDialog { Filter = CodecFactory.SupportedFilesFilterEn }; if (ofn.ShowDialog() == true) { _soundOut.Stop(); if (_notificationSource != null) { _notificationSource.Dispose(); } var source = CodecFactory.Instance.GetCodec(ofn.FileName); //since the mediafoundationdecoder isn't really accurate what position and length concerns //read the whole file into a cache if (source is MediaFoundationDecoder) { if (source.Length < 10485760) //10MB { source = new CachedSoundSource(source); } else { Stopwatch stopwatch = Stopwatch.StartNew(); source = new FileCachedSoundSource(source); stopwatch.Stop(); Debug.WriteLine(stopwatch.Elapsed.ToString()); } } source.Position = 0; //load the waveform await LoadWaveformsAsync(source); source.Position = 0; _sampleSource = source.ToSampleSource(); _notificationSource = new NotificationSource(_sampleSource) { Interval = 100 }; _notificationSource.BlockRead += (o, args) => { UpdatePosition(); }; _soundOut.Initialize(_notificationSource.ToWaveSource()); _soundOut.Play(); } }
private void MainWindow_OnClosing(object sender, CancelEventArgs e) { if (_soundOut != null) { _soundOut.Dispose(); } if (_notificationSource != null) { _notificationSource.Dispose(); } }