示例#1
0
        private OpusDecoder(double frameSize, int sampleRate, int channels, bool frameSizeWasSpecified)
        {
            switch (frameSize)
            {
            case 2.5:
            case 5:
            case 10:
            case 20:
            case 40:
            case 60:
                break;

            default:
                throw new ArgumentException("Value must be one of the following: 2.5, 5, 10, 20, 40 or 60.", nameof(frameSize));
            }

            switch (sampleRate)
            {
            case 8000:
            case 12000:
            case 16000:
            case 24000:
            case 48000:
                break;

            default:
                throw new ArgumentException("Value must be one of the following: 8000, 12000, 16000, 24000 or 48000.", nameof(sampleRate));
            }

            if (channels < 1 || channels > 2)
            {
                throw new ArgumentOutOfRangeException(nameof(channels), "Value must be between 1 and 2.");
            }

            if (frameSizeWasSpecified)
            {
                FrameSize = frameSize;
            }

            SampleRate = sampleRate;
            Channels   = channels;

            _samples   = API.GetSampleCount(frameSize, sampleRate);
            _pcmLength = API.GetPCMLength(_samples, channels);

            _handle = API.opus_decoder_create(sampleRate, channels, out int error);
            API.ThrowIfError(error);
        }
示例#2
0
 public static extern int opus_decode(SafeDecoderHandle st, IntPtr data, int len, IntPtr pcm, int frame_size, int decode_fec);