public codecWrapper(NSpeex.BandMode mode, bool vbr)
            {
                encoder = new NSpeex.SpeexEncoder(mode);
                decoder = new NSpeex.SpeexDecoder(mode, false);

                encoder.VBR     = vbr;
                encoder.Quality = 5;
            }
 public static float[] DeCompress(NSpeex.SpeexDecoder speexDec, byte[] data, int dataLength)
 {
     float[] decoded     = new float[data.Length];
     short[] shortBuffer = new short[data.Length];
     speexDec.Decode(data, 0, dataLength, shortBuffer, 0, false);
     shortBuffer.ToFloatArray(decoded, shortBuffer.Length);
     return(decoded);
 }
 static float[] SpeexDecompress(NSpeex.SpeexDecoder speexDec, byte[] data, int dataLength)
 {
     float[] decoded     = VoiceChatFloatPool.Instance.Get();
     short[] shortBuffer = VoiceChatShortPool.Instance.Get();
     speexDec.Decode(data, 0, dataLength, shortBuffer, 0, false);
     shortBuffer.ToFloatArray(decoded, shortBuffer.Length);
     VoiceChatShortPool.Instance.Return(shortBuffer);
     return(decoded);
 }
Beispiel #4
0
        public byte[] Decode(byte[] encodedData)
        {
            //THIS IS IN NO WAY GOOD CODE!
            //Just experimenting!

            NSpeex.SpeexDecoder d = new NSpeex.SpeexDecoder(NSpeex.BandMode.Wide, false);
            NSpeex.SpeexJitterBuffer b = new NSpeex.SpeexJitterBuffer(d);

            b.Put(encodedData);

            short[] decoded = new short[1024];
            b.Get(decoded);

            return null;
        }
        public static int Decompress(NSpeex.SpeexDecoder speexDecoder, VoiceChatPacket packet, out float[] data)
        {
            switch (packet.Compression)
            {
            /*
             * case VoiceChatCompression.Raw:
             *  {
             *      short[9 buffer
             *
             *      Buffer.BlockCopy(packet.Data, 0, shortBuffer, 0, packet.Length);
             *      shortBuffer.ToFloatArray(data, packet.Length / 2);
             *      return packet.Length / 2;
             *  }
             *
             * case VoiceChatCompression.RawZlib:
             *  {
             *      byte[] unzipedData = ZlibDecompress(packet.Data, packet.Length);
             *
             *      Buffer.BlockCopy(unzipedData, 0, shortBuffer, 0, unzipedData.Length);
             *      shortBuffer.ToFloatArray(data, unzipedData.Length / 2);
             *      return unzipedData.Length / 2;
             *  }
             */

            case VoiceChatCompression.Speex:
            {
                data = SpeexDecompress(speexDecoder, packet.Data, packet.Length);
                return(data.Length);
            }

            case VoiceChatCompression.Alaw:
            {
                data = ALawDecompress(packet.Data, packet.Length);
                return(packet.Length);
            }

            case VoiceChatCompression.AlawZlib:
            {
                byte[] alaw = ZlibDecompress(packet.Data, packet.Length);
                data = ALawDecompress(alaw, alaw.Length);
                return(alaw.Length);
            }
            }

            data = new float[0];
            return(0);
        }
Beispiel #6
0
        private short[] DecodeAudio(byte[] encodedData)
        {
            var decoder   = new NSpeex.SpeexDecoder(NSpeex.BandMode.Wide, false);
            var outBuffer = new List <byte[]>();
            var tmpBuffer = new short[1024];

            int numPackets = BitConverter.ToInt32(encodedData, 0);

            List <int> packet_sizes = new List <int>();

            for (int i = 0; i < numPackets; i++)
            {
                int frame_size = BitConverter.ToInt32(encodedData, 4 + (i * 4));
                packet_sizes.Add(frame_size);
            }

            int fr_index = 0;

            for (var idx = 4 + (numPackets * 4); idx + packet_sizes[fr_index] < encodedData.Length; idx += packet_sizes[fr_index])
            {
                var read    = decoder.Decode(encodedData, idx, packet_sizes[fr_index], tmpBuffer, 0, false);
                var tmpData = new byte[read * 2];
                for (var i = 0; i < read; i++)
                {
                    var ba = BitConverter.GetBytes(tmpBuffer[i]);
                    System.Array.Copy(ba, 0, tmpData, i * 2, 2);
                }
                outBuffer.Add(tmpData);
                fr_index++;
            }
            var fullSize = outBuffer.Sum(delegate(byte[] m) { return(m.Length); });
            var retData  = new byte[fullSize];
            var offset   = 0;

            for (int i = 0; i < outBuffer.Count; i++)
            {
                var b = outBuffer[i];
                System.Array.Copy(b, 0, retData, offset, b.Length);
                offset += b.Length;
            }

            short[] pcm = new short[retData.Length / sizeof(short)];
            Buffer.BlockCopy(retData, 0, pcm, 0, retData.Length);

            return(pcm);
        }
Beispiel #7
0
        static StackObject *Ctor_0(ILIntepreter __intp, StackObject *__esp, IList <object> __mStack, CLRMethod __method, bool isNewObj)
        {
            ILRuntime.Runtime.Enviorment.AppDomain __domain = __intp.AppDomain;
            StackObject *ptr_of_this_method;
            StackObject *__ret = ILIntepreter.Minus(__esp, 2);

            ptr_of_this_method = ILIntepreter.Minus(__esp, 1);
            System.Boolean @enhanced = ptr_of_this_method->Value == 1;

            ptr_of_this_method = ILIntepreter.Minus(__esp, 2);
            NSpeex.BandMode @mode = (NSpeex.BandMode) typeof(NSpeex.BandMode).CheckCLRTypes(StackObject.ToObject(ptr_of_this_method, __domain, __mStack));
            __intp.Free(ptr_of_this_method);


            var result_of_this_method = new NSpeex.SpeexDecoder(@mode, @enhanced);

            return(ILIntepreter.PushObject(__ret, __mStack, result_of_this_method));
        }
Beispiel #8
0
        //根据byte数组,得到一个声音片段
        public AudioClip BytesToAudioClip(byte[] buffer)
        {
            //byte数组和声音长度的换算 这里暂时不知道稳不稳定
            float _nAudioTime = buffer.Length / ByteInLengthPropotion;

            //长度不难为0否则会报错
            if (_nAudioTime <= 0.1f)
            {
                _nAudioTime = 0.1f;
            }

            //创建声音片段,取样大小==声音长度*频率
            AudioClip clip = AudioClip.Create("AA", (int)(_nAudioTime * RecordFrequency), 1, RecordFrequency, false);

            //将_list反序列成完整的声音包列表
            List <ViChatPacket> list = new List <ViChatPacket>();
            int offest = 0;

            while (offest < buffer.Length)
            {
                ViChatPacket packet = ViChatPacketSerializer.DeSerializer(buffer, offest);
                offest = offest + 8 + packet.Data.Length; //8和包长度可能是这个声音包的包头
                list.Add(packet);
            }

            int sampleIndex = 0;

            NSpeex.SpeexDecoder _speexDec = new NSpeex.SpeexDecoder(NSpeex.BandMode.Narrow); //解析器
            for (int i = 0; i < list.Count; ++i)
            {
                //取反序列化的声音包
                ViChatPacket iterPacket = list[i];
                //包内数据拷贝到数组
                byte[] sampleData = new byte[iterPacket.DataLength];
                Buffer.BlockCopy(iterPacket.Data, 0, sampleData, 0, iterPacket.Length);
                //解压
                float[] sample = ViSpeexCompress.DeCompress(_speexDec, sampleData, iterPacket.Length);
                //将数据添加到声音片段
                clip.SetData(sample, sampleIndex);
                sampleIndex += sample.Length;
            }
            return(clip);
        }
Beispiel #9
0
        private short[] SpeexDecode(byte[] input, BandMode mode)
        {
            NSpeex.SpeexDecoder speexDec = null;
            int shortLen = 320;

            switch (mode)
            {
            case BandMode.Narrow:
                speexDec = m_narrow_dec;
                shortLen = 320;
                break;

            case BandMode.Wide:
                speexDec = m_wide_dec;
                shortLen = 640;
                break;

            case BandMode.UltraWide:
                speexDec = m_ultrawide_dec;
                shortLen = 1280;
                break;
            }

            byte[] len_bytes = USpeakPoolUtils.GetByte(4);
            System.Array.Copy(input, len_bytes, 4);

            int dataLength = BitConverter.ToInt32(len_bytes, 0);

            USpeakPoolUtils.Return(len_bytes);

            byte[] actual_bytes = USpeakPoolUtils.GetByte(input.Length - 4);
            Buffer.BlockCopy(input, 4, actual_bytes, 0, input.Length - 4);

            short[] decoded = USpeakPoolUtils.GetShort(shortLen);

            speexDec.Decode(actual_bytes, 0, dataLength, decoded, 0, false);

            USpeakPoolUtils.Return(actual_bytes);

            return(decoded);
        }
Beispiel #10
0
        public SpeexCodex(BandMode mode)
        {
            this.mode = mode;

            encoder = new NSpeex.SpeexEncoder(SpeedxMode);
            decoder = new NSpeex.SpeexDecoder(SpeedxMode, false);

            encoder.VBR     = true;
            encoder.Quality = 4;

            dataSize = encoder.FrameSize * (mode == BandMode.Narrow ? 8 : mode == BandMode.Wide ? 4 : 2);

            encodingBuffer = new short[dataSize];
            encodedBuffer  = new byte[dataSize];
            decodeBuffer   = new short[dataSize];
            decodedBuffer  = new float[dataSize];

            int frequency = AudioUtils.GetFrequency(mode);
            var time      = frequency / (float)dataSize;

            UnityEngine.Debug.Log("SpeedCodex created mode:" + mode + " dataSize:" + dataSize + " time:" + time);
        }
        static StackObject *DeCompress_1(ILIntepreter __intp, StackObject *__esp, IList <object> __mStack, CLRMethod __method, bool isNewObj)
        {
            ILRuntime.Runtime.Enviorment.AppDomain __domain = __intp.AppDomain;
            StackObject *ptr_of_this_method;
            StackObject *__ret = ILIntepreter.Minus(__esp, 3);

            ptr_of_this_method = ILIntepreter.Minus(__esp, 1);
            System.Int32 @dataLength = ptr_of_this_method->Value;

            ptr_of_this_method = ILIntepreter.Minus(__esp, 2);
            System.Byte[] @data = (System.Byte[]) typeof(System.Byte[]).CheckCLRTypes(StackObject.ToObject(ptr_of_this_method, __domain, __mStack));
            __intp.Free(ptr_of_this_method);

            ptr_of_this_method = ILIntepreter.Minus(__esp, 3);
            NSpeex.SpeexDecoder @speexDec = (NSpeex.SpeexDecoder) typeof(NSpeex.SpeexDecoder).CheckCLRTypes(StackObject.ToObject(ptr_of_this_method, __domain, __mStack));
            __intp.Free(ptr_of_this_method);


            var result_of_this_method = Assets.Scripts.Module.Common.ViSpeak.Compress.ViSpeexCompress.DeCompress(@speexDec, @data, @dataLength);

            return(ILIntepreter.PushObject(__ret, __mStack, result_of_this_method));
        }