Newer
Older
Correlator / Correlator / DataService / AudioServiceImpl.cs
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();
        }
    }
}