You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.1 KiB
65 lines
2.1 KiB
4 years ago
|
using System;
|
||
|
|
||
|
namespace AX.AudioSystem
|
||
|
{
|
||
|
public class OpusDecoder : IDisposable
|
||
|
{
|
||
|
public const int FrameMaxSize = 5760;
|
||
|
|
||
|
private IntPtr handle = IntPtr.Zero;
|
||
|
private int channels;
|
||
|
|
||
|
public OpusDecoder(SamplingRate samplingRate, Channel channels)
|
||
|
{
|
||
|
if (samplingRate != SamplingRate.Sampling08000 &&
|
||
|
samplingRate != SamplingRate.Sampling12000 &&
|
||
|
samplingRate != SamplingRate.Sampling16000 &&
|
||
|
samplingRate != SamplingRate.Sampling24000 &&
|
||
|
samplingRate != SamplingRate.Sampling48000)
|
||
|
throw new ArgumentOutOfRangeException("samplingRate");
|
||
|
|
||
|
if (channels != Channel.Mono && channels != Channel.Stereo)
|
||
|
throw new ArgumentOutOfRangeException("channels");
|
||
|
|
||
|
this.channels = (int)channels;
|
||
|
handle = OpusNative.OpusDecoderCreate(samplingRate, channels);
|
||
|
}
|
||
|
|
||
|
public int Decode(byte[] packetData, float[] pcm)
|
||
|
{
|
||
|
int bandwidth = OpusNative.opus_packet_get_bandwidth(packetData);
|
||
|
|
||
|
int samplesDecoded = 0;
|
||
|
|
||
|
if (bandwidth == (int)OpusErrorCode.InvalidPacket)
|
||
|
samplesDecoded = OpusNative.OpusDecode(handle, null, pcm, channels, 0);
|
||
|
else
|
||
|
samplesDecoded = OpusNative.OpusDecode(handle, packetData, pcm, channels, 0);
|
||
|
|
||
|
return samplesDecoded;
|
||
|
}
|
||
|
|
||
|
public int Decode(byte[] packetData, short[] pcm)
|
||
|
{
|
||
|
int bandwidth = OpusNative.opus_packet_get_bandwidth(packetData);
|
||
|
|
||
|
int samplesDecoded = 0;
|
||
|
|
||
|
if (bandwidth == (int)OpusErrorCode.InvalidPacket)
|
||
|
samplesDecoded = OpusNative.OpusDecode(handle, null, pcm, channels, 0);
|
||
|
else
|
||
|
samplesDecoded = OpusNative.OpusDecode(handle, packetData, pcm, channels, 0);
|
||
|
|
||
|
return samplesDecoded;
|
||
|
}
|
||
|
|
||
|
public void Dispose()
|
||
|
{
|
||
|
if (handle != IntPtr.Zero)
|
||
|
{
|
||
|
OpusNative.OpusDecoderDestroy(handle);
|
||
|
handle = IntPtr.Zero;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|