Esempio n. 1
0
        /// <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;
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
 public static extern InteropWrapper.SoxrQualitySpec soxr_quality_spec(QualityRecipe recipe, QualityFlags flags);