网上演练贵港万达广场(人员密集)
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

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;
}
}
}
}