using System; using System.Collections.Generic; using System.IO; using Correlator.Util; using NAudio.Wave; namespace Correlator.DataService { public class AudioServiceImpl : IAudioService { private bool _isStopped; private WaveFileWriter _waveFileWriter; private BufferedWaveProvider _waveProvider; private readonly WaveFormat _waveFormat = new WaveFormat(7500, 24, 1); public WaveOutEvent Wave { get; set; } = new WaveOutEvent(); public void Start(string deviceCode) { _isStopped = false; _waveProvider = new BufferedWaveProvider(_waveFormat); Wave.Init(_waveProvider); string fileName; var audioDir = DirectoryManager.GetAudioDir(); var time = DateTime.Now.ToString("yyyyMMdd_HHmmss"); if (deviceCode == RuntimeCache.Dev1) { //红色传感器听音 fileName = $"{audioDir}/听音_红_{time}.wav"; } else { //蓝色传感器听音 fileName = $"{audioDir}/听音_蓝_{time}.wav"; } _waveFileWriter = new WaveFileWriter(fileName, _waveFormat); Wave.Play(); } //缓存声波数据已经是后台线程了(处于线程池中) public void Write(byte[] pcm) { if (_isStopped) { return; } try { _waveProvider?.AddSamples(pcm, 0, pcm.Length); _waveFileWriter?.Write(pcm, 0, pcm.Length); } catch (InvalidOperationException) { _waveProvider?.ClearBuffer(); } } public void Write(string locateDataDir, string fileTag, List<byte[]> pcmArray) { var time = DateTime.Now.ToString("yyyyMMdd_HHmmss"); var wavFileName = $"{DirectoryManager.GetAudioDir()}/{fileTag}_{time}.wav"; var waveFileWriter = new WaveFileWriter(wavFileName, _waveFormat); //二位数组转一维数组 var bytes = new List<byte>(); foreach (var pcm in pcmArray) { bytes.AddRange(pcm); } waveFileWriter.Write(bytes.ToArray(), 0, bytes.Count); waveFileWriter.Dispose(); //保存为原始PCM文件 var pcmFileName = $"{locateDataDir}/{fileTag}_{time}.pcm"; var fs = new FileStream(pcmFileName, FileMode.Create, FileAccess.Write); fs.Write(bytes.ToArray(), 0, bytes.Count); fs.Dispose(); } public void Stop() { _isStopped = true; Wave.Stop(); _waveProvider.ClearBuffer(); _waveFileWriter.Dispose(); } } }