diff --git a/Correlator/App.xaml.cs b/Correlator/App.xaml.cs index cf3a095..dc572f5 100644 --- a/Correlator/App.xaml.cs +++ b/Correlator/App.xaml.cs @@ -46,7 +46,7 @@ containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); - //Dialog + //Dialog or Window containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); diff --git a/Correlator/App.xaml.cs b/Correlator/App.xaml.cs index cf3a095..dc572f5 100644 --- a/Correlator/App.xaml.cs +++ b/Correlator/App.xaml.cs @@ -46,7 +46,7 @@ containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); - //Dialog + //Dialog or Window containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index 269f7de..e2fd826 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -227,6 +227,7 @@ + @@ -260,7 +261,6 @@ - diff --git a/Correlator/App.xaml.cs b/Correlator/App.xaml.cs index cf3a095..dc572f5 100644 --- a/Correlator/App.xaml.cs +++ b/Correlator/App.xaml.cs @@ -46,7 +46,7 @@ containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); - //Dialog + //Dialog or Window containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index 269f7de..e2fd826 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -227,6 +227,7 @@ + @@ -260,7 +261,6 @@ - diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index 5fc50a1..fd421fd 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -270,9 +270,8 @@ bytesData[i * 3 + 0] = 0x00; } - FlowStatus.ElapseTime = 0; //写入缓存区 - PlayWav.Instance.Listen(bytesData); + PlayWav.Get.Listen(bytesData); //保存听音数据 using (var manager = new DataBaseManager()) diff --git a/Correlator/App.xaml.cs b/Correlator/App.xaml.cs index cf3a095..dc572f5 100644 --- a/Correlator/App.xaml.cs +++ b/Correlator/App.xaml.cs @@ -46,7 +46,7 @@ containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); - //Dialog + //Dialog or Window containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index 269f7de..e2fd826 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -227,6 +227,7 @@ + @@ -260,7 +261,6 @@ - diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index 5fc50a1..fd421fd 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -270,9 +270,8 @@ bytesData[i * 3 + 0] = 0x00; } - FlowStatus.ElapseTime = 0; //写入缓存区 - PlayWav.Instance.Listen(bytesData); + PlayWav.Get.Listen(bytesData); //保存听音数据 using (var manager = new DataBaseManager()) diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index ff49e25..dcfcc35 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -592,7 +592,7 @@ sp.Write(afCrc, 0, afCrc.Length); - PlayWav.Instance.Stop(); + PlayWav.Get.Stop(); } catch (Exception e) { diff --git a/Correlator/App.xaml.cs b/Correlator/App.xaml.cs index cf3a095..dc572f5 100644 --- a/Correlator/App.xaml.cs +++ b/Correlator/App.xaml.cs @@ -46,7 +46,7 @@ containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); - //Dialog + //Dialog or Window containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index 269f7de..e2fd826 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -227,6 +227,7 @@ + @@ -260,7 +261,6 @@ - diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index 5fc50a1..fd421fd 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -270,9 +270,8 @@ bytesData[i * 3 + 0] = 0x00; } - FlowStatus.ElapseTime = 0; //写入缓存区 - PlayWav.Instance.Listen(bytesData); + PlayWav.Get.Listen(bytesData); //保存听音数据 using (var manager = new DataBaseManager()) diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index ff49e25..dcfcc35 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -592,7 +592,7 @@ sp.Write(afCrc, 0, afCrc.Length); - PlayWav.Instance.Stop(); + PlayWav.Get.Stop(); } catch (Exception e) { diff --git a/Correlator/Util/PlayWav.cs b/Correlator/Util/PlayWav.cs index 54de70a..a54ba0d 100644 --- a/Correlator/Util/PlayWav.cs +++ b/Correlator/Util/PlayWav.cs @@ -17,7 +17,7 @@ private static readonly Lazy Lazy = new Lazy(() => new PlayWav()); - public static PlayWav Instance => Lazy.Value; + public static PlayWav Get => Lazy.Value; private PlayWav() { @@ -25,8 +25,6 @@ #endregion - private int _index; - public void InitWaveOut() { if (_isPlaying) @@ -37,7 +35,9 @@ try { //必须填入文件名,否则ws无法实例化 - var ws = new WaveOutStream("AutoGenerateCache." + _index++ + ".txt"); + var ws = new WaveOutStream( + $"{DirectoryManager.GetAudioDir()}/Audio_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.wav" + ); _waveOutStream = ws; _waveOutStream.Position = 0; _wavFormat = ws.Format; @@ -59,10 +59,10 @@ _wavPlayer = null; //TODO 待优化。每次点击结束听音,但是While循环并没有立即结束,所以循环会直接报错 - // if (_waveOutStream == null) return; - // - // _waveOutStream.Close(); - // _waveOutStream = null; + if (_waveOutStream == null) return; + + _waveOutStream.Close(); + _waveOutStream = null; } public void Listen(byte[] bytesData) diff --git a/Correlator/App.xaml.cs b/Correlator/App.xaml.cs index cf3a095..dc572f5 100644 --- a/Correlator/App.xaml.cs +++ b/Correlator/App.xaml.cs @@ -46,7 +46,7 @@ containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); - //Dialog + //Dialog or Window containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index 269f7de..e2fd826 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -227,6 +227,7 @@ + @@ -260,7 +261,6 @@ - diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index 5fc50a1..fd421fd 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -270,9 +270,8 @@ bytesData[i * 3 + 0] = 0x00; } - FlowStatus.ElapseTime = 0; //写入缓存区 - PlayWav.Instance.Listen(bytesData); + PlayWav.Get.Listen(bytesData); //保存听音数据 using (var manager = new DataBaseManager()) diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index ff49e25..dcfcc35 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -592,7 +592,7 @@ sp.Write(afCrc, 0, afCrc.Length); - PlayWav.Instance.Stop(); + PlayWav.Get.Stop(); } catch (Exception e) { diff --git a/Correlator/Util/PlayWav.cs b/Correlator/Util/PlayWav.cs index 54de70a..a54ba0d 100644 --- a/Correlator/Util/PlayWav.cs +++ b/Correlator/Util/PlayWav.cs @@ -17,7 +17,7 @@ private static readonly Lazy Lazy = new Lazy(() => new PlayWav()); - public static PlayWav Instance => Lazy.Value; + public static PlayWav Get => Lazy.Value; private PlayWav() { @@ -25,8 +25,6 @@ #endregion - private int _index; - public void InitWaveOut() { if (_isPlaying) @@ -37,7 +35,9 @@ try { //必须填入文件名,否则ws无法实例化 - var ws = new WaveOutStream("AutoGenerateCache." + _index++ + ".txt"); + var ws = new WaveOutStream( + $"{DirectoryManager.GetAudioDir()}/Audio_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.wav" + ); _waveOutStream = ws; _waveOutStream.Position = 0; _wavFormat = ws.Format; @@ -59,10 +59,10 @@ _wavPlayer = null; //TODO 待优化。每次点击结束听音,但是While循环并没有立即结束,所以循环会直接报错 - // if (_waveOutStream == null) return; - // - // _waveOutStream.Close(); - // _waveOutStream = null; + if (_waveOutStream == null) return; + + _waveOutStream.Close(); + _waveOutStream = null; } public void Listen(byte[] bytesData) diff --git a/Correlator/Util/WavFile.cs b/Correlator/Util/WavFile.cs deleted file mode 100644 index 0d98513..0000000 --- a/Correlator/Util/WavFile.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System; -using System.IO; -using System.Text; - -namespace Correlator.Util -{ - public class WavFile - { - private const int HeaderSize = 44; - - //创建空头文件 - public FileStream CreateEmpty(string filepath) - { - var fileStream = new FileStream(filepath, FileMode.OpenOrCreate); - const byte emptyByte = new byte(); - - for (var i = 0; i < HeaderSize; i++) - { - fileStream.WriteByte(emptyByte); - } - - return fileStream; - } - - //追加字节流 - public void WriteFilestream(FileStream fileStream, double[] dataArray, double[] dataArray1) - { - try - { - var bytesData = new byte[dataArray.Length * 16]; - - for (var i = 0; i < dataArray.Length; i++) - { - var byteArray16 = new byte[16]; - BitConverter.GetBytes(dataArray[i]).CopyTo(byteArray16, 0); - BitConverter.GetBytes(dataArray1[i]).CopyTo(byteArray16, 8); - byteArray16.CopyTo(bytesData, i * 16); - } - - fileStream.Write(bytesData, 0, bytesData.Length); - fileStream.Flush(); - } - catch (Exception e) - { - LogHelper.Info(e.ToString()); - } - } - - //重写头文件 - public void WriteHeader(FileStream fileStream, int hz, int channels) - { - //hz = 7500;//采样频率 - //channels = 1;//单声道为1,双声道为2 - //samples = 3750;//实际样本数 - - try - { - fileStream.Seek(0, SeekOrigin.Begin); - - //资源交换文件标志(RIFF) - var riff = Encoding.UTF8.GetBytes("RIFF"); //### - fileStream.Write(riff, 0, 4); - - //从下个地址开始到文件尾的总字节数 - var chunkSize = BitConverter.GetBytes(fileStream.Length - 8); //### - fileStream.Write(chunkSize, 0, 4); - - //WAV文件标志 - var wave = Encoding.UTF8.GetBytes("WAVE"); //### - fileStream.Write(wave, 0, 4); - - //波形格式标志 - var fmt = Encoding.UTF8.GetBytes("fmt "); //### - fileStream.Write(fmt, 0, 4); - - //过滤字节一般为00000010H,若为00000012H则说明数据头携带附加信息 - var subChunk1 = BitConverter.GetBytes(16); //### - fileStream.Write(subChunk1, 0, 4); - - //格式种类值为1时表示数据为线性PCM编码 - var audioFormat = BitConverter.GetBytes((short)1); //### - fileStream.Write(audioFormat, 0, 2); - - //通道数,单声道为1,双声道为2 - var numChannels = BitConverter.GetBytes((short)channels); //### - fileStream.Write(numChannels, 0, 2); - - //采样频率 # - var sampleRate = BitConverter.GetBytes(hz); - fileStream.Write(sampleRate, 0, 4); - - //波形数据传输速率 - var byRate = BitConverter.GetBytes(hz * channels * 2 * 8 / 8); - fileStream.Write(byRate, 0, 4); - - //data数据块长度,字节 - var blockAlign = (ushort)(channels * 8 * 2 / 8); - fileStream.Write(BitConverter.GetBytes(blockAlign), 0, 2); - - //PCM位宽 - const ushort bps = 16; - var bitsPerSample = BitConverter.GetBytes(bps); - fileStream.Write(bitsPerSample, 0, 2); - - //数据标志符data - var dataString = Encoding.UTF8.GetBytes("data"); - fileStream.Write(dataString, 0, 4); - - var samples = ((int)fileStream.Length - 44) / 16; - //Data总数据长度,字节 - var subChunk2 = BitConverter.GetBytes(samples * channels * 2); - fileStream.Write(subChunk2, 0, 4); - - fileStream.Close(); - } - catch (Exception ex) - { - LogHelper.Info(ex.ToString()); - } - } - } -} \ No newline at end of file diff --git a/Correlator/App.xaml.cs b/Correlator/App.xaml.cs index cf3a095..dc572f5 100644 --- a/Correlator/App.xaml.cs +++ b/Correlator/App.xaml.cs @@ -46,7 +46,7 @@ containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); - //Dialog + //Dialog or Window containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index 269f7de..e2fd826 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -227,6 +227,7 @@ + @@ -260,7 +261,6 @@ - diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index 5fc50a1..fd421fd 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -270,9 +270,8 @@ bytesData[i * 3 + 0] = 0x00; } - FlowStatus.ElapseTime = 0; //写入缓存区 - PlayWav.Instance.Listen(bytesData); + PlayWav.Get.Listen(bytesData); //保存听音数据 using (var manager = new DataBaseManager()) diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index ff49e25..dcfcc35 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -592,7 +592,7 @@ sp.Write(afCrc, 0, afCrc.Length); - PlayWav.Instance.Stop(); + PlayWav.Get.Stop(); } catch (Exception e) { diff --git a/Correlator/Util/PlayWav.cs b/Correlator/Util/PlayWav.cs index 54de70a..a54ba0d 100644 --- a/Correlator/Util/PlayWav.cs +++ b/Correlator/Util/PlayWav.cs @@ -17,7 +17,7 @@ private static readonly Lazy Lazy = new Lazy(() => new PlayWav()); - public static PlayWav Instance => Lazy.Value; + public static PlayWav Get => Lazy.Value; private PlayWav() { @@ -25,8 +25,6 @@ #endregion - private int _index; - public void InitWaveOut() { if (_isPlaying) @@ -37,7 +35,9 @@ try { //必须填入文件名,否则ws无法实例化 - var ws = new WaveOutStream("AutoGenerateCache." + _index++ + ".txt"); + var ws = new WaveOutStream( + $"{DirectoryManager.GetAudioDir()}/Audio_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.wav" + ); _waveOutStream = ws; _waveOutStream.Position = 0; _wavFormat = ws.Format; @@ -59,10 +59,10 @@ _wavPlayer = null; //TODO 待优化。每次点击结束听音,但是While循环并没有立即结束,所以循环会直接报错 - // if (_waveOutStream == null) return; - // - // _waveOutStream.Close(); - // _waveOutStream = null; + if (_waveOutStream == null) return; + + _waveOutStream.Close(); + _waveOutStream = null; } public void Listen(byte[] bytesData) diff --git a/Correlator/Util/WavFile.cs b/Correlator/Util/WavFile.cs deleted file mode 100644 index 0d98513..0000000 --- a/Correlator/Util/WavFile.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System; -using System.IO; -using System.Text; - -namespace Correlator.Util -{ - public class WavFile - { - private const int HeaderSize = 44; - - //创建空头文件 - public FileStream CreateEmpty(string filepath) - { - var fileStream = new FileStream(filepath, FileMode.OpenOrCreate); - const byte emptyByte = new byte(); - - for (var i = 0; i < HeaderSize; i++) - { - fileStream.WriteByte(emptyByte); - } - - return fileStream; - } - - //追加字节流 - public void WriteFilestream(FileStream fileStream, double[] dataArray, double[] dataArray1) - { - try - { - var bytesData = new byte[dataArray.Length * 16]; - - for (var i = 0; i < dataArray.Length; i++) - { - var byteArray16 = new byte[16]; - BitConverter.GetBytes(dataArray[i]).CopyTo(byteArray16, 0); - BitConverter.GetBytes(dataArray1[i]).CopyTo(byteArray16, 8); - byteArray16.CopyTo(bytesData, i * 16); - } - - fileStream.Write(bytesData, 0, bytesData.Length); - fileStream.Flush(); - } - catch (Exception e) - { - LogHelper.Info(e.ToString()); - } - } - - //重写头文件 - public void WriteHeader(FileStream fileStream, int hz, int channels) - { - //hz = 7500;//采样频率 - //channels = 1;//单声道为1,双声道为2 - //samples = 3750;//实际样本数 - - try - { - fileStream.Seek(0, SeekOrigin.Begin); - - //资源交换文件标志(RIFF) - var riff = Encoding.UTF8.GetBytes("RIFF"); //### - fileStream.Write(riff, 0, 4); - - //从下个地址开始到文件尾的总字节数 - var chunkSize = BitConverter.GetBytes(fileStream.Length - 8); //### - fileStream.Write(chunkSize, 0, 4); - - //WAV文件标志 - var wave = Encoding.UTF8.GetBytes("WAVE"); //### - fileStream.Write(wave, 0, 4); - - //波形格式标志 - var fmt = Encoding.UTF8.GetBytes("fmt "); //### - fileStream.Write(fmt, 0, 4); - - //过滤字节一般为00000010H,若为00000012H则说明数据头携带附加信息 - var subChunk1 = BitConverter.GetBytes(16); //### - fileStream.Write(subChunk1, 0, 4); - - //格式种类值为1时表示数据为线性PCM编码 - var audioFormat = BitConverter.GetBytes((short)1); //### - fileStream.Write(audioFormat, 0, 2); - - //通道数,单声道为1,双声道为2 - var numChannels = BitConverter.GetBytes((short)channels); //### - fileStream.Write(numChannels, 0, 2); - - //采样频率 # - var sampleRate = BitConverter.GetBytes(hz); - fileStream.Write(sampleRate, 0, 4); - - //波形数据传输速率 - var byRate = BitConverter.GetBytes(hz * channels * 2 * 8 / 8); - fileStream.Write(byRate, 0, 4); - - //data数据块长度,字节 - var blockAlign = (ushort)(channels * 8 * 2 / 8); - fileStream.Write(BitConverter.GetBytes(blockAlign), 0, 2); - - //PCM位宽 - const ushort bps = 16; - var bitsPerSample = BitConverter.GetBytes(bps); - fileStream.Write(bitsPerSample, 0, 2); - - //数据标志符data - var dataString = Encoding.UTF8.GetBytes("data"); - fileStream.Write(dataString, 0, 4); - - var samples = ((int)fileStream.Length - 44) / 16; - //Data总数据长度,字节 - var subChunk2 = BitConverter.GetBytes(samples * channels * 2); - fileStream.Write(subChunk2, 0, 4); - - fileStream.Close(); - } - catch (Exception ex) - { - LogHelper.Info(ex.ToString()); - } - } - } -} \ No newline at end of file diff --git a/Correlator/ViewModels/AuditionViewModel.cs b/Correlator/ViewModels/AuditionViewModel.cs index 0e6ee52..2dd1791 100644 --- a/Correlator/ViewModels/AuditionViewModel.cs +++ b/Correlator/ViewModels/AuditionViewModel.cs @@ -1,18 +1,12 @@ using System; -using System.Diagnostics; using System.Runtime.InteropServices; using Correlator.DataService; -using Correlator.Events; -using Correlator.Model; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.CoreAudioApi; -using NAudio.Wave; using Prism.Commands; -using Prism.Events; using Prism.Mvvm; using Prism.Services.Dialogs; -using WaveFormat = NAudio.Wave.WaveFormat; namespace Correlator.ViewModels { @@ -46,15 +40,11 @@ #endregion - private static readonly Lazy LazyWaveIn = - new Lazy(() => new WaveIn { WaveFormat = new WaveFormat(7500, 1) }); - private bool _isStartRecording; private bool _isRedSensor; - private WaveFileWriter _waveFileWriter; private readonly ISerialPortService _serialPortService; - public AuditionViewModel(IEventAggregator eventAggregator, ISerialPortService serialPortService) + public AuditionViewModel(ISerialPortService serialPortService) { _serialPortService = serialPortService; @@ -79,64 +69,23 @@ RecordAudio(); }); BlueSensorMuteCommand = new DelegateCommand(SetCurrentMicVolume); - - //音频监听 - LazyWaveIn.Value.DataAvailable += delegate(object sender, WaveInEventArgs args) - { - _isStartRecording = true; - - var buffer = args.Buffer; - var bytesRecorded = args.BytesRecorded; - //写入wav文件 - _waveFileWriter.Write(buffer, 0, bytesRecorded); - - var sts = new float[buffer.Length / 2]; - var outIndex = 0; - for (var i = 0; i < buffer.Length; i += 2) - { - sts[outIndex++] = BitConverter.ToInt16(buffer, i) / 32768f; - } - - var audioWaveModel = new AudioWaveModel - { - IsRedSensor = _isRedSensor, - WavePoints = sts - }; - - eventAggregator.GetEvent().Publish(audioWaveModel); - }; - - LazyWaveIn.Value.RecordingStopped += delegate - { - if (_waveFileWriter != null) - { - _waveFileWriter.Close(); - _waveFileWriter = null; - } - - _isStartRecording = false; - }; } /// - /// 录音 - /// 波形图暂时采用NAudio录音形成波形图 + /// 听音指令 /// private void RecordAudio() { if (_isStartRecording) { - LazyWaveIn.Value.StopRecording(); + _isStartRecording = false; CommandSender.SendSoundStopCmd(_serialPortService.Sp, _isRedSensor ? DevCode.Dev1 : DevCode.Dev2); } else { - _waveFileWriter = new WaveFileWriter( - $"{DirectoryManager.GetAudioDir()}/Audio_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.wav", - LazyWaveIn.Value.WaveFormat - ); - - LazyWaveIn.Value.StartRecording(); + //初始化wav文件 + PlayWav.Get.InitWaveOut(); + _isStartRecording = true; CommandSender.SendSoundCollectCmd(_serialPortService.Sp, _isRedSensor ? DevCode.Dev1 : DevCode.Dev2); } } @@ -178,7 +127,6 @@ //获取音频输入设备 var device = enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia); - Debug.WriteLine($"AuditionViewModel => {device.FriendlyName}"); return (int)(device.AudioEndpointVolume.MasterVolumeLevelScalar * 100); } diff --git a/Correlator/App.xaml.cs b/Correlator/App.xaml.cs index cf3a095..dc572f5 100644 --- a/Correlator/App.xaml.cs +++ b/Correlator/App.xaml.cs @@ -46,7 +46,7 @@ containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); - //Dialog + //Dialog or Window containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); containerRegistry.RegisterDialog(); diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index 269f7de..e2fd826 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -227,6 +227,7 @@ + @@ -260,7 +261,6 @@ - diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index 5fc50a1..fd421fd 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -270,9 +270,8 @@ bytesData[i * 3 + 0] = 0x00; } - FlowStatus.ElapseTime = 0; //写入缓存区 - PlayWav.Instance.Listen(bytesData); + PlayWav.Get.Listen(bytesData); //保存听音数据 using (var manager = new DataBaseManager()) diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index ff49e25..dcfcc35 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -592,7 +592,7 @@ sp.Write(afCrc, 0, afCrc.Length); - PlayWav.Instance.Stop(); + PlayWav.Get.Stop(); } catch (Exception e) { diff --git a/Correlator/Util/PlayWav.cs b/Correlator/Util/PlayWav.cs index 54de70a..a54ba0d 100644 --- a/Correlator/Util/PlayWav.cs +++ b/Correlator/Util/PlayWav.cs @@ -17,7 +17,7 @@ private static readonly Lazy Lazy = new Lazy(() => new PlayWav()); - public static PlayWav Instance => Lazy.Value; + public static PlayWav Get => Lazy.Value; private PlayWav() { @@ -25,8 +25,6 @@ #endregion - private int _index; - public void InitWaveOut() { if (_isPlaying) @@ -37,7 +35,9 @@ try { //必须填入文件名,否则ws无法实例化 - var ws = new WaveOutStream("AutoGenerateCache." + _index++ + ".txt"); + var ws = new WaveOutStream( + $"{DirectoryManager.GetAudioDir()}/Audio_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.wav" + ); _waveOutStream = ws; _waveOutStream.Position = 0; _wavFormat = ws.Format; @@ -59,10 +59,10 @@ _wavPlayer = null; //TODO 待优化。每次点击结束听音,但是While循环并没有立即结束,所以循环会直接报错 - // if (_waveOutStream == null) return; - // - // _waveOutStream.Close(); - // _waveOutStream = null; + if (_waveOutStream == null) return; + + _waveOutStream.Close(); + _waveOutStream = null; } public void Listen(byte[] bytesData) diff --git a/Correlator/Util/WavFile.cs b/Correlator/Util/WavFile.cs deleted file mode 100644 index 0d98513..0000000 --- a/Correlator/Util/WavFile.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System; -using System.IO; -using System.Text; - -namespace Correlator.Util -{ - public class WavFile - { - private const int HeaderSize = 44; - - //创建空头文件 - public FileStream CreateEmpty(string filepath) - { - var fileStream = new FileStream(filepath, FileMode.OpenOrCreate); - const byte emptyByte = new byte(); - - for (var i = 0; i < HeaderSize; i++) - { - fileStream.WriteByte(emptyByte); - } - - return fileStream; - } - - //追加字节流 - public void WriteFilestream(FileStream fileStream, double[] dataArray, double[] dataArray1) - { - try - { - var bytesData = new byte[dataArray.Length * 16]; - - for (var i = 0; i < dataArray.Length; i++) - { - var byteArray16 = new byte[16]; - BitConverter.GetBytes(dataArray[i]).CopyTo(byteArray16, 0); - BitConverter.GetBytes(dataArray1[i]).CopyTo(byteArray16, 8); - byteArray16.CopyTo(bytesData, i * 16); - } - - fileStream.Write(bytesData, 0, bytesData.Length); - fileStream.Flush(); - } - catch (Exception e) - { - LogHelper.Info(e.ToString()); - } - } - - //重写头文件 - public void WriteHeader(FileStream fileStream, int hz, int channels) - { - //hz = 7500;//采样频率 - //channels = 1;//单声道为1,双声道为2 - //samples = 3750;//实际样本数 - - try - { - fileStream.Seek(0, SeekOrigin.Begin); - - //资源交换文件标志(RIFF) - var riff = Encoding.UTF8.GetBytes("RIFF"); //### - fileStream.Write(riff, 0, 4); - - //从下个地址开始到文件尾的总字节数 - var chunkSize = BitConverter.GetBytes(fileStream.Length - 8); //### - fileStream.Write(chunkSize, 0, 4); - - //WAV文件标志 - var wave = Encoding.UTF8.GetBytes("WAVE"); //### - fileStream.Write(wave, 0, 4); - - //波形格式标志 - var fmt = Encoding.UTF8.GetBytes("fmt "); //### - fileStream.Write(fmt, 0, 4); - - //过滤字节一般为00000010H,若为00000012H则说明数据头携带附加信息 - var subChunk1 = BitConverter.GetBytes(16); //### - fileStream.Write(subChunk1, 0, 4); - - //格式种类值为1时表示数据为线性PCM编码 - var audioFormat = BitConverter.GetBytes((short)1); //### - fileStream.Write(audioFormat, 0, 2); - - //通道数,单声道为1,双声道为2 - var numChannels = BitConverter.GetBytes((short)channels); //### - fileStream.Write(numChannels, 0, 2); - - //采样频率 # - var sampleRate = BitConverter.GetBytes(hz); - fileStream.Write(sampleRate, 0, 4); - - //波形数据传输速率 - var byRate = BitConverter.GetBytes(hz * channels * 2 * 8 / 8); - fileStream.Write(byRate, 0, 4); - - //data数据块长度,字节 - var blockAlign = (ushort)(channels * 8 * 2 / 8); - fileStream.Write(BitConverter.GetBytes(blockAlign), 0, 2); - - //PCM位宽 - const ushort bps = 16; - var bitsPerSample = BitConverter.GetBytes(bps); - fileStream.Write(bitsPerSample, 0, 2); - - //数据标志符data - var dataString = Encoding.UTF8.GetBytes("data"); - fileStream.Write(dataString, 0, 4); - - var samples = ((int)fileStream.Length - 44) / 16; - //Data总数据长度,字节 - var subChunk2 = BitConverter.GetBytes(samples * channels * 2); - fileStream.Write(subChunk2, 0, 4); - - fileStream.Close(); - } - catch (Exception ex) - { - LogHelper.Info(ex.ToString()); - } - } - } -} \ No newline at end of file diff --git a/Correlator/ViewModels/AuditionViewModel.cs b/Correlator/ViewModels/AuditionViewModel.cs index 0e6ee52..2dd1791 100644 --- a/Correlator/ViewModels/AuditionViewModel.cs +++ b/Correlator/ViewModels/AuditionViewModel.cs @@ -1,18 +1,12 @@ using System; -using System.Diagnostics; using System.Runtime.InteropServices; using Correlator.DataService; -using Correlator.Events; -using Correlator.Model; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.CoreAudioApi; -using NAudio.Wave; using Prism.Commands; -using Prism.Events; using Prism.Mvvm; using Prism.Services.Dialogs; -using WaveFormat = NAudio.Wave.WaveFormat; namespace Correlator.ViewModels { @@ -46,15 +40,11 @@ #endregion - private static readonly Lazy LazyWaveIn = - new Lazy(() => new WaveIn { WaveFormat = new WaveFormat(7500, 1) }); - private bool _isStartRecording; private bool _isRedSensor; - private WaveFileWriter _waveFileWriter; private readonly ISerialPortService _serialPortService; - public AuditionViewModel(IEventAggregator eventAggregator, ISerialPortService serialPortService) + public AuditionViewModel(ISerialPortService serialPortService) { _serialPortService = serialPortService; @@ -79,64 +69,23 @@ RecordAudio(); }); BlueSensorMuteCommand = new DelegateCommand(SetCurrentMicVolume); - - //音频监听 - LazyWaveIn.Value.DataAvailable += delegate(object sender, WaveInEventArgs args) - { - _isStartRecording = true; - - var buffer = args.Buffer; - var bytesRecorded = args.BytesRecorded; - //写入wav文件 - _waveFileWriter.Write(buffer, 0, bytesRecorded); - - var sts = new float[buffer.Length / 2]; - var outIndex = 0; - for (var i = 0; i < buffer.Length; i += 2) - { - sts[outIndex++] = BitConverter.ToInt16(buffer, i) / 32768f; - } - - var audioWaveModel = new AudioWaveModel - { - IsRedSensor = _isRedSensor, - WavePoints = sts - }; - - eventAggregator.GetEvent().Publish(audioWaveModel); - }; - - LazyWaveIn.Value.RecordingStopped += delegate - { - if (_waveFileWriter != null) - { - _waveFileWriter.Close(); - _waveFileWriter = null; - } - - _isStartRecording = false; - }; } /// - /// 录音 - /// 波形图暂时采用NAudio录音形成波形图 + /// 听音指令 /// private void RecordAudio() { if (_isStartRecording) { - LazyWaveIn.Value.StopRecording(); + _isStartRecording = false; CommandSender.SendSoundStopCmd(_serialPortService.Sp, _isRedSensor ? DevCode.Dev1 : DevCode.Dev2); } else { - _waveFileWriter = new WaveFileWriter( - $"{DirectoryManager.GetAudioDir()}/Audio_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.wav", - LazyWaveIn.Value.WaveFormat - ); - - LazyWaveIn.Value.StartRecording(); + //初始化wav文件 + PlayWav.Get.InitWaveOut(); + _isStartRecording = true; CommandSender.SendSoundCollectCmd(_serialPortService.Sp, _isRedSensor ? DevCode.Dev1 : DevCode.Dev2); } } @@ -178,7 +127,6 @@ //获取音频输入设备 var device = enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia); - Debug.WriteLine($"AuditionViewModel => {device.FriendlyName}"); return (int)(device.AudioEndpointVolume.MasterVolumeLevelScalar * 100); } diff --git a/Correlator/ViewModels/MainWindowViewModel.cs b/Correlator/ViewModels/MainWindowViewModel.cs index abdd5a9..b8fa4da 100644 --- a/Correlator/ViewModels/MainWindowViewModel.cs +++ b/Correlator/ViewModels/MainWindowViewModel.cs @@ -335,7 +335,6 @@ } private string _materialName = string.Empty; - // private string _pipeName = "铸铁"; public string MaterialName { @@ -348,7 +347,6 @@ } private string _pipeDiameter = string.Empty; - // private string _pipeDiameter = "300"; public string PipeDiameter { @@ -361,7 +359,6 @@ } private string _pipeLength = string.Empty; - // private string _pipeLength = "150"; public string PipeLength { @@ -386,7 +383,6 @@ } private string _lowFrequency = string.Empty; - // private string _lowFrequency = "100"; public string LowFrequency { @@ -924,10 +920,6 @@ PipeLength = string.Empty; LowFrequency = string.Empty; - // PipeDiameter = "300"; - // PipeLength = "150"; - // LowFrequency = "100"; - HighFrequency = string.Empty; SoundSpeed = "0";