Newer
Older
Correlator / Correlator / DataService / AudioServiceImpl.cs
using System;
using Correlator.Util;
using NAudio.Wave;
using WaveFormat = NAudio.Wave.WaveFormat;
using WaveOut = NAudio.Wave.WaveOut;

namespace Correlator.DataService
{
    public class AudioServiceImpl : IAudioService
    {
        private WaveFileWriter _waveFileWriter;

        private readonly WaveOut _waveOut = new WaveOut();
        private readonly BufferedWaveProvider _waveProvider = new BufferedWaveProvider(new WaveFormat(7500, 24, 1));

        public void Start()
        {
            _waveOut.Init(_waveProvider);
            _waveOut.Play();

            var fileName = $"{DirectoryManager.GetAudioDir()}/听音_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.wav";
            _waveFileWriter = new WaveFileWriter(fileName, new WaveFormat(7500, 24, 1));
            //初始化wav文件头
            var fileHeader = AudioHub.CreateWaveFileHeader(int.MaxValue, 1, 7500, 24);
            _waveFileWriter.Write(fileHeader, 0, fileHeader.Length);
        }

        public void Write(byte[] pcm)
        {
            _waveProvider.AddSamples(pcm, 0, pcm.Length);

            //将pcm数据保存为wav格式文件
            if (_waveFileWriter == null)
            {
                return;
            }
            _waveFileWriter.Write(pcm, 0, pcm.Length);
        }

        public void Stop()
        {
            _waveOut.Stop();

            _waveFileWriter.Dispose();
            _waveFileWriter = null;
        }
    }
}