diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 8e2a134..fc7a865 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,6 +1,5 @@ using System; using System.Threading; -using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -9,24 +8,18 @@ { public class AudioServiceImpl : IAudioService { + private bool _isStopped; private WaveFileWriter _waveFileWriter; - - private readonly WaveOut _waveOut = new WaveOut(); - - private readonly Lazy _lazyWaveProvider = new Lazy( - () => new BufferedWaveProvider(new WaveFormat(7500, 24, 1)) - ); + private BufferedWaveProvider _waveProvider; + private readonly WaveFormat _waveFormat = new WaveFormat(7500, 24, 1); public void Start(string deviceCode) { - //异步执行听音,不然会卡住界面 - Task.Run(delegate { StartListenAudio(deviceCode); }); - } + _isStopped = false; - private void StartListenAudio(string deviceCode) - { - _waveOut.Init(_lazyWaveProvider.Value); - _waveOut.Play(); + _waveProvider = new BufferedWaveProvider(_waveFormat); + var waveOut = new WaveOut(); + waveOut.Init(_waveProvider); string fileName; var audioDir = DirectoryManager.GetAudioDir(); @@ -42,30 +35,30 @@ fileName = $"{audioDir}/听音_蓝_{time}.wav"; } - _waveFileWriter = new WaveFileWriter(fileName, new WaveFormat(7500, 24, 1)); + _waveFileWriter = new WaveFileWriter(fileName, _waveFormat); + + //异步执行听音,不然会卡住界面 + waveOut.Play(); } + //缓存声波数据已经是后台线程了(处于线程池中) public void Write(byte[] pcm) { - _lazyWaveProvider.Value.AddSamples(pcm, 0, pcm.Length); - - //将pcm数据保存为wav格式文件 - if (_waveFileWriter == null) + if (_isStopped) { return; } - _waveFileWriter.Write(pcm, 0, pcm.Length); + _waveProvider?.AddSamples(pcm, 0, pcm.Length); + _waveFileWriter?.Write(pcm, 0, pcm.Length); } public void Stop() { - _waveOut.Stop(); + _isStopped = true; + _waveProvider.ClearBuffer(); _waveFileWriter.Dispose(); - _waveFileWriter = null; - - _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 8e2a134..fc7a865 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,6 +1,5 @@ using System; using System.Threading; -using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -9,24 +8,18 @@ { public class AudioServiceImpl : IAudioService { + private bool _isStopped; private WaveFileWriter _waveFileWriter; - - private readonly WaveOut _waveOut = new WaveOut(); - - private readonly Lazy _lazyWaveProvider = new Lazy( - () => new BufferedWaveProvider(new WaveFormat(7500, 24, 1)) - ); + private BufferedWaveProvider _waveProvider; + private readonly WaveFormat _waveFormat = new WaveFormat(7500, 24, 1); public void Start(string deviceCode) { - //异步执行听音,不然会卡住界面 - Task.Run(delegate { StartListenAudio(deviceCode); }); - } + _isStopped = false; - private void StartListenAudio(string deviceCode) - { - _waveOut.Init(_lazyWaveProvider.Value); - _waveOut.Play(); + _waveProvider = new BufferedWaveProvider(_waveFormat); + var waveOut = new WaveOut(); + waveOut.Init(_waveProvider); string fileName; var audioDir = DirectoryManager.GetAudioDir(); @@ -42,30 +35,30 @@ fileName = $"{audioDir}/听音_蓝_{time}.wav"; } - _waveFileWriter = new WaveFileWriter(fileName, new WaveFormat(7500, 24, 1)); + _waveFileWriter = new WaveFileWriter(fileName, _waveFormat); + + //异步执行听音,不然会卡住界面 + waveOut.Play(); } + //缓存声波数据已经是后台线程了(处于线程池中) public void Write(byte[] pcm) { - _lazyWaveProvider.Value.AddSamples(pcm, 0, pcm.Length); - - //将pcm数据保存为wav格式文件 - if (_waveFileWriter == null) + if (_isStopped) { return; } - _waveFileWriter.Write(pcm, 0, pcm.Length); + _waveProvider?.AddSamples(pcm, 0, pcm.Length); + _waveFileWriter?.Write(pcm, 0, pcm.Length); } public void Stop() { - _waveOut.Stop(); + _isStopped = true; + _waveProvider.ClearBuffer(); _waveFileWriter.Dispose(); - _waveFileWriter = null; - - _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/Util/AudioVisualizer.cs b/Correlator/Util/AudioVisualizer.cs index c4b1f45..9a888f5 100644 --- a/Correlator/Util/AudioVisualizer.cs +++ b/Correlator/Util/AudioVisualizer.cs @@ -2,6 +2,7 @@ using System.Linq; using FftSharp; using FftSharp.Windows; +using Complex = System.Numerics.Complex; namespace Correlator.Util { @@ -69,7 +70,7 @@ data[i] = new Complex(SampleData[i], 0); } - Transform.FFT(data); + FFT.Forward(data); var halfLen = len / 2; var result = new double[halfLen]; // 傅里叶变换结果左右对称, 只需要取一半 diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 8e2a134..fc7a865 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,6 +1,5 @@ using System; using System.Threading; -using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -9,24 +8,18 @@ { public class AudioServiceImpl : IAudioService { + private bool _isStopped; private WaveFileWriter _waveFileWriter; - - private readonly WaveOut _waveOut = new WaveOut(); - - private readonly Lazy _lazyWaveProvider = new Lazy( - () => new BufferedWaveProvider(new WaveFormat(7500, 24, 1)) - ); + private BufferedWaveProvider _waveProvider; + private readonly WaveFormat _waveFormat = new WaveFormat(7500, 24, 1); public void Start(string deviceCode) { - //异步执行听音,不然会卡住界面 - Task.Run(delegate { StartListenAudio(deviceCode); }); - } + _isStopped = false; - private void StartListenAudio(string deviceCode) - { - _waveOut.Init(_lazyWaveProvider.Value); - _waveOut.Play(); + _waveProvider = new BufferedWaveProvider(_waveFormat); + var waveOut = new WaveOut(); + waveOut.Init(_waveProvider); string fileName; var audioDir = DirectoryManager.GetAudioDir(); @@ -42,30 +35,30 @@ fileName = $"{audioDir}/听音_蓝_{time}.wav"; } - _waveFileWriter = new WaveFileWriter(fileName, new WaveFormat(7500, 24, 1)); + _waveFileWriter = new WaveFileWriter(fileName, _waveFormat); + + //异步执行听音,不然会卡住界面 + waveOut.Play(); } + //缓存声波数据已经是后台线程了(处于线程池中) public void Write(byte[] pcm) { - _lazyWaveProvider.Value.AddSamples(pcm, 0, pcm.Length); - - //将pcm数据保存为wav格式文件 - if (_waveFileWriter == null) + if (_isStopped) { return; } - _waveFileWriter.Write(pcm, 0, pcm.Length); + _waveProvider?.AddSamples(pcm, 0, pcm.Length); + _waveFileWriter?.Write(pcm, 0, pcm.Length); } public void Stop() { - _waveOut.Stop(); + _isStopped = true; + _waveProvider.ClearBuffer(); _waveFileWriter.Dispose(); - _waveFileWriter = null; - - _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/Util/AudioVisualizer.cs b/Correlator/Util/AudioVisualizer.cs index c4b1f45..9a888f5 100644 --- a/Correlator/Util/AudioVisualizer.cs +++ b/Correlator/Util/AudioVisualizer.cs @@ -2,6 +2,7 @@ using System.Linq; using FftSharp; using FftSharp.Windows; +using Complex = System.Numerics.Complex; namespace Correlator.Util { @@ -69,7 +70,7 @@ data[i] = new Complex(SampleData[i], 0); } - Transform.FFT(data); + FFT.Forward(data); var halfLen = len / 2; var result = new double[halfLen]; // 傅里叶变换结果左右对称, 只需要取一半 diff --git a/Correlator/ViewModels/AudioFileViewModel.cs b/Correlator/ViewModels/AudioFileViewModel.cs index 8366c70..f614c12 100644 --- a/Correlator/ViewModels/AudioFileViewModel.cs +++ b/Correlator/ViewModels/AudioFileViewModel.cs @@ -10,7 +10,6 @@ using HandyControl.Data; using NAudio.Wave; using Prism.Commands; -using Prism.Events; using Prism.Mvvm; using Prism.Services.Dialogs; @@ -117,7 +116,7 @@ Interval = new TimeSpan(0, 0, 0, 1) }; - public AudioFileViewModel(IDialogService dialogService, IEventAggregator eventAggregator) + public AudioFileViewModel(IDialogService dialogService) { _audioTimer.Tick += delegate { @@ -236,6 +235,8 @@ //刷新数据 _totalFiles = GetTotalAudioFiles(); MaxPage = _totalFiles.Count.GetPageSize(); + //页码重置 + PageIndex = 1; AudioFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } catch (IOException) @@ -281,11 +282,11 @@ { var audioFiles = new List(); var i = 1; - //筛选大于1K的音频文件 + //筛选大于50K的音频文件 var files = new DirectoryInfo(DirectoryManager.GetAudioDir()).GetFiles("*", SearchOption.AllDirectories); foreach (var file in files) { - if (file.Length < 1024) + if (file.Length < 1024 * 50) { RuntimeCache.SmallAudioFiles.Add(file.FullName); } diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 8e2a134..fc7a865 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,6 +1,5 @@ using System; using System.Threading; -using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -9,24 +8,18 @@ { public class AudioServiceImpl : IAudioService { + private bool _isStopped; private WaveFileWriter _waveFileWriter; - - private readonly WaveOut _waveOut = new WaveOut(); - - private readonly Lazy _lazyWaveProvider = new Lazy( - () => new BufferedWaveProvider(new WaveFormat(7500, 24, 1)) - ); + private BufferedWaveProvider _waveProvider; + private readonly WaveFormat _waveFormat = new WaveFormat(7500, 24, 1); public void Start(string deviceCode) { - //异步执行听音,不然会卡住界面 - Task.Run(delegate { StartListenAudio(deviceCode); }); - } + _isStopped = false; - private void StartListenAudio(string deviceCode) - { - _waveOut.Init(_lazyWaveProvider.Value); - _waveOut.Play(); + _waveProvider = new BufferedWaveProvider(_waveFormat); + var waveOut = new WaveOut(); + waveOut.Init(_waveProvider); string fileName; var audioDir = DirectoryManager.GetAudioDir(); @@ -42,30 +35,30 @@ fileName = $"{audioDir}/听音_蓝_{time}.wav"; } - _waveFileWriter = new WaveFileWriter(fileName, new WaveFormat(7500, 24, 1)); + _waveFileWriter = new WaveFileWriter(fileName, _waveFormat); + + //异步执行听音,不然会卡住界面 + waveOut.Play(); } + //缓存声波数据已经是后台线程了(处于线程池中) public void Write(byte[] pcm) { - _lazyWaveProvider.Value.AddSamples(pcm, 0, pcm.Length); - - //将pcm数据保存为wav格式文件 - if (_waveFileWriter == null) + if (_isStopped) { return; } - _waveFileWriter.Write(pcm, 0, pcm.Length); + _waveProvider?.AddSamples(pcm, 0, pcm.Length); + _waveFileWriter?.Write(pcm, 0, pcm.Length); } public void Stop() { - _waveOut.Stop(); + _isStopped = true; + _waveProvider.ClearBuffer(); _waveFileWriter.Dispose(); - _waveFileWriter = null; - - _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/Util/AudioVisualizer.cs b/Correlator/Util/AudioVisualizer.cs index c4b1f45..9a888f5 100644 --- a/Correlator/Util/AudioVisualizer.cs +++ b/Correlator/Util/AudioVisualizer.cs @@ -2,6 +2,7 @@ using System.Linq; using FftSharp; using FftSharp.Windows; +using Complex = System.Numerics.Complex; namespace Correlator.Util { @@ -69,7 +70,7 @@ data[i] = new Complex(SampleData[i], 0); } - Transform.FFT(data); + FFT.Forward(data); var halfLen = len / 2; var result = new double[halfLen]; // 傅里叶变换结果左右对称, 只需要取一半 diff --git a/Correlator/ViewModels/AudioFileViewModel.cs b/Correlator/ViewModels/AudioFileViewModel.cs index 8366c70..f614c12 100644 --- a/Correlator/ViewModels/AudioFileViewModel.cs +++ b/Correlator/ViewModels/AudioFileViewModel.cs @@ -10,7 +10,6 @@ using HandyControl.Data; using NAudio.Wave; using Prism.Commands; -using Prism.Events; using Prism.Mvvm; using Prism.Services.Dialogs; @@ -117,7 +116,7 @@ Interval = new TimeSpan(0, 0, 0, 1) }; - public AudioFileViewModel(IDialogService dialogService, IEventAggregator eventAggregator) + public AudioFileViewModel(IDialogService dialogService) { _audioTimer.Tick += delegate { @@ -236,6 +235,8 @@ //刷新数据 _totalFiles = GetTotalAudioFiles(); MaxPage = _totalFiles.Count.GetPageSize(); + //页码重置 + PageIndex = 1; AudioFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } catch (IOException) @@ -281,11 +282,11 @@ { var audioFiles = new List(); var i = 1; - //筛选大于1K的音频文件 + //筛选大于50K的音频文件 var files = new DirectoryInfo(DirectoryManager.GetAudioDir()).GetFiles("*", SearchOption.AllDirectories); foreach (var file in files) { - if (file.Length < 1024) + if (file.Length < 1024 * 50) { RuntimeCache.SmallAudioFiles.Add(file.FullName); } diff --git a/Correlator/ViewModels/PictureFileViewModel.cs b/Correlator/ViewModels/PictureFileViewModel.cs index de4d7bb..74f86fd 100644 --- a/Correlator/ViewModels/PictureFileViewModel.cs +++ b/Correlator/ViewModels/PictureFileViewModel.cs @@ -116,6 +116,8 @@ //刷新数据 _totalFiles = GetTotalPictureFiles(); MaxPage = _totalFiles.Count.GetPageSize(); + //页码重置 + PageIndex = 1; PictureFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } catch (IOException) diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 8e2a134..fc7a865 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,6 +1,5 @@ using System; using System.Threading; -using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -9,24 +8,18 @@ { public class AudioServiceImpl : IAudioService { + private bool _isStopped; private WaveFileWriter _waveFileWriter; - - private readonly WaveOut _waveOut = new WaveOut(); - - private readonly Lazy _lazyWaveProvider = new Lazy( - () => new BufferedWaveProvider(new WaveFormat(7500, 24, 1)) - ); + private BufferedWaveProvider _waveProvider; + private readonly WaveFormat _waveFormat = new WaveFormat(7500, 24, 1); public void Start(string deviceCode) { - //异步执行听音,不然会卡住界面 - Task.Run(delegate { StartListenAudio(deviceCode); }); - } + _isStopped = false; - private void StartListenAudio(string deviceCode) - { - _waveOut.Init(_lazyWaveProvider.Value); - _waveOut.Play(); + _waveProvider = new BufferedWaveProvider(_waveFormat); + var waveOut = new WaveOut(); + waveOut.Init(_waveProvider); string fileName; var audioDir = DirectoryManager.GetAudioDir(); @@ -42,30 +35,30 @@ fileName = $"{audioDir}/听音_蓝_{time}.wav"; } - _waveFileWriter = new WaveFileWriter(fileName, new WaveFormat(7500, 24, 1)); + _waveFileWriter = new WaveFileWriter(fileName, _waveFormat); + + //异步执行听音,不然会卡住界面 + waveOut.Play(); } + //缓存声波数据已经是后台线程了(处于线程池中) public void Write(byte[] pcm) { - _lazyWaveProvider.Value.AddSamples(pcm, 0, pcm.Length); - - //将pcm数据保存为wav格式文件 - if (_waveFileWriter == null) + if (_isStopped) { return; } - _waveFileWriter.Write(pcm, 0, pcm.Length); + _waveProvider?.AddSamples(pcm, 0, pcm.Length); + _waveFileWriter?.Write(pcm, 0, pcm.Length); } public void Stop() { - _waveOut.Stop(); + _isStopped = true; + _waveProvider.ClearBuffer(); _waveFileWriter.Dispose(); - _waveFileWriter = null; - - _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/Util/AudioVisualizer.cs b/Correlator/Util/AudioVisualizer.cs index c4b1f45..9a888f5 100644 --- a/Correlator/Util/AudioVisualizer.cs +++ b/Correlator/Util/AudioVisualizer.cs @@ -2,6 +2,7 @@ using System.Linq; using FftSharp; using FftSharp.Windows; +using Complex = System.Numerics.Complex; namespace Correlator.Util { @@ -69,7 +70,7 @@ data[i] = new Complex(SampleData[i], 0); } - Transform.FFT(data); + FFT.Forward(data); var halfLen = len / 2; var result = new double[halfLen]; // 傅里叶变换结果左右对称, 只需要取一半 diff --git a/Correlator/ViewModels/AudioFileViewModel.cs b/Correlator/ViewModels/AudioFileViewModel.cs index 8366c70..f614c12 100644 --- a/Correlator/ViewModels/AudioFileViewModel.cs +++ b/Correlator/ViewModels/AudioFileViewModel.cs @@ -10,7 +10,6 @@ using HandyControl.Data; using NAudio.Wave; using Prism.Commands; -using Prism.Events; using Prism.Mvvm; using Prism.Services.Dialogs; @@ -117,7 +116,7 @@ Interval = new TimeSpan(0, 0, 0, 1) }; - public AudioFileViewModel(IDialogService dialogService, IEventAggregator eventAggregator) + public AudioFileViewModel(IDialogService dialogService) { _audioTimer.Tick += delegate { @@ -236,6 +235,8 @@ //刷新数据 _totalFiles = GetTotalAudioFiles(); MaxPage = _totalFiles.Count.GetPageSize(); + //页码重置 + PageIndex = 1; AudioFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } catch (IOException) @@ -281,11 +282,11 @@ { var audioFiles = new List(); var i = 1; - //筛选大于1K的音频文件 + //筛选大于50K的音频文件 var files = new DirectoryInfo(DirectoryManager.GetAudioDir()).GetFiles("*", SearchOption.AllDirectories); foreach (var file in files) { - if (file.Length < 1024) + if (file.Length < 1024 * 50) { RuntimeCache.SmallAudioFiles.Add(file.FullName); } diff --git a/Correlator/ViewModels/PictureFileViewModel.cs b/Correlator/ViewModels/PictureFileViewModel.cs index de4d7bb..74f86fd 100644 --- a/Correlator/ViewModels/PictureFileViewModel.cs +++ b/Correlator/ViewModels/PictureFileViewModel.cs @@ -116,6 +116,8 @@ //刷新数据 _totalFiles = GetTotalPictureFiles(); MaxPage = _totalFiles.Count.GetPageSize(); + //页码重置 + PageIndex = 1; PictureFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } catch (IOException) diff --git a/Correlator/Views/AudioFileView.xaml.cs b/Correlator/Views/AudioFileView.xaml.cs index 3c133d8..69b5eff 100644 --- a/Correlator/Views/AudioFileView.xaml.cs +++ b/Correlator/Views/AudioFileView.xaml.cs @@ -8,7 +8,6 @@ using Correlator.Util; using NAudio.CoreAudioApi; using NAudio.Wave; -using Prism.Events; namespace Correlator.Views { @@ -30,12 +29,12 @@ Interval = new TimeSpan(0, 0, 0, 0, 30) }; - public AudioFileView(IApplicationDataService dataService, IEventAggregator eventAggregator) + public AudioFileView(IApplicationDataService dataService) { InitializeComponent(); _capture = new WasapiLoopbackCapture(); // 捕获电脑发出的声音 - _visualizer = new AudioVisualizer(256); + _visualizer = new AudioVisualizer(512); _allColors = dataService.GetAllHsvColors(); // 获取所有的渐变颜色 (HSV 颜色) @@ -43,7 +42,7 @@ _capture.DataAvailable += delegate(object o, WaveInEventArgs args) { var length = args.BytesRecorded / 4; // 采样的数量 (每一个采样是 4 字节) - var result = new double[length]; // 声明结果 + var result = new double[length]; for (var i = 0; i < length; i++) { @@ -113,7 +112,7 @@ StripsPath, color1, color2, _spectrumData, _spectrumData.Length, StripsPath.ActualWidth, 0, StripsPath.ActualHeight, - 2, -StripsPath.ActualHeight * 50 + 2, -StripsPath.ActualHeight * 200 ); } @@ -130,8 +129,10 @@ /// 绘图的起始 Y 坐标 /// 条形与条形之间的间隔(像素) /// 控制波形图波峰高度 - private void DrawGradientStrips(Path stripsPath, Color bottomColor, Color topColor, double[] spectrumData, - int stripCount, double drawingWidth, double xOffset, double yOffset, double spacing, double scale) + private void DrawGradientStrips( + Path stripsPath, Color bottomColor, Color topColor, double[] spectrumData, + int stripCount, double drawingWidth, double xOffset, double yOffset, double spacing, double scale + ) { //竖条宽度 var stripWidth = (drawingWidth - spacing * stripCount) / stripCount; diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 8e2a134..fc7a865 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,6 +1,5 @@ using System; using System.Threading; -using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -9,24 +8,18 @@ { public class AudioServiceImpl : IAudioService { + private bool _isStopped; private WaveFileWriter _waveFileWriter; - - private readonly WaveOut _waveOut = new WaveOut(); - - private readonly Lazy _lazyWaveProvider = new Lazy( - () => new BufferedWaveProvider(new WaveFormat(7500, 24, 1)) - ); + private BufferedWaveProvider _waveProvider; + private readonly WaveFormat _waveFormat = new WaveFormat(7500, 24, 1); public void Start(string deviceCode) { - //异步执行听音,不然会卡住界面 - Task.Run(delegate { StartListenAudio(deviceCode); }); - } + _isStopped = false; - private void StartListenAudio(string deviceCode) - { - _waveOut.Init(_lazyWaveProvider.Value); - _waveOut.Play(); + _waveProvider = new BufferedWaveProvider(_waveFormat); + var waveOut = new WaveOut(); + waveOut.Init(_waveProvider); string fileName; var audioDir = DirectoryManager.GetAudioDir(); @@ -42,30 +35,30 @@ fileName = $"{audioDir}/听音_蓝_{time}.wav"; } - _waveFileWriter = new WaveFileWriter(fileName, new WaveFormat(7500, 24, 1)); + _waveFileWriter = new WaveFileWriter(fileName, _waveFormat); + + //异步执行听音,不然会卡住界面 + waveOut.Play(); } + //缓存声波数据已经是后台线程了(处于线程池中) public void Write(byte[] pcm) { - _lazyWaveProvider.Value.AddSamples(pcm, 0, pcm.Length); - - //将pcm数据保存为wav格式文件 - if (_waveFileWriter == null) + if (_isStopped) { return; } - _waveFileWriter.Write(pcm, 0, pcm.Length); + _waveProvider?.AddSamples(pcm, 0, pcm.Length); + _waveFileWriter?.Write(pcm, 0, pcm.Length); } public void Stop() { - _waveOut.Stop(); + _isStopped = true; + _waveProvider.ClearBuffer(); _waveFileWriter.Dispose(); - _waveFileWriter = null; - - _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/Util/AudioVisualizer.cs b/Correlator/Util/AudioVisualizer.cs index c4b1f45..9a888f5 100644 --- a/Correlator/Util/AudioVisualizer.cs +++ b/Correlator/Util/AudioVisualizer.cs @@ -2,6 +2,7 @@ using System.Linq; using FftSharp; using FftSharp.Windows; +using Complex = System.Numerics.Complex; namespace Correlator.Util { @@ -69,7 +70,7 @@ data[i] = new Complex(SampleData[i], 0); } - Transform.FFT(data); + FFT.Forward(data); var halfLen = len / 2; var result = new double[halfLen]; // 傅里叶变换结果左右对称, 只需要取一半 diff --git a/Correlator/ViewModels/AudioFileViewModel.cs b/Correlator/ViewModels/AudioFileViewModel.cs index 8366c70..f614c12 100644 --- a/Correlator/ViewModels/AudioFileViewModel.cs +++ b/Correlator/ViewModels/AudioFileViewModel.cs @@ -10,7 +10,6 @@ using HandyControl.Data; using NAudio.Wave; using Prism.Commands; -using Prism.Events; using Prism.Mvvm; using Prism.Services.Dialogs; @@ -117,7 +116,7 @@ Interval = new TimeSpan(0, 0, 0, 1) }; - public AudioFileViewModel(IDialogService dialogService, IEventAggregator eventAggregator) + public AudioFileViewModel(IDialogService dialogService) { _audioTimer.Tick += delegate { @@ -236,6 +235,8 @@ //刷新数据 _totalFiles = GetTotalAudioFiles(); MaxPage = _totalFiles.Count.GetPageSize(); + //页码重置 + PageIndex = 1; AudioFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } catch (IOException) @@ -281,11 +282,11 @@ { var audioFiles = new List(); var i = 1; - //筛选大于1K的音频文件 + //筛选大于50K的音频文件 var files = new DirectoryInfo(DirectoryManager.GetAudioDir()).GetFiles("*", SearchOption.AllDirectories); foreach (var file in files) { - if (file.Length < 1024) + if (file.Length < 1024 * 50) { RuntimeCache.SmallAudioFiles.Add(file.FullName); } diff --git a/Correlator/ViewModels/PictureFileViewModel.cs b/Correlator/ViewModels/PictureFileViewModel.cs index de4d7bb..74f86fd 100644 --- a/Correlator/ViewModels/PictureFileViewModel.cs +++ b/Correlator/ViewModels/PictureFileViewModel.cs @@ -116,6 +116,8 @@ //刷新数据 _totalFiles = GetTotalPictureFiles(); MaxPage = _totalFiles.Count.GetPageSize(); + //页码重置 + PageIndex = 1; PictureFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } catch (IOException) diff --git a/Correlator/Views/AudioFileView.xaml.cs b/Correlator/Views/AudioFileView.xaml.cs index 3c133d8..69b5eff 100644 --- a/Correlator/Views/AudioFileView.xaml.cs +++ b/Correlator/Views/AudioFileView.xaml.cs @@ -8,7 +8,6 @@ using Correlator.Util; using NAudio.CoreAudioApi; using NAudio.Wave; -using Prism.Events; namespace Correlator.Views { @@ -30,12 +29,12 @@ Interval = new TimeSpan(0, 0, 0, 0, 30) }; - public AudioFileView(IApplicationDataService dataService, IEventAggregator eventAggregator) + public AudioFileView(IApplicationDataService dataService) { InitializeComponent(); _capture = new WasapiLoopbackCapture(); // 捕获电脑发出的声音 - _visualizer = new AudioVisualizer(256); + _visualizer = new AudioVisualizer(512); _allColors = dataService.GetAllHsvColors(); // 获取所有的渐变颜色 (HSV 颜色) @@ -43,7 +42,7 @@ _capture.DataAvailable += delegate(object o, WaveInEventArgs args) { var length = args.BytesRecorded / 4; // 采样的数量 (每一个采样是 4 字节) - var result = new double[length]; // 声明结果 + var result = new double[length]; for (var i = 0; i < length; i++) { @@ -113,7 +112,7 @@ StripsPath, color1, color2, _spectrumData, _spectrumData.Length, StripsPath.ActualWidth, 0, StripsPath.ActualHeight, - 2, -StripsPath.ActualHeight * 50 + 2, -StripsPath.ActualHeight * 200 ); } @@ -130,8 +129,10 @@ /// 绘图的起始 Y 坐标 /// 条形与条形之间的间隔(像素) /// 控制波形图波峰高度 - private void DrawGradientStrips(Path stripsPath, Color bottomColor, Color topColor, double[] spectrumData, - int stripCount, double drawingWidth, double xOffset, double yOffset, double spacing, double scale) + private void DrawGradientStrips( + Path stripsPath, Color bottomColor, Color topColor, double[] spectrumData, + int stripCount, double drawingWidth, double xOffset, double yOffset, double spacing, double scale + ) { //竖条宽度 var stripWidth = (drawingWidth - spacing * stripCount) / stripCount; diff --git a/Correlator/Views/PictureFileView.xaml b/Correlator/Views/PictureFileView.xaml index b521016..2112f87 100644 --- a/Correlator/Views/PictureFileView.xaml +++ b/Correlator/Views/PictureFileView.xaml @@ -135,7 +135,6 @@ Margin="30,0" HorizontalAlignment="Center" VerticalAlignment="Center" - DataCountPerPage="5" IsJumpEnabled="True" MaxPageCount="{Binding MaxPage}" PageIndex="{Binding PageIndex}">