}// -----------------------------------------

        // Qucikly set :
        // + storedFileName
        // + workingFile
        void setupFiles(string ext)
        {
            track.storedFileName = track.getTrackName() + ext;

            if (p.flag_convert_only)
            {
                // Convert files to output folder directly
                track.workingFile = Path.Combine(jobData.outputDir, track.storedFileName);
            }
            else
            {
                // Convert files to temp folder, since they are going to be archived later
                track.workingFile = Path.Combine(jobData.tempDir, track.storedFileName);
            }
        }// -----------------------------------------
        }// -----------------------------------------

        // --
        public override void start()
        {
            base.start();

            p = (CrushParams)jobData;

            // Working file is already set and points to either TEMP or INPUT folder
            trackFile = track.workingFile;

            // Before compressing the tracks, get and store the MD5 of the track
            using (var md5 = System.Security.Cryptography.MD5.Create())
            {
                using (var str = File.OpenRead(trackFile))
                {
                    track.md5 = BitConverter.ToString(md5.ComputeHash(str)).Replace("-", "").ToLower();
                }
            }

            // --
            if (track.isData)
            {
                var ecm = new EcmTools(CDCRUSH.TOOLS_PATH);
                ecm.onComplete = (s) => {
                    if (s)
                    {
                        deleteOldFile();
                        complete();
                    }
                    else
                    {
                        fail(msg: ecm.ERROR);
                    }
                };

                // In case the task ends abruptly
                killExtra = () => ecm.kill();

                // New filename that is going to be generated:
                track.storedFileName = track.getTrackName() + ".bin.ecm";
                track.workingFile    = Path.Combine(jobData.tempDir, track.storedFileName);
                ecm.ecm(trackFile, track.workingFile); // old .bin file from wherever it was to temp/bin.ecm
            }
            else                                       // AUDIO TRACK :
            {
                var ffmp = new FFmpeg(CDCRUSH.FFMPEG_PATH);
                ffmp.onComplete = (s) => {
                    if (s)
                    {
                        deleteOldFile();
                        complete();
                    }
                    else
                    {
                        fail(msg: ffmp.ERROR);
                    }
                };

                // In case the task ends abruptly
                killExtra = () => ffmp.kill();

                // Cast for easy coding
                Tuple <int, int> audioQ = jobData.audioQuality;

                switch (audioQ.Item1)
                {
                case 0:                 // FLAC
                    track.storedFileName = track.getTrackName() + ".flac";
                    track.workingFile    = Path.Combine(jobData.tempDir, track.storedFileName);
                    ffmp.audioPCMToFlac(trackFile, track.workingFile);
                    break;

                case 1:                 // VORBIS
                    track.storedFileName = track.getTrackName() + ".ogg";
                    track.workingFile    = Path.Combine(jobData.tempDir, track.storedFileName);
                    ffmp.audioPCMToOggVorbis(trackFile, audioQ.Item2, track.workingFile);
                    break;

                case 2:                 // OPUS
                    track.storedFileName = track.getTrackName() + ".ogg";
                    track.workingFile    = Path.Combine(jobData.tempDir, track.storedFileName);
                    ffmp.audioPCMToOggOpus(trackFile, CDCRUSH.OPUS_QUALITY[audioQ.Item2], track.workingFile);
                    break;
                } //- end switch
            }     //- end if (track.isData)
        }// -----------------------------------------