예제 #1
0
        public Resampler(ResamplingQuality quality, int channels, double sampleRateRatio)
        {
            Quality  = quality;
            Channels = channels;
            Ratio    = sampleRateRatio;

            ConverterType ct = ConverterType.SRC_ZERO_ORDER_HOLD;

            switch (quality)
            {
            case ResamplingQuality.VeryLow:
                ct = ConverterType.SRC_ZERO_ORDER_HOLD; break;

            case ResamplingQuality.Low:
                ct = ConverterType.SRC_LINEAR; break;

            case ResamplingQuality.Medium:
                ct = ConverterType.SRC_SINC_FASTEST; break;

            case ResamplingQuality.High:
                ct = ConverterType.SRC_SINC_MEDIUM_QUALITY; break;

            case ResamplingQuality.VeryHigh:
                ct = ConverterType.SRC_SINC_BEST_QUALITY; break;

            case ResamplingQuality.VariableRate:
                ct = ConverterType.SRC_SINC_MEDIUM_QUALITY; break;
            }

            _src = new SampleRateConverter(ct, channels);
            _src.SetRatio(sampleRateRatio);
        }
예제 #2
0
        public static IResampler CreateInstance(ResamplingQuality quality, int channels, double sampleRateRatio)
        {
            if (Factory == null)
            {
                throw new NotSupportedException("Cannot create instance because no factory has been set.");
            }

            return(Factory.CreateInstance(quality, channels, sampleRateRatio));
        }
예제 #3
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);
        }
예제 #4
0
        public ResamplingStream(IAudioStream sourceStream, ResamplingQuality quality)
            : base(sourceStream)
        {
            if (!(sourceStream.Properties.Format == AudioFormat.IEEE && sourceStream.Properties.BitDepth == 32))
            {
                throw new ArgumentException("unsupported source format: " + sourceStream.Properties);
            }

            properties = new AudioProperties(sourceStream.Properties.Channels, sourceStream.Properties.SampleRate,
                                             sourceStream.Properties.BitDepth, sourceStream.Properties.Format);

            this.quality = quality;
            SetupResampler();

            sourceBuffer = new ByteBuffer();

            TargetSampleRate = properties.SampleRate;

            position = 0;
        }
예제 #5
0
        public NAudioWdlResampler(ResamplingQuality quality, int channels, double sampleRateRatio)
        {
            Quality  = quality;
            Channels = channels;
            Ratio    = sampleRateRatio;

            _resampler = new NAudioWdlResamplerWrapper();

            // TODO apply fitting configuration settings for the different quality levels
            switch (quality)
            {
            case ResamplingQuality.VeryLow:
                break;

            case ResamplingQuality.Low:
                break;

            case ResamplingQuality.Medium:
                break;

            case ResamplingQuality.High:
                break;

            case ResamplingQuality.VeryHigh:
                break;

            case ResamplingQuality.VariableRate:
                break;
            }

            // Config in NAudio: https://github.com/naudio/NAudio/blob/master/NAudio/Wave/SampleProviders/WdlResamplingSampleProvider.cs
            _resampler.SetMode(true, 2, false);
            _resampler.SetFilterParms();
            _resampler.SetFeedMode(true);
            // Set input sample rate to 1 because we do not know the actual sample rates in here, only the desired output ratio
            // The actual sample rates should be irrelevant anyway, the only thing that counts is the ratio between input and putput
            _resampler.SetRates(1, sampleRateRatio);
        }
예제 #6
0
 public IResampler CreateInstance(ResamplingQuality quality, int channels, double sampleRateRatio)
 {
     return(new NAudioWdlResampler(quality, channels, sampleRateRatio));
 }
예제 #7
0
 public ResamplingStream(IAudioStream sourceStream, ResamplingQuality quality, double sampleRateRatio)
     : this(sourceStream, quality)
 {
     SampleRateRatio = sampleRateRatio;
 }
예제 #8
0
 public ResamplingStream(IAudioStream sourceStream, ResamplingQuality quality, int outputSampleRate)
     : this(sourceStream, quality)
 {
     TargetSampleRate = outputSampleRate;
 }
 public virtual void setResamplingQuality(ResamplingQuality resamplingQuality)
 {
     this.resamplingQuality = resamplingQuality;
 }
 /// <summary>
 /// Create a new configuration with default values.
 /// </summary>
 public AudioConfiguration()
 {
     resamplingQuality   = ResamplingQuality.LOW;
     opusEncodingQuality = OPUS_QUALITY_MAX;
     outputFormat        = StandardAudioDataFormats.DISCORD_OPUS;
 }