csvorbis.Residue0._01inverse C# (CSharp) Method

_01inverse() private method

private _01inverse ( Block vb, Object vl, float fin, int ch, int decodepart ) : int
vb Block
vl Object
fin float
ch int
decodepart int
return int
        internal static int _01inverse(Block vb, Object vl, float[][] fin, int ch, int decodepart)
        {
            {
                int i,j,k,l,s;
                LookResidue0 look=(LookResidue0 )vl;
                InfoResidue0 info=look.info;

                // move all this setup out later
                int samples_per_partition=info.grouping;
                int partitions_per_word=look.phrasebook.dim;
                int n=info.end-info.begin;

                int partvals=n/samples_per_partition;
                int partwords=(partvals+partitions_per_word-1)/partitions_per_word;

                if(partword.Length<ch)
                {
                    partword=new int[ch][][];
                    for(j=0;j<ch;j++)
                    {
                        partword[j]=new int[partwords][];
                    }
                }
                else
                {
                    for(j=0;j<ch;j++)
                    {
                        if(partword[j]==null || partword[j].Length<partwords)
                            partword[j]=new int[partwords][];
                    }
                }

                for(s=0;s<look.stages;s++)
                {
                    // each loop decodes on partition codeword containing
                    // partitions_pre_word partitions
                    for(i=0,l=0;i<partvals;l++)
                    {
                        if(s==0)
                        {
                            // fetch the partition word for each channel
                            for(j=0;j<ch;j++)
                            {
                                int temp=look.phrasebook.decode(vb.opb);
                                if(temp==-1)
                                {
                                    //goto eopbreak;
                                    return(0);
                                }
                                partword[j][l]=look.decodemap[temp];
                                if(partword[j][l]==null)
                                {
                                    //	      goto errout;
                                    return(0);
                                }
                            }
                        }

                        // now we decode residual values for the partitions
                        for(k=0;k<partitions_per_word && i<partvals;k++,i++)
                            for(j=0;j<ch;j++)
                            {
                                int offset=info.begin+i*samples_per_partition;
                                if((info.secondstages[partword[j][l][k]]&(1<<s))!=0)
                                {
                                    CodeBook stagebook=look.fullbooks[look.partbooks[partword[j][l][k]][s]];
                                    //	      CodeBook stagebook=look.partbooks[partword[j][l][k]][s];
                                    if(stagebook!=null)
                                    {
                                        if(decodepart==0)
                                        {
                                            if(stagebook.decodevs_add(fin[j],offset,vb.opb,samples_per_partition)==-1)
                                            {
                                                // goto errout;
                                                return(0);
                                            }
                                        }
                                        else if(decodepart==1)
                                        {
                                            if(stagebook.decodev_add(fin[j], offset, vb.opb,samples_per_partition)==-1)
                                            {
                                                // goto errout;
                                                return(0);
                                            }
                                        }
                                    }
                                }
                            }
                    }
                }
                return(0);
            }
        }