コード例 #1
0
 public void SetMode(bool interp, int filtercnt, bool sinc, int sinc_size = 64, int sinc_interpsize = 32)
 {
     this.m_sincsize     = ((sinc && sinc_size >= 4) ? ((sinc_size > 8192) ? 8192 : sinc_size) : 0);
     this.m_sincoversize = ((this.m_sincsize != 0) ? ((sinc_interpsize <= 1) ? 1 : ((sinc_interpsize >= 4096) ? 4096 : sinc_interpsize)) : 1);
     this.m_filtercnt    = ((this.m_sincsize != 0) ? 0 : ((filtercnt <= 0) ? 0 : ((filtercnt >= 4) ? 4 : filtercnt)));
     this.m_interp       = (interp && this.m_sincsize == 0);
     if (this.m_sincsize == 0)
     {
         this.m_filter_coeffs      = new float[0];
         this.m_filter_coeffs_size = 0;
     }
     if (this.m_filtercnt == 0)
     {
         this.m_iirfilter = null;
     }
 }
コード例 #2
0
        public int ResampleOut(float[] outBuffer, int outBufferIndex, int nsamples_in, int nsamples_out, int nch)
        {
            if (nch > 64 || nch < 1)
            {
                return(0);
            }
            if (this.m_filtercnt > 0 && this.m_ratio > 1.0 && nsamples_in > 0)
            {
                if (this.m_iirfilter == null)
                {
                    this.m_iirfilter = new WdlResampler.WDL_Resampler_IIRFilter();
                }
                int filtercnt = this.m_filtercnt;
                this.m_iirfilter.setParms(1.0 / this.m_ratio * (double)this.m_filterpos, (double)this.m_filterq);
                int num  = this.m_samples_in_rsinbuf * nch;
                int num2 = 0;
                for (int i = 0; i < nch; i++)
                {
                    for (int j = 0; j < filtercnt; j++)
                    {
                        this.m_iirfilter.Apply(this.m_rsinbuf, num + i, this.m_rsinbuf, num + i, nsamples_in, nch, num2++);
                    }
                }
            }
            this.m_samples_in_rsinbuf += Math.Min(nsamples_in, this.m_last_requested);
            int num3 = this.m_samples_in_rsinbuf;

            if (nsamples_in < this.m_last_requested)
            {
                int num4 = (this.m_last_requested - nsamples_in) * 2 + this.m_sincsize * 2;
                int num5 = (this.m_samples_in_rsinbuf + num4) * nch;
                Array.Resize <float>(ref this.m_rsinbuf, num5);
                if (this.m_rsinbuf.Length == num5)
                {
                    Array.Clear(this.m_rsinbuf, this.m_samples_in_rsinbuf * nch, num4 * nch);
                    num3 = this.m_samples_in_rsinbuf + num4;
                }
            }
            int    num6  = 0;
            double num7  = this.m_fracpos;
            double ratio = this.m_ratio;
            int    num8  = 0;
            int    num9  = outBufferIndex;
            int    num10 = nsamples_out;
            int    num11 = 0;

            if (this.m_sincsize != 0)
            {
                if (this.m_ratio > 1.0)
                {
                    this.BuildLowPass(1.0 / (this.m_ratio * 1.03));
                }
                else
                {
                    this.BuildLowPass(1.0);
                }
                int filter_coeffs_size = this.m_filter_coeffs_size;
                int num12 = num3 - filter_coeffs_size;
                num11 = filter_coeffs_size / 2 - 1;
                int filterIndex = 0;
                if (nch == 1)
                {
                    while (num10-- != 0)
                    {
                        int num13 = (int)num7;
                        if (num13 >= num12 - 1)
                        {
                            break;
                        }
                        this.SincSample1(outBuffer, num9, this.m_rsinbuf, num8 + num13, num7 - (double)num13, this.m_filter_coeffs, filterIndex, filter_coeffs_size);
                        num9++;
                        num7 += ratio;
                        num6++;
                    }
                }
                else if (nch == 2)
                {
                    while (num10-- != 0)
                    {
                        int num14 = (int)num7;
                        if (num14 >= num12 - 1)
                        {
                            break;
                        }
                        this.SincSample2(outBuffer, num9, this.m_rsinbuf, num8 + num14 * 2, num7 - (double)num14, this.m_filter_coeffs, filterIndex, filter_coeffs_size);
                        num9 += 2;
                        num7 += ratio;
                        num6++;
                    }
                }
                else
                {
                    while (num10-- != 0)
                    {
                        int num15 = (int)num7;
                        if (num15 >= num12 - 1)
                        {
                            break;
                        }
                        this.SincSample(outBuffer, num9, this.m_rsinbuf, num8 + num15 * nch, num7 - (double)num15, nch, this.m_filter_coeffs, filterIndex, filter_coeffs_size);
                        num9 += nch;
                        num7 += ratio;
                        num6++;
                    }
                }
            }
            else if (!this.m_interp)
            {
                if (nch == 1)
                {
                    while (num10-- != 0)
                    {
                        int num16 = (int)num7;
                        if (num16 >= num3)
                        {
                            break;
                        }
                        outBuffer[num9++] = this.m_rsinbuf[num8 + num16];
                        num7 += ratio;
                        num6++;
                    }
                }
                else if (nch == 2)
                {
                    while (num10-- != 0)
                    {
                        int num17 = (int)num7;
                        if (num17 >= num3)
                        {
                            break;
                        }
                        num17              += num17;
                        outBuffer[num9]     = this.m_rsinbuf[num8 + num17];
                        outBuffer[num9 + 1] = this.m_rsinbuf[num8 + num17 + 1];
                        num9 += 2;
                        num7 += ratio;
                        num6++;
                    }
                }
                else
                {
                    while (num10-- != 0)
                    {
                        int num18 = (int)num7;
                        if (num18 >= num3)
                        {
                            break;
                        }
                        Array.Copy(this.m_rsinbuf, num8 + num18 * nch, outBuffer, num9, nch);
                        num9 += nch;
                        num7 += ratio;
                        num6++;
                    }
                }
            }
            else if (nch == 1)
            {
                while (num10-- != 0)
                {
                    int    num19 = (int)num7;
                    double num20 = num7 - (double)num19;
                    if (num19 >= num3 - 1)
                    {
                        break;
                    }
                    double num21 = 1.0 - num20;
                    int    num22 = num8 + num19;
                    outBuffer[num9++] = (float)((double)this.m_rsinbuf[num22] * num21 + (double)this.m_rsinbuf[num22 + 1] * num20);
                    num7 += ratio;
                    num6++;
                }
            }
            else if (nch == 2)
            {
                while (num10-- != 0)
                {
                    int    num23 = (int)num7;
                    double num24 = num7 - (double)num23;
                    if (num23 >= num3 - 1)
                    {
                        break;
                    }
                    double num25 = 1.0 - num24;
                    int    num26 = num8 + num23 * 2;
                    outBuffer[num9]     = (float)((double)this.m_rsinbuf[num26] * num25 + (double)this.m_rsinbuf[num26 + 2] * num24);
                    outBuffer[num9 + 1] = (float)((double)this.m_rsinbuf[num26 + 1] * num25 + (double)this.m_rsinbuf[num26 + 3] * num24);
                    num9 += 2;
                    num7 += ratio;
                    num6++;
                }
            }
            else
            {
                while (num10-- != 0)
                {
                    int    num27 = (int)num7;
                    double num28 = num7 - (double)num27;
                    if (num27 >= num3 - 1)
                    {
                        break;
                    }
                    double num29 = 1.0 - num28;
                    int    num30 = nch;
                    int    num31 = num8 + num27 * nch;
                    while (num30-- != 0)
                    {
                        outBuffer[num9++] = (float)((double)this.m_rsinbuf[num31] * num29 + (double)this.m_rsinbuf[num31 + nch] * num28);
                        num31++;
                    }
                    num7 += ratio;
                    num6++;
                }
            }
            if (this.m_filtercnt > 0 && this.m_ratio < 1.0 && num6 > 0)
            {
                if (this.m_iirfilter == null)
                {
                    this.m_iirfilter = new WdlResampler.WDL_Resampler_IIRFilter();
                }
                int filtercnt2 = this.m_filtercnt;
                this.m_iirfilter.setParms(this.m_ratio * (double)this.m_filterpos, (double)this.m_filterq);
                int num32 = 0;
                for (int k = 0; k < nch; k++)
                {
                    for (int l = 0; l < filtercnt2; l++)
                    {
                        this.m_iirfilter.Apply(outBuffer, k, outBuffer, k, num6, nch, num32++);
                    }
                }
            }
            if (num6 > 0 && num3 > this.m_samples_in_rsinbuf)
            {
                double num33 = (num7 - (double)this.m_samples_in_rsinbuf + (double)num11) / ratio;
                if (num33 > 0.0)
                {
                    num6 -= (int)(num33 + 0.5);
                    if (num6 < 0)
                    {
                        num6 = 0;
                    }
                }
            }
            int num34 = (int)num7;

            this.m_fracpos             = num7 - (double)num34;
            this.m_samples_in_rsinbuf -= num34;
            if (this.m_samples_in_rsinbuf <= 0)
            {
                this.m_samples_in_rsinbuf = 0;
            }
            else
            {
                Array.Copy(this.m_rsinbuf, num8 + num34 * nch, this.m_rsinbuf, num8, this.m_samples_in_rsinbuf * nch);
            }
            return(num6);
        }