diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index beec8a9..ff49e25 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -593,7 +593,6 @@ sp.Write(afCrc, 0, afCrc.Length); PlayWav.Instance.Stop(); - FlowStatus.IsListening = false; } catch (Exception e) { diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index beec8a9..ff49e25 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -593,7 +593,6 @@ sp.Write(afCrc, 0, afCrc.Length); PlayWav.Instance.Stop(); - FlowStatus.IsListening = false; } catch (Exception e) { diff --git a/Correlator/Util/FlowStatus.cs b/Correlator/Util/FlowStatus.cs index cd5bc99..2f989ef 100644 --- a/Correlator/Util/FlowStatus.cs +++ b/Correlator/Util/FlowStatus.cs @@ -9,12 +9,6 @@ /// public class FlowStatus { - //听音过程中没有接收到数据的时间间隔 - public static int ElapseTime = 0; - - //听音状态 - public static bool IsListening = false; - //是否可以收集数据 public static bool CanCollectData = false; @@ -26,7 +20,7 @@ //采集到的数据 public static CorrelatorDataModel CorrelatorData; - + //水听器模式 public static bool IsHydrophone = false; diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index beec8a9..ff49e25 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -593,7 +593,6 @@ sp.Write(afCrc, 0, afCrc.Length); PlayWav.Instance.Stop(); - FlowStatus.IsListening = false; } catch (Exception e) { diff --git a/Correlator/Util/FlowStatus.cs b/Correlator/Util/FlowStatus.cs index cd5bc99..2f989ef 100644 --- a/Correlator/Util/FlowStatus.cs +++ b/Correlator/Util/FlowStatus.cs @@ -9,12 +9,6 @@ /// public class FlowStatus { - //听音过程中没有接收到数据的时间间隔 - public static int ElapseTime = 0; - - //听音状态 - public static bool IsListening = false; - //是否可以收集数据 public static bool CanCollectData = false; @@ -26,7 +20,7 @@ //采集到的数据 public static CorrelatorDataModel CorrelatorData; - + //水听器模式 public static bool IsHydrophone = false; diff --git a/Correlator/Util/MethodExtensions.cs b/Correlator/Util/MethodExtensions.cs index 6bb154b..a6d9ac4 100644 --- a/Correlator/Util/MethodExtensions.cs +++ b/Correlator/Util/MethodExtensions.cs @@ -18,6 +18,121 @@ { public static class MethodExtensions { + private const int HeaderSize = 44; + + private static FileStream CreateEmptyWaveHeader(this 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 static void SaveWavFile(this string filePath, double[] dataArray, double[] dataArray1) + { + try + { + var fileStream = filePath.CreateEmptyWaveHeader(); + + 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(); + + //重写头文件 + fileStream.WriteHeader(7500, 2); + } + catch (Exception e) + { + LogHelper.Info(e.ToString()); + } + } + + private static void WriteHeader(this 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()); + } + } + /// /// 计算文件占用空间大小 /// diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index beec8a9..ff49e25 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -593,7 +593,6 @@ sp.Write(afCrc, 0, afCrc.Length); PlayWav.Instance.Stop(); - FlowStatus.IsListening = false; } catch (Exception e) { diff --git a/Correlator/Util/FlowStatus.cs b/Correlator/Util/FlowStatus.cs index cd5bc99..2f989ef 100644 --- a/Correlator/Util/FlowStatus.cs +++ b/Correlator/Util/FlowStatus.cs @@ -9,12 +9,6 @@ /// public class FlowStatus { - //听音过程中没有接收到数据的时间间隔 - public static int ElapseTime = 0; - - //听音状态 - public static bool IsListening = false; - //是否可以收集数据 public static bool CanCollectData = false; @@ -26,7 +20,7 @@ //采集到的数据 public static CorrelatorDataModel CorrelatorData; - + //水听器模式 public static bool IsHydrophone = false; diff --git a/Correlator/Util/MethodExtensions.cs b/Correlator/Util/MethodExtensions.cs index 6bb154b..a6d9ac4 100644 --- a/Correlator/Util/MethodExtensions.cs +++ b/Correlator/Util/MethodExtensions.cs @@ -18,6 +18,121 @@ { public static class MethodExtensions { + private const int HeaderSize = 44; + + private static FileStream CreateEmptyWaveHeader(this 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 static void SaveWavFile(this string filePath, double[] dataArray, double[] dataArray1) + { + try + { + var fileStream = filePath.CreateEmptyWaveHeader(); + + 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(); + + //重写头文件 + fileStream.WriteHeader(7500, 2); + } + catch (Exception e) + { + LogHelper.Info(e.ToString()); + } + } + + private static void WriteHeader(this 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()); + } + } + /// /// 计算文件占用空间大小 /// diff --git a/Correlator/ViewModels/MainWindowViewModel.cs b/Correlator/ViewModels/MainWindowViewModel.cs index b1a7d5c..abdd5a9 100644 --- a/Correlator/ViewModels/MainWindowViewModel.cs +++ b/Correlator/ViewModels/MainWindowViewModel.cs @@ -848,16 +848,13 @@ { if (FlowStatus.CorrelatorData != null) { - var wavFile = new WavFile(); var filePath = $"{DirectoryManager.GetAudioDir()}\\音频_{DateTime.Now.ToString("yyyyMMddHHmmss")}.wav"; + filePath.SaveWavFile( + FlowStatus.CorrelatorData.LeftDeviceDataArray, + FlowStatus.CorrelatorData.RightDeviceDataArray + ); - var stream = wavFile.CreateEmpty(filePath); - wavFile.WriteFilestream(stream, FlowStatus.CorrelatorData.LeftDeviceDataArray, - FlowStatus.CorrelatorData.RightDeviceDataArray); - - //重写头文件 - wavFile.WriteHeader(stream, 7500, 2); Growl.Success("音频已保存"); //清空上次的缓存 FlowStatus.CorrelatorData = null; diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index beec8a9..ff49e25 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -593,7 +593,6 @@ sp.Write(afCrc, 0, afCrc.Length); PlayWav.Instance.Stop(); - FlowStatus.IsListening = false; } catch (Exception e) { diff --git a/Correlator/Util/FlowStatus.cs b/Correlator/Util/FlowStatus.cs index cd5bc99..2f989ef 100644 --- a/Correlator/Util/FlowStatus.cs +++ b/Correlator/Util/FlowStatus.cs @@ -9,12 +9,6 @@ /// public class FlowStatus { - //听音过程中没有接收到数据的时间间隔 - public static int ElapseTime = 0; - - //听音状态 - public static bool IsListening = false; - //是否可以收集数据 public static bool CanCollectData = false; @@ -26,7 +20,7 @@ //采集到的数据 public static CorrelatorDataModel CorrelatorData; - + //水听器模式 public static bool IsHydrophone = false; diff --git a/Correlator/Util/MethodExtensions.cs b/Correlator/Util/MethodExtensions.cs index 6bb154b..a6d9ac4 100644 --- a/Correlator/Util/MethodExtensions.cs +++ b/Correlator/Util/MethodExtensions.cs @@ -18,6 +18,121 @@ { public static class MethodExtensions { + private const int HeaderSize = 44; + + private static FileStream CreateEmptyWaveHeader(this 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 static void SaveWavFile(this string filePath, double[] dataArray, double[] dataArray1) + { + try + { + var fileStream = filePath.CreateEmptyWaveHeader(); + + 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(); + + //重写头文件 + fileStream.WriteHeader(7500, 2); + } + catch (Exception e) + { + LogHelper.Info(e.ToString()); + } + } + + private static void WriteHeader(this 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()); + } + } + /// /// 计算文件占用空间大小 /// diff --git a/Correlator/ViewModels/MainWindowViewModel.cs b/Correlator/ViewModels/MainWindowViewModel.cs index b1a7d5c..abdd5a9 100644 --- a/Correlator/ViewModels/MainWindowViewModel.cs +++ b/Correlator/ViewModels/MainWindowViewModel.cs @@ -848,16 +848,13 @@ { if (FlowStatus.CorrelatorData != null) { - var wavFile = new WavFile(); var filePath = $"{DirectoryManager.GetAudioDir()}\\音频_{DateTime.Now.ToString("yyyyMMddHHmmss")}.wav"; + filePath.SaveWavFile( + FlowStatus.CorrelatorData.LeftDeviceDataArray, + FlowStatus.CorrelatorData.RightDeviceDataArray + ); - var stream = wavFile.CreateEmpty(filePath); - wavFile.WriteFilestream(stream, FlowStatus.CorrelatorData.LeftDeviceDataArray, - FlowStatus.CorrelatorData.RightDeviceDataArray); - - //重写头文件 - wavFile.WriteHeader(stream, 7500, 2); Growl.Success("音频已保存"); //清空上次的缓存 FlowStatus.CorrelatorData = null; diff --git a/Correlator/Views/AuditionView.xaml b/Correlator/Views/AuditionView.xaml index 28209ea..f99ee1c 100644 --- a/Correlator/Views/AuditionView.xaml +++ b/Correlator/Views/AuditionView.xaml @@ -93,8 +93,7 @@ Grid.Column="1" Margin="20,0,0,0" BorderBrush="LightGray" - BorderThickness="1" - CornerRadius="5"> + BorderThickness="1"> @@ -148,8 +147,7 @@ Grid.Column="1" Margin="20,0,0,0" BorderBrush="LightGray" - BorderThickness="1" - CornerRadius="5"> + BorderThickness="1">