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">