예제 #1
0
        public BigArray <float> GenerateMissingFrame(int frequency)
        {
            int          frameSize = frameSizes[frequency * 1000];
            codecWrapper codec     = encoders[frequency * 1000];

            short[] decodedFrame16Bit = TempArray <short> .Obtain(frameSize * 4);

            int decoded = codec.decoder.Decode(null, 0, 0, decodedFrame16Bit, 0, true);

            if (tempOutputArray.Length != decoded)
            {
                tempOutputArray.Resize(decoded);
            }

            for (int i = 0; i < decoded; i++)
            {
                float val = (float)decodedFrame16Bit[i];
                val /= short.MaxValue;
                tempOutputArray[i] = val;
            }

            TempArray <short> .Release(decodedFrame16Bit);

            return(tempOutputArray);
        }
예제 #2
0
        public BigArray <float> DecodeFrame(VoicePacketWrapper data)
        {
            int          frameSize = frameSizes[data.Frequency * 1000];
            codecWrapper codec     = encoders[data.Frequency * 1000];

            short[] decodedFrame16Bit = TempArray <short> .Obtain(frameSize * 4);

            int decoded = codec.decoder.Decode(data.RawData, 0, data.RawData.Length, decodedFrame16Bit, 0, false);

            if (tempOutputArray.Length != decoded)
            {
                tempOutputArray.Resize(decoded);
            }

            for (int i = 0; i < decoded; i++)
            {
                float val = (float)decodedFrame16Bit[i];
                val /= short.MaxValue;
                tempOutputArray[i] = val;
            }

            TempArray <short> .Release(decodedFrame16Bit);

            return(tempOutputArray);
        }
예제 #3
0
        public VoicePacketWrapper?GetNextEncodedFrame(int frequency)
        {
            int          frameSize = frameSizes[frequency];
            codecWrapper codec     = encoders[frequency];

            float[] chunk = TempArray <float> .Obtain(frameSize);

            bool chunkAvailable = chunkBuffer.RetrieveChunk(chunk);

            if (!chunkAvailable)
            {
                TempArray <float> .Release(chunk);

                return(null);
            }

            tempPacketWrapper           = new VoicePacketWrapper();
            tempPacketWrapper.Frequency = (byte)(frequency / 1000);

            short[] audio16bit = TempArray <short> .Obtain(frameSize);

            for (int i = 0; i < frameSize; i++)
            {
                float val = chunk[i] * short.MaxValue;
                audio16bit[i] = (short)val;
            }
            TempArray <float> .Release(chunk);

            byte[] buffer = TempArray <byte> .Obtain(audio16bit.Length * 2);

            int encoded = codec.encoder.Encode(audio16bit, 0, frameSize, buffer, 0, buffer.Length);

            TempArray <short> .Release(audio16bit);

            tempPacketWrapper.RawData = new byte[encoded];

            System.Buffer.BlockCopy(buffer, 0, tempPacketWrapper.RawData, 0, encoded);

            TempArray <byte> .Release(buffer);

            return(tempPacketWrapper);
        }