2022-08-13 02:39:18 +02:00

91 lines
2.4 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using NAudio.Wave;
namespace RageCoop.Client.Sync
{
internal static class Voice
{
public static bool IsRecording = false;
private static WaveInEvent _waveIn;
private static BufferedWaveProvider _waveProvider = new BufferedWaveProvider(new WaveFormat(16000, 16, 1));
private static Thread _thread;
public static void StopRecording()
{
if (!IsRecording)
return;
_waveIn.StopRecording();
GTA.UI.Notification.Show("STOPPED [1]");
}
public static void InitRecording()
{
// I tried without thread but the game will lag without
_thread = new Thread(new ThreadStart(() =>
{
while (true)
{
using (var wo = new WaveOutEvent())
{
wo.Init(_waveProvider);
wo.Play();
while (wo.PlaybackState == PlaybackState.Playing)
{
Thread.Sleep(100);
}
}
}
}));
_thread.Start();
_waveIn = new WaveInEvent
{
DeviceNumber = 0,
BufferMilliseconds = 20,
NumberOfBuffers = 1,
WaveFormat = _waveProvider.WaveFormat
};
_waveIn.DataAvailable += WaveInDataAvailable;
_waveIn.RecordingStopped += (object sender, StoppedEventArgs e) =>
{
IsRecording = false;
};
GTA.UI.Notification.Show("INIT");
}
public static void StartRecording()
{
if (IsRecording)
return;
IsRecording = true;
_waveIn.StartRecording();
GTA.UI.Notification.Show("STARTED");
}
private static void WaveInDataAvailable(object sender, WaveInEventArgs e)
{
if (_waveIn == null)
return;
try
{
_waveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
Networking.SendVoiceMessage(e.Buffer);
} catch (Exception ex)
{
// if some happens along the way...
}
}
}
}