Exemplo n.º 1
0
        public IEncoder CreateEncoder(int threadNumber, IParallelTask _task)
        {
            if (_task is ReplayGainTask)
            {
                ReplayGainTask task = (ReplayGainTask)_task;
                return(new ReplayGainTagEncoder(task));
            }
            else if (_task is FileEncodeTask)
            {
                FileEncodeTask task        = (FileEncodeTask)_task;
                IAudioSource   audioSource = task.AudioSourceLazy();
                if (audioSource == null)
                {
                    throw new SkipEncodingItemException("Unsupported audio format.");
                }
                if (this.CalculateReplayGain)
                {
                    task.TrackGain = DspHelper.CreateTrackGain(audioSource);
                }
                if (this.CalculateDynamicRange)
                {
                    task.DrMeter = DspHelper.CreateDrMeter(audioSource);
                }
                return(new DspCalculatorEncoder(audioSource, task.TrackGain, task.DrMeter));
            }

            throw new NotSupportedException();
        }
Exemplo n.º 2
0
        public override void TryDeleteResult(IParallelTask _task)
        {
            FileEncodeTask task = (FileEncodeTask)_task;

            Utility.TryDeleteFile(task.TargetFilename);
            Utility.TryDeleteEmptyFoldersToTheRoot(Path.GetDirectoryName(task.TargetFilename));
        }
        private List<IParallelTask> GenerateReplayGainTasks(Release[] releases, IProgress<double> progress)
        {
            List<IParallelTask> tasks = new List<IParallelTask>();

            DspEncoderFactory replayGainFactory = new DspEncoderFactory(this.settingsManager.Settings.LocalConcurrencyLevel, true, false);

            double progressCoef = 1.0 / releases.Length;
            int processed = 0;
            foreach (Release release in releases)
            {
                ReplayGainTask rgTask = new ReplayGainTask(replayGainFactory, release, true, true, false);

                foreach (Track track in release.Tracklist)
                {
                    string filename = Path.Combine(this.CollectionManager.Settings.MusicDirectory, track.RelativeFilename);
                    var task = new FileEncodeTask(replayGainFactory, () => AudioHelper.GetAudioSourceForFile(filename), filename, null);

                    tasks.Add(task);
                    rgTask.AddItem(track, task);
                }

                tasks.Add(rgTask);

                ++processed;
                progress.Report(processed * progressCoef);
            }

            return tasks;
        }
Exemplo n.º 4
0
        private void ComputeReplayGain()
        {
            this.OnProgressChanged(new ProgressChangedEventArgs(0));

            if (this.replayGainTask.RecalculateReplayGain)
            {
                this.replayGainTask.AlbumGain = new AlbumGain();
                var albumGainData = this.replayGainTask.AlbumGain;

                for (int i = 0; i < trackTasks.Count; ++i)
                {
                    FileEncodeTask task = this.trackTasks[i].Task;
                    this.trackTasks[i].Track.ReplayGainTrackGain = task.TrackGain.GetGain();
                    this.trackTasks[i].Track.ReplayGainTrackPeak = task.TrackGain.GetPeak();
                    albumGainData.AppendTrackData(task.TrackGain);

                    this.OnProgressChanged(new ProgressChangedEventArgs((double)(i + 1) / trackTasks.Count / 2));
                }

                this.replayGainTask.Release.ReplayGainAlbumGain = albumGainData.GetGain();
                this.replayGainTask.Release.ReplayGainAlbumPeak = albumGainData.GetPeak();
            }

            if (this.replayGainTask.SaveDynamicRange)
            {
                foreach (ReplayGainTask.Item item in this.trackTasks)
                {
                    item.Track.DynamicRange = item.Task.DrMeter.GetDynamicRange();
                }
            }

            for (int i = 0; i < trackTasks.Count; ++i)
            {
                FileEncodeTask task  = this.trackTasks[i].Task;
                Track          track = this.trackTasks[i].Track;

                double trackGain = track.ReplayGainTrackGain;
                double trackPeak = this.replayGainTask.WritePeaks ? track.ReplayGainTrackPeak : double.NaN;
                double albumGain = this.replayGainTask.Release.ReplayGainAlbumGain;
                double albumPeak = this.replayGainTask.WritePeaks ? this.replayGainTask.Release.ReplayGainAlbumPeak : double.NaN;
                AudioFileTag.WriteReplayGainData(task.TargetFilename, trackGain, trackPeak, albumGain, albumPeak, true);

                this.OnProgressChanged(new ProgressChangedEventArgs(0.5 + (double)(i + 1) / trackTasks.Count / 2));
            }

            for (int i = 0; i < trackTasks.Count; ++i)
            {
                if (this.trackTasks[i].Task.TrackGain != null)
                {
                    this.trackTasks[i].Task.TrackGain.Dispose();
                }
            }
        }
 protected IAudioSource SetupTask(FileEncodeTask task)
 {
     IAudioSource audioSource = task.AudioSourceLazy();
     if (audioSource == null)
     {
         throw new SkipEncodingItemException("Audio source is not supported.");
     }
     if (this.CalculateRg)
     {
         task.TrackGain = DspHelper.CreateTrackGain(audioSource);
     }
     if (this.CalculateDr)
     {
         task.DrMeter = DspHelper.CreateDrMeter(audioSource);
     }
     return audioSource;
 }
Exemplo n.º 6
0
        public IEncoder CreateEncoder(int threadNumber, IParallelTask _task)
        {
            FileEncodeTask task        = (FileEncodeTask)_task;
            IAudioSource   audioSource = this.SetupTask(task);

            try
            {
                return(this.CreateEncoderInternal(threadNumber, task, audioSource));
            }
            catch
            {
                if (audioSource != null)
                {
                    audioSource.Close();
                }
                throw;
            }
        }
Exemplo n.º 7
0
        protected IAudioSource SetupTask(FileEncodeTask task)
        {
            IAudioSource audioSource = task.AudioSourceLazy();

            if (audioSource == null)
            {
                throw new SkipEncodingItemException("Audio source is not supported.");
            }
            if (this.CalculateRg)
            {
                task.TrackGain = DspHelper.CreateTrackGain(audioSource);
            }
            if (this.CalculateDr)
            {
                task.DrMeter = DspHelper.CreateDrMeter(audioSource);
            }
            return(audioSource);
        }
        protected override IEncoder CreateEncoderInternal(int threadNumber, FileEncodeTask task, IAudioSource audioSource)
        {
            if (threadNumber < this.concurrencylevel)
            {
                return new NativeFlacEncoder(audioSource, task.TargetFilename, task.Tag, compressionLevel, task.TrackGain, task.DrMeter);
            }

            threadNumber -= this.concurrencylevel;

            foreach (DiscoveryServerDescriptor server in this.servers)
            {
                if (threadNumber < server.ThreadCount)
                {
                    return new RemoteFlacEncoder(server.Address, audioSource, task.TargetFilename, task.Tag, this.compressionLevel, task.TrackGain, task.DrMeter);
                }
                threadNumber -= server.ThreadCount;
            }

            throw new ArgumentException("threadNumber is too large.");
        }
        protected override IEncoder CreateEncoderInternal(int threadNumber, FileEncodeTask task, IAudioSource audioSource)
        {
            if (threadNumber < this.localConcurrency)
            {
                return new LocalMp3Encoder(audioSource, task.TargetFilename, task.Tag, vbrQuality, task.TrackGain, task.DrMeter);
            }

            threadNumber -= Environment.ProcessorCount;

            foreach (DiscoveryServerDescriptor server in this.servers)
            {
                if (threadNumber < server.ThreadCount)
                {
                    return new RemoteMp3VbrEncoder(server.Address, audioSource, task.TargetFilename, task.Tag, this.vbrQuality, task.TrackGain, task.DrMeter);
                }
                threadNumber -= server.ThreadCount;
            }

            throw new ArgumentException("threadNumber is too large.");
        }
        private void GenerateDynamicRangeTasks(Release[] releases, IProgress<double> progress)
        {
            DspEncoderFactory replayGainFactory = new DspEncoderFactory(this.settingsManager.Settings.LocalConcurrencyLevel, false, true);

            double progressCoef = 1.0 / releases.Length;
            int processed = 0;
            foreach (Release release in releases)
            {
                foreach (Track track in release.Tracklist)
                {
                    string filename = Path.Combine(this.CollectionManager.Settings.MusicDirectory, track.RelativeFilename);
                    var task = new FileEncodeTask(replayGainFactory, () => AudioHelper.GetAudioSourceForFile(filename), filename, null);

                    this.trackToTask[track] = task;
                    this.tasks.Add(task);
                }

                ++processed;
                progress.Report(processed * progressCoef);
            }
        }
        private void btnSync_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            bool successfullyDeletedFiles = true;
            foreach (string fileToDelete in this.scanResult.FilesToDelete)
            {
                successfullyDeletedFiles = Utility.TryDeleteFile(fileToDelete) && successfullyDeletedFiles;
                successfullyDeletedFiles = Utility.TryDeleteEmptyFoldersToTheRoot(Path.GetDirectoryName(fileToDelete)) && successfullyDeletedFiles;
            }
            if (!successfullyDeletedFiles)
            {
                Dialogs.Inform("Some files or folders were not successfully deleted. Please unlock them and rerun the sync.");
            }

            if (this.scanResult.ReleasesToEncode.Count > 0)
            {
                int localConcurrencyLevel = this.SettingsManager.Settings.ActualLocalConcurrencyLevel;

                IEncoderFactory encoderFactory;
                if (this.CollectionManager.Settings.NetworkEncoding)
                {
                    encoderFactory = new RemoteMp3EncoderFactory(this.networkBox.Servers, this.encodingTarget.Mp3Settings.VbrQuality, localConcurrencyLevel, false, false);
                }
                else
                {
                    encoderFactory = new LocalMp3EncoderFactory(this.encodingTarget.Mp3Settings.VbrQuality, localConcurrencyLevel, false, false);
                }

                IEncoderFactory replayGainFactory = new DspEncoderFactory(this.SettingsManager.Settings.ActualLocalConcurrencyLevel, false, false);

                List<IParallelTask> tasks = new List<IParallelTask>();
                foreach (var release in this.scanResult.ReleasesToEncode)
                {
                    var rgTask = new ReplayGainTask(replayGainFactory, release, false, false, false);

                    if (!release.Tracklist.All(t => AudioHelper.IsSupportedAudioSource(t.RelativeFilename)))
                    {
                        continue;
                    }

                    foreach (Track track in release.Tracklist)
                    {
                        string sourceFilename = Path.Combine(this.CollectionManager.Settings.MusicDirectory, track.RelativeFilename);

                        string targetRelativeFilename = FilenameGenerator.PatternToFilename(this.encodingTarget.FileNamingPattern, release, track) + this.encodingTarget.Extension;
                        string targetFilename = Path.Combine(this.encodingTarget.TargetDirectory, targetRelativeFilename);

                        AudioFileTag tag = new AudioFileTag(release, track);

                        FileEncodeTask encodeTask = new FileEncodeTask(
                            encoderFactory,
                            () => AudioHelper.GetAudioSourceForFile(sourceFilename),
                            targetFilename,
                            tag
                            );

                        encodeTask.ProgressChanged += (_sender, _e) =>
                        {
                            if (encodeTask.Status == EncodeTaskStatus.Completed)
                            {
                                FileInfo originalFileInfo = new FileInfo(sourceFilename);
                                File.SetCreationTime(targetFilename, originalFileInfo.CreationTime);
                                File.SetLastWriteTime(targetFilename, originalFileInfo.LastWriteTime);
                                File.SetLastAccessTime(targetFilename, originalFileInfo.LastAccessTime);
                            }
                        };

                        tasks.Add(encodeTask);
                        rgTask.AddItem(track, encodeTask);
                    }

                    tasks.Add(rgTask);
                }

                int concurrency = Math.Max(encoderFactory.ThreadCount, replayGainFactory.ThreadCount);
                EncoderController controller = new EncoderController(tasks.ToArray(), concurrency);
                controller.DeleteSuccessfullyEncodedItemsIfFailure = false;
                EncodingWindow window = new EncodingWindow(controller);
                window.ShowDialog(this);
            }

            this.Close();
        }
Exemplo n.º 12
0
 protected override IEncoder CreateEncoderInternal(int threadNumber, FileEncodeTask task, IAudioSource audioSource)
 {
     return(new CueToolsFlacEncoder(audioSource, task.TargetFilename, task.Tag, 8, task.TrackGain, task.DrMeter));
 }
Exemplo n.º 13
0
 protected abstract IEncoder CreateEncoderInternal(int threadNumber, FileEncodeTask task, IAudioSource audioSource);
        private void OKCancelBox_OKClicked(object sender, EventArgs e)
        {
            this.release.DateAudioModified = DateTime.Now;

            IEncoderFactory encoderFactory;
            if (this.CollectionManager.Settings.NetworkEncoding)
            {
                encoderFactory = new RemoteFlacEncoderFactory(this.networkBox.Servers, 8, this.SettingsManager.Settings.ActualLocalConcurrencyLevel, true, true);
            }
            else
            {
                encoderFactory = new NativeFlacEncoderFactory(8, this.SettingsManager.Settings.ActualLocalConcurrencyLevel, true, true);
            }

            IEncoderFactory replayGainFactory = new DspEncoderFactory(this.SettingsManager.Settings.ActualLocalConcurrencyLevel, true, true);

            ReplayGainTask rgTask = new ReplayGainTask(replayGainFactory, this.release, true, true, true);

            List<IParallelTask> tasks = new List<IParallelTask>();
            for (int i = 0; i < this.items.Count; ++i)
            {
                Track track = this.release.Tracklist[i];
                IImportSourceItem importSourceItem = this.items[i];

                track.RelativeFilename = FilenameGenerator.PatternToFilename(
                        this.CollectionManager.Settings.FileNamingPattern,
                        this.release, track) + ".flac";

                AudioFileTag tag = new AudioFileTag(this.release, track);

                string filename = Path.Combine(this.CollectionManager.Settings.MusicDirectory, track.RelativeFilename);

                var task = new FileEncodeTask(
                    encoderFactory,
                    () => importSourceItem.GetAudioSource(),
                    filename,
                    tag
                    );
                tasks.Add(task);
                rgTask.AddItem(track, task);
            }

            tasks.Add(rgTask);

            int concurrency = Math.Max(encoderFactory.ThreadCount, replayGainFactory.ThreadCount);
            EncoderController controller = new EncoderController(tasks.ToArray(), concurrency);
            EncodingWindow window = new EncodingWindow(controller);
            if (window.ShowDialog(this) == true)
            {
                this.release.UpdateDynamicProperties();
                this.CollectionManager.Save(this.release);

                this.Close();
            }

            CollectionManagerGlobal.OnCollectionChanged();
        }
 protected override IEncoder CreateEncoderInternal(int threadNumber, FileEncodeTask task, IAudioSource audioSource)
 {
     return new NativeFlacEncoder(audioSource, task.TargetFilename, task.Tag, this.CompressionLevel, task.TrackGain, task.DrMeter);
 }
 protected override IEncoder CreateEncoderInternal(int threadNumber, FileEncodeTask task, IAudioSource audioSource)
 {
     return new LocalMp3Encoder(audioSource, task.TargetFilename, task.Tag, this.VbrQuality, task.TrackGain, task.DrMeter);
 }
Exemplo n.º 17
0
 public Item(Track track, FileEncodeTask task)
 {
     this.Track = track;
     this.Task  = task;
 }
        private void OKCancelBox_OKClicked(object sender, System.EventArgs e)
        {
            this.UpdateRelease();

            IEncoderFactory encoderFactory;
            if (this.CollectionManager.Settings.NetworkEncoding)
            {
                encoderFactory = new RemoteFlacEncoderFactory(this.networkBox.Servers, 8, this.SettingsManager.Settings.ActualLocalConcurrencyLevel, true, true);
            }
            else
            {
                encoderFactory = new NativeFlacEncoderFactory(8, this.SettingsManager.Settings.ActualLocalConcurrencyLevel, true, true);
            }

            IEncoderFactory replayGainFactory = new DspEncoderFactory(this.SettingsManager.Settings.ActualLocalConcurrencyLevel, true, true);

            ReplayGainTask rgTask = new ReplayGainTask(replayGainFactory, this.DatabaseRelease, true, true, true);

            List<IParallelTask> tasks = new List<IParallelTask>();
            foreach (Track track in this.DatabaseRelease.Tracklist)
            {
                track.RelativeFilename = FilenameGenerator.PatternToFilename(
                        this.CollectionManager.Settings.FileNamingPattern,
                        this.DatabaseRelease, track) + ".flac";

                AudioFileTag tag = new AudioFileTag(this.DatabaseRelease, track);
                IImportSourceItem sourceItem = this.Release.Discs[track.Disc - 1][track.Position - 1].SourceItem;

                string filename = Path.Combine(this.CollectionManager.Settings.MusicDirectory, track.RelativeFilename);

                var task = new FileEncodeTask(
                    encoderFactory,
                    () => sourceItem.GetAudioSource(),
                    filename,
                    tag
                    );
                tasks.Add(task);
                rgTask.AddItem(track, task);
            }

            tasks.Add(rgTask);

            int concurrency = Math.Max(encoderFactory.ThreadCount, replayGainFactory.ThreadCount);
            EncoderController controller = new EncoderController(tasks.ToArray(), concurrency);
            EncodingWindow window = new EncodingWindow(controller);
            if (window.ShowDialog(this) == true)
            {
                this.DatabaseRelease.UpdateDynamicProperties();

                this.CollectionManager.Save(this.DatabaseRelease);
                this.InsertedReleaseId = this.DatabaseRelease.Id;

                this.imagesEditor.WriteFiles();

                CollectionManagerGlobal.OnCollectionChanged();

                this.completed = true;
                this.DialogResult = true;
            }
        }
Exemplo n.º 19
0
 public void AddItem(Track track, FileEncodeTask task)
 {
     this.TrackTasks.Add(new Item(track, task));
 }
Exemplo n.º 20
0
 public Item(Track track, FileEncodeTask task)
 {
     this.Track = track;
     this.Task = task;
 }
Exemplo n.º 21
0
 public void AddItem(Track track, FileEncodeTask task)
 {
     this.TrackTasks.Add(new Item(track, task));
 }
 protected override IEncoder CreateEncoderInternal(int threadNumber, FileEncodeTask task, IAudioSource audioSource)
 {
     return new CueToolsFlacEncoder(audioSource, task.TargetFilename, task.Tag, 8, task.TrackGain, task.DrMeter);
 }
Exemplo n.º 23
0
 protected abstract IEncoder CreateEncoderInternal(int threadNumber, FileEncodeTask task, IAudioSource audioSource);