/// <summary>
        /// Initializes a new instance of the <see cref="ChromaContext" /> class.
        /// </summary>
        /// <param name="algorithm">The algorithm to use, see <see cref="ChromaprintAlgorithm" /> (default = TEST2)</param>
        public ChromaContext(ChromaprintAlgorithm algorithm)
        {
            this.algorithm = (int)algorithm;

            var config = FingerprinterConfiguration.CreateConfiguration(algorithm);

            this.fingerprinter = new Fingerprinter(config);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="ChromaContext" /> class.
        /// </summary>
        /// <param name="algorithm">The algorithm to use, see <see cref="ChromaprintAlgorithm" /> (default = TEST2)</param>
        /// <param name="fftService">The FFT service.</param>
        public ChromaContext(ChromaprintAlgorithm algorithm, IFFTService fftService)
        {
            this.Algorithm  = (int)algorithm;
            this.fftService = fftService;

            var config = FingerprinterConfiguration.CreateConfiguration(algorithm);

            this.fingerprinter = new Fingerprinter(config, fftService);
        }
        public static FingerprinterConfiguration CreateConfiguration(ChromaprintAlgorithm algorithm)
        {
            switch (algorithm)
            {
                case ChromaprintAlgorithm.TEST1:
                    return new FingerprinterConfigurationTest1();
                case ChromaprintAlgorithm.TEST2:
                    return new FingerprinterConfigurationTest2();
                case ChromaprintAlgorithm.TEST3:
                    return new FingerprinterConfigurationTest3();
                case ChromaprintAlgorithm.TEST4:
                    return new FingerprinterConfigurationTest4();
            }

            return null;
        }
        public static FingerprinterConfiguration CreateConfiguration(ChromaprintAlgorithm algorithm)
        {
            switch (algorithm)
            {
            case ChromaprintAlgorithm.TEST1:
                return(new FingerprinterConfigurationTest1());

            case ChromaprintAlgorithm.TEST2:
                return(new FingerprinterConfigurationTest2());

            case ChromaprintAlgorithm.TEST3:
                return(new FingerprinterConfigurationTest3());

            case ChromaprintAlgorithm.TEST4:
                return(new FingerprinterConfigurationTest4());
            }

            return(null);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="NativeChromaContext" /> class.
        /// </summary>
        /// <param name="algorithm">The algorithm to use, see <see cref="ChromaprintAlgorithm" /> (default = TEST2)</param>
        public NativeChromaContext(ChromaprintAlgorithm algorithm)
        {
            this.Algorithm = (int)algorithm;

            ctx = NativeMethods.chromaprint_new(this.Algorithm);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="ChromaContext" /> class.
 /// </summary>
 /// <param name="algorithm">The algorithm to use, see <see cref="ChromaprintAlgorithm" /> (default = TEST2)</param>
 public ChromaContext(ChromaprintAlgorithm algorithm)
     : this(ChromaprintAlgorithm.TEST2, new LomontFFTService())
 {
 }