62 lines
1.4 KiB
C#
62 lines
1.4 KiB
C#
using System;
|
|
using NAudio.Codecs;
|
|
using NAudio.Wave;
|
|
|
|
namespace Server.Helper;
|
|
|
|
public class G722ChatCodec
|
|
{
|
|
private readonly int bitrate;
|
|
|
|
private readonly G722CodecState encoderState;
|
|
|
|
private readonly G722CodecState decoderState;
|
|
|
|
private readonly G722Codec codec;
|
|
|
|
public string Name => "G.722 16kHz";
|
|
|
|
public int BitsPerSecond => bitrate;
|
|
|
|
public WaveFormat RecordFormat { get; }
|
|
|
|
public bool IsAvailable => true;
|
|
|
|
public G722ChatCodec()
|
|
{
|
|
bitrate = 64000;
|
|
encoderState = new G722CodecState(bitrate, G722Flags.None);
|
|
decoderState = new G722CodecState(bitrate, G722Flags.None);
|
|
codec = new G722Codec();
|
|
RecordFormat = new WaveFormat(16000, 1);
|
|
}
|
|
|
|
public byte[] Encode(byte[] data, int offset, int length)
|
|
{
|
|
if (offset != 0)
|
|
{
|
|
throw new ArgumentException("G722 does not yet support non-zero offsets");
|
|
}
|
|
WaveBuffer waveBuffer = new WaveBuffer(data);
|
|
byte[] array = new byte[length / 4];
|
|
codec.Encode(encoderState, array, waveBuffer.ShortBuffer, length / 2);
|
|
return array;
|
|
}
|
|
|
|
public byte[] Decode(byte[] data, int offset, int length)
|
|
{
|
|
if (offset != 0)
|
|
{
|
|
throw new ArgumentException("G722 does not yet support non-zero offsets");
|
|
}
|
|
byte[] array = new byte[length * 4];
|
|
WaveBuffer waveBuffer = new WaveBuffer(array);
|
|
codec.Decode(decoderState, waveBuffer.ShortBuffer, data, length);
|
|
return array;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
}
|
|
}
|