Beispiel #1
0
 private void _UnpackCtor()
 {
     for (int i = 0; i < AudV.Length; i++)
     {
         AudV[i] = new AudioVariables();
     }
 }
Beispiel #2
0
 protected void unpInitData20(bool Solid)
 {
     if (!Solid)
     {
         UnpChannelDelta = UnpCurChannel = 0;
         UnpChannels     = 1;
         // memset(AudV,0,sizeof(AudV));
         AudV[0] = new AudioVariables();
         AudV[1] = new AudioVariables();
         AudV[2] = new AudioVariables();
         AudV[3] = new AudioVariables();
         // memset(UnpOldTable20,0,sizeof(UnpOldTable20));
         Utility.Fill(UnpOldTable20, (byte)0);
     }
 }
Beispiel #3
0
        void UnpInitData20(bool Solid)
        {
            if (!Solid)
            {
                TablesRead2     = false;
                UnpAudioBlock   = false;
                UnpChannelDelta = 0;
                UnpCurChannel   = 0;
                UnpChannels     = 1;

                //memset(AudV,0,sizeof(AudV));
                AudV = new AudioVariables[4];
                Utility.Memset(UnpOldTable20, 0, UnpOldTable20.Length);
                //memset(MD,0,sizeof(MD));
                MD = new DecodeTable[4];
            }
        }
Beispiel #4
0
        private void unpInitData20(bool Solid)
        {
            if (!Solid)
            {
                UnpChannelDelta = UnpCurChannel = 0;
                UnpChannels     = 1;

                // memset(AudV,0,sizeof(AudV));
                AudV[0] = new AudioVariables();
                AudV[1] = new AudioVariables();
                AudV[2] = new AudioVariables();
                AudV[3] = new AudioVariables();

                // memset(UnpOldTable20,0,sizeof(UnpOldTable20));
                new Span <byte>(UnpOldTable20).Fill(0);
            }
        }
Beispiel #5
0
        private void UnpInitData20(bool Solid)
        {
            if (!Solid)
            {
                TablesRead2     = false;
                UnpAudioBlock   = false;
                UnpChannelDelta = 0;
                UnpCurChannel   = 0;
                UnpChannels     = 1;

                //memset(AudV,0,sizeof(AudV));
                AudV = new AudioVariables[4];
                new Span <byte>(UnpOldTable20).Clear();
                //memset(MD,0,sizeof(MD));
                MD = new DecodeTable[4];
            }
        }
Beispiel #6
0
        private byte DecodeAudio(int Delta)
        {
            AudioVariables v = AudV[UnpCurChannel];

            v.ByteCount = v.ByteCount + 1;
            v.D4        = v.D3;
            v.D3        = v.D2;               // ->D3=V->D2;
            v.D2        = v.LastDelta - v.D1; // ->D2=V->LastDelta-V->D1;
            v.D1        = v.LastDelta;        // V->D1=V->LastDelta;
            // int PCh=8*V->LastChar+V->K1*V->D1 +V->K2*V->D2 +V->K3*V->D3
            // +V->K4*V->D4+ V->K5*UnpChannelDelta;
            int PCh = 8 * v.LastChar + v.K1 * v.D1;

            PCh += v.K2 * v.D2 + v.K3 * v.D3;
            PCh += v.K4 * v.D4 + v.K5 * UnpChannelDelta;
            PCh  = (Utility.URShift(PCh, 3)) & 0xFF;

            int Ch = PCh - Delta;

            int D = ((byte)Delta) << 3;

            v.Dif[0]  += System.Math.Abs(D);                   // V->Dif[0]+=abs(D);
            v.Dif[1]  += System.Math.Abs(D - v.D1);            // V->Dif[1]+=abs(D-V->D1);
            v.Dif[2]  += System.Math.Abs(D + v.D1);            // V->Dif[2]+=abs(D+V->D1);
            v.Dif[3]  += System.Math.Abs(D - v.D2);            // V->Dif[3]+=abs(D-V->D2);
            v.Dif[4]  += System.Math.Abs(D + v.D2);            // V->Dif[4]+=abs(D+V->D2);
            v.Dif[5]  += System.Math.Abs(D - v.D3);            // V->Dif[5]+=abs(D-V->D3);
            v.Dif[6]  += System.Math.Abs(D + v.D3);            // V->Dif[6]+=abs(D+V->D3);
            v.Dif[7]  += System.Math.Abs(D - v.D4);            // V->Dif[7]+=abs(D-V->D4);
            v.Dif[8]  += System.Math.Abs(D + v.D4);            // V->Dif[8]+=abs(D+V->D4);
            v.Dif[9]  += System.Math.Abs(D - UnpChannelDelta); // V->Dif[9]+=abs(D-UnpChannelDelta);
            v.Dif[10] += System.Math.Abs(D + UnpChannelDelta); // V->Dif[10]+=abs(D+UnpChannelDelta);

            v.LastDelta     = (byte)(Ch - v.LastChar);
            UnpChannelDelta = v.LastDelta;
            v.LastChar      = Ch; // V->LastChar=Ch;

            if ((v.ByteCount & 0x1F) == 0)
            {
                int MinDif = v.Dif[0], NumMinDif = 0;
                v.Dif[0] = 0; // ->Dif[0]=0;
                for (int I = 1; I < v.Dif.Length; I++)
                {
                    if (v.Dif[I] < MinDif)
                    {
                        MinDif    = v.Dif[I];
                        NumMinDif = I;
                    }
                    v.Dif[I] = 0;
                }
                switch (NumMinDif)
                {
                case 1:
                    if (v.K1 >= -16)
                    {
                        v.K1 = v.K1 - 1;     // V->K1--;
                    }
                    break;

                case 2:
                    if (v.K1 < 16)
                    {
                        v.K1 = v.K1 + 1;     // V->K1++;
                    }
                    break;

                case 3:
                    if (v.K2 >= -16)
                    {
                        v.K2 = v.K2 - 1;     // V->K2--;
                    }
                    break;

                case 4:
                    if (v.K2 < 16)
                    {
                        v.K2 = v.K2 + 1;     // V->K2++;
                    }
                    break;

                case 5:
                    if (v.K3 >= -16)
                    {
                        v.K3 = v.K3 - 1;
                    }
                    break;

                case 6:
                    if (v.K3 < 16)
                    {
                        v.K3 = v.K3 + 1;
                    }
                    break;

                case 7:
                    if (v.K4 >= -16)
                    {
                        v.K4 = v.K4 - 1;
                    }
                    break;

                case 8:
                    if (v.K4 < 16)
                    {
                        v.K4 = v.K4 + 1;
                    }
                    break;

                case 9:
                    if (v.K5 >= -16)
                    {
                        v.K5 = v.K5 - 1;
                    }
                    break;

                case 10:
                    if (v.K5 < 16)
                    {
                        v.K5 = v.K5 + 1;
                    }
                    break;
                }
            }
            return((byte)Ch);
        }
Beispiel #7
0
        byte DecodeAudio(int Delta)
        {
            AudioVariables V = AudV[UnpCurChannel];

            V.ByteCount++;
            V.D4 = V.D3;
            V.D3 = V.D2;
            V.D2 = V.LastDelta - V.D1;
            V.D1 = V.LastDelta;
            int PCh = 8 * V.LastChar + V.K1 * V.D1 + V.K2 * V.D2 + V.K3 * V.D3 + V.K4 * V.D4 + V.K5 * UnpChannelDelta;

            PCh = (PCh >> 3) & 0xFF;

            uint Ch = (uint)(PCh - Delta);

            int D = (sbyte)Delta;

            // Left shift of negative value is undefined behavior in C++,
            // so we cast it to unsigned to follow the standard.
            D = (int)((uint)D << 3);

            V.Dif[0]  += (uint)Math.Abs(D);
            V.Dif[1]  += (uint)Math.Abs(D - V.D1);
            V.Dif[2]  += (uint)Math.Abs(D + V.D1);
            V.Dif[3]  += (uint)Math.Abs(D - V.D2);
            V.Dif[4]  += (uint)Math.Abs(D + V.D2);
            V.Dif[5]  += (uint)Math.Abs(D - V.D3);
            V.Dif[6]  += (uint)Math.Abs(D + V.D3);
            V.Dif[7]  += (uint)Math.Abs(D - V.D4);
            V.Dif[8]  += (uint)Math.Abs(D + V.D4);
            V.Dif[9]  += (uint)Math.Abs(D - UnpChannelDelta);
            V.Dif[10] += (uint)Math.Abs(D + UnpChannelDelta);

            UnpChannelDelta = V.LastDelta = (sbyte)(Ch - V.LastChar);
            V.LastChar      = (int)Ch;

            if ((V.ByteCount & 0x1F) == 0)
            {
                uint MinDif = V.Dif[0], NumMinDif = 0;
                V.Dif[0] = 0;
                for (uint I = 1; I < V.Dif.Length; I++)
                {
                    if (V.Dif[I] < MinDif)
                    {
                        MinDif    = V.Dif[I];
                        NumMinDif = I;
                    }
                    V.Dif[I] = 0;
                }
                switch (NumMinDif)
                {
                case 1:
                    if (V.K1 >= -16)
                    {
                        V.K1--;
                    }
                    break;

                case 2:
                    if (V.K1 < 16)
                    {
                        V.K1++;
                    }
                    break;

                case 3:
                    if (V.K2 >= -16)
                    {
                        V.K2--;
                    }
                    break;

                case 4:
                    if (V.K2 < 16)
                    {
                        V.K2++;
                    }
                    break;

                case 5:
                    if (V.K3 >= -16)
                    {
                        V.K3--;
                    }
                    break;

                case 6:
                    if (V.K3 < 16)
                    {
                        V.K3++;
                    }
                    break;

                case 7:
                    if (V.K4 >= -16)
                    {
                        V.K4--;
                    }
                    break;

                case 8:
                    if (V.K4 < 16)
                    {
                        V.K4++;
                    }
                    break;

                case 9:
                    if (V.K5 >= -16)
                    {
                        V.K5--;
                    }
                    break;

                case 10:
                    if (V.K5 < 16)
                    {
                        V.K5++;
                    }
                    break;
                }
            }
            return((byte)Ch);
        }
Beispiel #8
0
        private byte DecodeAudio(int Delta)
        {
            AudioVariables variables = this.AudV[this.UnpCurChannel];

            variables.ByteCount++;
            variables.D4 = variables.D3;
            variables.D3 = variables.D2;
            variables.D2 = variables.LastDelta - variables.D1;
            variables.D1 = variables.LastDelta;
            int number = (8 * variables.LastChar) + (variables.K1 * variables.D1);

            number += (variables.K2 * variables.D2) + (variables.K3 * variables.D3);
            number += (variables.K4 * variables.D4) + (variables.K5 * this.UnpChannelDelta);
            number  = Utility.URShift(number, 3) & 0xff;
            int num2 = number - Delta;
            int num3 = ((byte)Delta) << 3;

            variables.Dif[0]    += Math.Abs(num3);
            variables.Dif[1]    += Math.Abs((int)(num3 - variables.D1));
            variables.Dif[2]    += Math.Abs((int)(num3 + variables.D1));
            variables.Dif[3]    += Math.Abs((int)(num3 - variables.D2));
            variables.Dif[4]    += Math.Abs((int)(num3 + variables.D2));
            variables.Dif[5]    += Math.Abs((int)(num3 - variables.D3));
            variables.Dif[6]    += Math.Abs((int)(num3 + variables.D3));
            variables.Dif[7]    += Math.Abs((int)(num3 - variables.D4));
            variables.Dif[8]    += Math.Abs((int)(num3 + variables.D4));
            variables.Dif[9]    += Math.Abs((int)(num3 - this.UnpChannelDelta));
            variables.Dif[10]   += Math.Abs((int)(num3 + this.UnpChannelDelta));
            variables.LastDelta  = (byte)(num2 - variables.LastChar);
            this.UnpChannelDelta = variables.LastDelta;
            variables.LastChar   = num2;
            if ((variables.ByteCount & 0x1f) == 0)
            {
                int num4 = variables.Dif[0];
                int num5 = 0;
                variables.Dif[0] = 0;
                for (int i = 1; i < variables.Dif.Length; i++)
                {
                    if (variables.Dif[i] < num4)
                    {
                        num4 = variables.Dif[i];
                        num5 = i;
                    }
                    variables.Dif[i] = 0;
                }
                switch (num5)
                {
                case 1:
                    if (variables.K1 >= -16)
                    {
                        variables.K1--;
                    }
                    break;

                case 2:
                    if (variables.K1 < 0x10)
                    {
                        variables.K1++;
                    }
                    break;

                case 3:
                    if (variables.K2 >= -16)
                    {
                        variables.K2--;
                    }
                    break;

                case 4:
                    if (variables.K2 < 0x10)
                    {
                        variables.K2++;
                    }
                    break;

                case 5:
                    if (variables.K3 >= -16)
                    {
                        variables.K3--;
                    }
                    break;

                case 6:
                    if (variables.K3 < 0x10)
                    {
                        variables.K3++;
                    }
                    break;

                case 7:
                    if (variables.K4 >= -16)
                    {
                        variables.K4--;
                    }
                    break;

                case 8:
                    if (variables.K4 < 0x10)
                    {
                        variables.K4++;
                    }
                    break;

                case 9:
                    if (variables.K5 >= -16)
                    {
                        variables.K5--;
                    }
                    break;

                case 10:
                    if (variables.K5 < 0x10)
                    {
                        variables.K5++;
                    }
                    break;
                }
            }
            return((byte)num2);
        }