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; } }
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); }