/// <summary> /// Creates a new resampler with the supplied quality parameters. /// /// Can be used to create a variable-rate resampler by supplying SOXR_HQ as recipe /// and SOXR_VR as flag. For a variable resampler, inputRate/outputRate must equate /// to the maximum IO ratio that will be set by calling SetRatio. To set the initial /// ratio, call SetRatio with a transitionLength of 0 on the created instance. /// </summary> /// <param name="inputRate"></param> /// <param name="outputRate"></param> /// <param name="channels"></param> /// <param name="qualityRecipe"></param> /// <param name="qualityFlags"></param> /// <exception cref="SoxrException">when parameters are incorrect; see error message for details</exception> public SoxResampler(double inputRate, double outputRate, int channels, QualityRecipe qualityRecipe, QualityFlags qualityFlags) { if (inputRate <= 0 || outputRate <= 0 || channels <= 0) { throw new SoxrException("one or more parameters are invalid (zero or negative)"); } SoxrError error = SoxrError.Zero; // Apply the default configuration as per soxr.c InteropWrapper.SoxrIoSpec ioSpec = InteropWrapper.soxr_io_spec(Datatype.SOXR_FLOAT32_I, Datatype.SOXR_FLOAT32_I); InteropWrapper.SoxrQualitySpec qSpec = InteropWrapper.soxr_quality_spec(qualityRecipe, qualityFlags); InteropWrapper.SoxrRuntimeSpec rtSpec = InteropWrapper.soxr_runtime_spec(1); if (qualityFlags == QualityFlags.SOXR_VR) { if (qualityRecipe != QualityRecipe.SOXR_HQ) { throw new SoxrException("Invalid parameters: variable rate resampling only works with the HQ recipe"); } variableRate = true; maxRatio = inputRate / outputRate; } soxr = InteropWrapper.soxr_create(inputRate, outputRate, (uint)channels, out error, ref ioSpec, ref qSpec, ref rtSpec); if (error != SoxrError.Zero) { throw new SoxrException(GetError(error)); } this.channels = channels; }
public Resampler(ResamplingQuality quality, int channels, double sampleRateRatio) { Quality = quality; Channels = channels; Ratio = sampleRateRatio; QualityRecipe qr = QualityRecipe.SOXR_HQ; QualityFlags qf = QualityFlags.SOXR_ROLLOFF_SMALL; switch (quality) { case ResamplingQuality.VeryLow: qr = QualityRecipe.SOXR_QQ; break; case ResamplingQuality.Low: qr = QualityRecipe.SOXR_LQ; break; case ResamplingQuality.Medium: qr = QualityRecipe.SOXR_MQ; break; case ResamplingQuality.High: qr = QualityRecipe.SOXR_HQ; break; case ResamplingQuality.VeryHigh: qr = QualityRecipe.SOXR_VHQ; break; case ResamplingQuality.VariableRate: qr = QualityRecipe.SOXR_HQ; qf = QualityFlags.SOXR_VR; break; } double inputRate = 1; double outputRate = sampleRateRatio; if (qf == QualityFlags.SOXR_VR) { // set max variable rate inputRate = 10.0; outputRate = 1.0; } _soxr = new SoxResampler(inputRate, outputRate, channels, qr, qf); }
public static extern InteropWrapper.SoxrQualitySpec soxr_quality_spec(QualityRecipe recipe, QualityFlags flags);