示例#1
0
        public void RenderToFiles(UProject project)
        {
            FileInfo         ResamplerFile = new FileInfo(PathManager.Inst.GetExportEnginePath());
            IResamplerDriver driver        = ResamplerDriver.ResamplerDriver.Load(ResamplerFile.FullName);

            if (driver == null)
            {
                return;
            }
            StopPreRender();
            Task.Run(() => {
                var task = Task.Run(() => {
                    RenderEngine engine = new RenderEngine(project, driver, cache);
                    var trackMixes      = engine.RenderTracks();
                    for (int i = 0; i < trackMixes.Count; ++i)
                    {
                        var file = PathManager.Inst.GetExportPath(project.FilePath, i + 1);
                        DocManager.Inst.ExecuteCmd(new ProgressBarNotification(0, $"Exporting to {file}."));
                        WaveFileWriter.CreateWaveFile16(file, new ExportAdapter(trackMixes[i]));
                        DocManager.Inst.ExecuteCmd(new ProgressBarNotification(0, $"Exported to {file}."));
                    }
                });
                try {
                    task.Wait();
                } catch (AggregateException ae) {
                    foreach (var e in ae.Flatten().InnerExceptions)
                    {
                        Log.Error(e, "Failed to render.");
                    }
                }
            });
        }
示例#2
0
 void Resample(RenderItem item)
 {
     byte[] data = null;
     try {
         uint hash = item.HashParameters();
         data = cache.Get(hash);
         if (data == null)
         {
             CopySourceTemp(item);
             if (!resamplers.TryGetValue(item.ResamplerName, out var driver))
             {
                 driver = this.driver;
             }
             data = driver.DoResampler(DriverModels.CreateInputModel(item, 0), Log.Logger);
             if (data == null || data.Length == 0)
             {
                 throw new Exception("Empty render result.");
             }
             cache.Put(hash, data);
             Log.Information($"Sound {hash:x} {item.Oto.Alias} {item.GetResamplerExeArgs()} resampled.");
             CopyBackMetaFiles(item);
         }
     } catch (Exception e) {
         Log.Error(e, $"Failed to render item {item.SourceFile} {item.Oto.Alias} {item.GetResamplerExeArgs()}.");
     } finally {
         item.Data = data ?? new byte[0];
         item.OnComplete?.Invoke(item.Data);
         item.progress?.CompleteOne($"Resampling \"{item.phonemeName}\"");
     }
 }
示例#3
0
        private void Render(UProject project, int tick)
        {
            IResamplerDriver driver = GetPreviewDriver();

            if (driver == null)
            {
                return;
            }
            StopPreRender();
            var scheduler = TaskScheduler.FromCurrentSynchronizationContext();

            Task.Run(() => {
                RenderEngine engine = new RenderEngine(project, driver, cache, tick);
                var result          = engine.RenderProject(tick);
                faders     = result.Item2;
                var source = result.Item3;
                source     = Interlocked.Exchange(ref playbakCancellationTokenSource, source);
                if (source != null)
                {
                    source.Cancel();
                    Log.Information("Cancelling previous render");
                }
                StartPlayback(project.TickToMillisecond(tick), result.Item1);
            }).ContinueWith((task) => {
                if (task.IsFaulted)
                {
                    Log.Information($"{task.Exception}");
                    DocManager.Inst.ExecuteCmd(new UserMessageNotification(task.Exception.ToString()));
                    throw task.Exception;
                }
            }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
        }
示例#4
0
        private void Render(UProject project)
        {
            FileInfo         ResamplerFile = new FileInfo(PathManager.Inst.GetPreviewEnginePath());
            IResamplerDriver driver        = ResamplerDriver.ResamplerDriver.Load(ResamplerFile.FullName);

            if (driver == null)
            {
                return;
            }
            Task.Run(() => {
                var task = Task.Run(async() => {
                    RenderEngine engine = new RenderEngine(project, driver, cache);
                    renderTask          = engine.RenderAsync();
                    trackSources        = await renderTask;
                    StartPlayback();
                    renderTask = null;
                });
                try {
                    task.Wait();
                } catch (AggregateException ae) {
                    foreach (var e in ae.Flatten().InnerExceptions)
                    {
                        Log.Error(e, "Failed to render.");
                    }
                }
            });
        }
示例#5
0
        public static IResamplerDriver LoadEngine(string FilePath)
        {
            IResamplerDriver ret = null;

            if (System.IO.File.Exists(FilePath))
            {
                if (Path.GetExtension(FilePath).ToLower() == ".exe")
                {
                    ret = new ExeDriver(FilePath);
                }
                else if (Path.GetExtension(FilePath).ToLower() == ".dll")
                {
                    CppDriver retcpp = new CppDriver(FilePath);
                    if (retcpp.isLegalPlugin)
                    {
                        ret = retcpp;
                    }
                    else
                    {
                        SharpDriver retnet = new SharpDriver(FilePath);
                        if (retnet.isLegalPlugin)
                        {
                            ret = retnet;
                        }
                    }
                }
            }
            return(ret);
        }
 public void ResamplePart(UVoicePart part, UProject project, IResamplerDriver engine, Action<SequencingSampleProvider> resampleDoneCallback)
 {
     this.resampleDoneCallback = resampleDoneCallback;
     BackgroundWorker worker = new BackgroundWorker();
     worker.WorkerReportsProgress = true;
     worker.DoWork += worker_DoWork;
     worker.RunWorkerCompleted += worker_RunWorkerCompleted;
     worker.ProgressChanged += worker_ProgressChanged;
     worker.RunWorkerAsync(new Tuple<UVoicePart, UProject, IResamplerDriver>(part, project, engine));
 }
示例#7
0
 public RenderEngine(UProject project, IResamplerDriver driver, RenderCache cache, int startTick = 0)
 {
     this.project   = project;
     this.driver    = driver;
     this.cache     = cache;
     this.startTick = startTick;
     resamplers     = ResamplerDriver.ResamplerDriver
                      .Search(PathManager.Inst.GetEngineSearchPath())
                      .ToDictionary(resampler => resampler.GetInfo().Name, resampler => resampler);
 }
示例#8
0
        public void ResamplePart(UVoicePart part, UProject project, IResamplerDriver engine, Action <SequencingSampleProvider> resampleDoneCallback)
        {
            this.resampleDoneCallback = resampleDoneCallback;
            BackgroundWorker worker = new BackgroundWorker();

            worker.WorkerReportsProgress = true;
            worker.DoWork             += worker_DoWork;
            worker.RunWorkerCompleted += worker_RunWorkerCompleted;
            worker.ProgressChanged    += worker_ProgressChanged;
            worker.RunWorkerAsync(new Tuple <UVoicePart, UProject, IResamplerDriver>(part, project, engine));
        }
        private List<RenderItem> RenderAsync(UVoicePart part, UProject project, IResamplerDriver engine, BackgroundWorker worker)
        {
            List<RenderItem> renderItems = new List<RenderItem>();
            System.Diagnostics.Stopwatch watch = new Stopwatch();
            watch.Start();
            System.Diagnostics.Debug.WriteLine("Resampling start");
            lock (part)
            {
                string cacheDir = PathManager.Inst.GetCachePath(project.FilePath);
                string[] cacheFiles = Directory.EnumerateFiles(cacheDir).ToArray();
                int count = 0, i = 0;
                foreach (UNote note in part.Notes) foreach (UPhoneme phoneme in note.Phonemes) count++;

                foreach (UNote note in part.Notes)
                {
                    foreach (UPhoneme phoneme in note.Phonemes)
                    {
                        RenderItem item = BuildRenderItem(phoneme, part, project);
                        var sound = RenderCache.Inst.Get(item.HashParameters());

                        if (sound == null)
                        {
                            string cachefile = Path.Combine(cacheDir, string.Format("{0:x}.wav", item.HashParameters()));
                            if (!cacheFiles.Contains(cachefile))
                            {
                                System.Diagnostics.Debug.WriteLine("Sound {0:x} resampling {1}", item.HashParameters(), item.GetResamplerExeArgs());
                                DriverModels.EngineInput engineArgs = DriverModels.CreateInputModel(item, 0);
                                System.IO.Stream output = engine.DoResampler(engineArgs);
                                sound = new CachedSound(output);
                            }
                            else
                            {
                                System.Diagnostics.Debug.WriteLine("Sound {0:x} found on disk {1}", item.HashParameters(), item.GetResamplerExeArgs());
                                sound = new CachedSound(cachefile);
                            }
                            RenderCache.Inst.Put(item.HashParameters(), sound, engine.GetInfo().ToString());
                        }
                        else System.Diagnostics.Debug.WriteLine("Sound {0} found in cache {1}", item.HashParameters(), item.GetResamplerExeArgs());

                        item.Sound = sound;
                        renderItems.Add(item);
                        worker.ReportProgress(100 * ++i / count, string.Format("Resampling \"{0}\" {1}/{2}", phoneme.Phoneme, i, count));
                    }
                }
            }
            watch.Stop();
            System.Diagnostics.Debug.WriteLine("Resampling end");
            System.Diagnostics.Debug.WriteLine("Total cache size {0:n0} bytes", RenderCache.Inst.TotalMemSize);
            System.Diagnostics.Debug.WriteLine("Total time {0} ms", watch.Elapsed.TotalMilliseconds);
            return renderItems;
        }
示例#10
0
 private IResamplerDriver GetPreviewDriver()
 {
     lock (previewDriverLockObj) {
         var resamplerPath = PathManager.Inst.GetPreviewEnginePath();
         if (resamplerPath == resamplerSelected)
         {
             return(previewDriver);
         }
         FileInfo resamplerFile = new FileInfo(resamplerPath);
         previewDriver     = ResamplerDriver.ResamplerDriver.Load(resamplerFile.FullName);
         resamplerSelected = resamplerPath;
         return(previewDriver);
     }
 }
        private List <RenderItem> RenderAsync(UVoicePart part, UProject project, IResamplerDriver engine, BackgroundWorker worker)
        {
            var renderItems = new List <RenderItem>();
            var watch       = new Stopwatch();

            watch.Start();
            Log.Information("Resampling start.");
            lock (part) {
                var cacheDir = PathManager.Inst.GetCachePath(project.FilePath);
                var cacheFiles = Directory.EnumerateFiles(cacheDir).ToArray();
                int count = 0, i = 0;
                foreach (var note in part.Notes)
                {
                    foreach (var phoneme in note.Phonemes)
                    {
                        count++;
                    }
                }

                foreach (var note in part.Notes)
                {
                    foreach (var phoneme in note.Phonemes)
                    {
                        if (string.IsNullOrEmpty(phoneme.Oto.File))
                        {
                            Log.Warning($"Cannot find phoneme in note {note.Lyric}");
                            continue;
                        }

                        var item = new RenderItem(phoneme, part, project);

                        //System.Diagnostics.Debug.WriteLine("Sound {0:x} resampling {1}", item.HashParameters(), item.GetResamplerExeArgs());
                        var engineArgs = DriverModels.CreateInputModel(item, 0);
                        var output     = engine.DoResampler(engineArgs);
                        item.Sound = MemorySampleProvider.FromStream(output);
                        output.Dispose();
                        renderItems.Add(item);
                        worker.ReportProgress(100 * ++i / count, $"Resampling \"{phoneme.Phoneme}\" {i}/{count}");
                    }
                }
            }
            watch.Stop();
            Log.Information($"Resampling end, total time {watch.Elapsed}");
            return(renderItems);
        }
示例#12
0
        private void BuildAudio(UProject project)
        {
            trackSources = new List <TrackSampleProvider>();
            foreach (UTrack track in project.Tracks)
            {
                trackSources.Add(new TrackSampleProvider()
                {
                    Volume = DecibelToVolume(track.Volume), Pan = track.Pan
                });
            }
            pendingParts = project.Parts.Count;
            foreach (UPart part in project.Parts)
            {
                if (part is UWavePart)
                {
                    lock (lockObject)
                    {
                        trackSources[part.TrackNo].AddSource(
                            BuildWavePartAudio(part as UWavePart, project),
                            TimeSpan.FromMilliseconds(project.TickToMillisecond(part.PosTick))
                            );
                        pendingParts--;
                    }
                }
                else
                {
                    var singer = project.Tracks[part.TrackNo].Singer;
                    if (singer != null && singer.Loaded)
                    {
                        FileInfo         ResamplerFile = new FileInfo(PathManager.Inst.GetPreviewEnginePath());
                        IResamplerDriver engine        = ResamplerDriver.ResamplerDriver.LoadEngine(ResamplerFile.FullName);
                        BuildVoicePartAudio(part as UVoicePart, project, engine);
                    }
                    else
                    {
                        lock (lockObject) { pendingParts--; }
                    }
                }
            }

            if (pendingParts == 0)
            {
                StartPlayback();
            }
        }
示例#13
0
 public RenderEngine(UProject project, IResamplerDriver driver)
 {
     this.project = project;
     this.driver  = driver;
 }
示例#14
0
 public RenderEngine(UProject project, IResamplerDriver driver, RenderCache cache)
 {
     this.project = project;
     this.driver  = driver;
     this.cache   = cache;
 }
示例#15
0
        private void BuildVoicePartAudio(UVoicePart part, UProject project, IResamplerDriver engine)
        {
            ResamplerInterface ri = new ResamplerInterface();

            ri.ResamplePart(part, project, engine, (o) => { this.BuildVoicePartDone(o, part, project); });
        }
示例#16
0
        private List <RenderItem> RenderAsync(UVoicePart part, UProject project, IResamplerDriver engine, BackgroundWorker worker)
        {
            List <RenderItem> renderItems = new List <RenderItem>();

            System.Diagnostics.Stopwatch watch = new Stopwatch();
            watch.Start();
            System.Diagnostics.Debug.WriteLine("Resampling start");
            lock (part)
            {
                string   cacheDir = PathManager.Inst.GetCachePath(project.FilePath);
                string[] cacheFiles = Directory.EnumerateFiles(cacheDir).ToArray();
                int      count = 0, i = 0;
                foreach (UNote note in part.Notes)
                {
                    foreach (UPhoneme phoneme in note.Phonemes)
                    {
                        count++;
                    }
                }

                foreach (UNote note in part.Notes)
                {
                    foreach (UPhoneme phoneme in note.Phonemes)
                    {
                        RenderItem item  = BuildRenderItem(phoneme, part, project);
                        var        sound = RenderCache.Inst.Get(item.HashParameters());

                        if (sound == null)
                        {
                            string cachefile = Path.Combine(cacheDir, string.Format("{0:x}.wav", item.HashParameters()));
                            if (!cacheFiles.Contains(cachefile))
                            {
                                System.Diagnostics.Debug.WriteLine("Sound {0:x} resampling {1}", item.HashParameters(), item.GetResamplerExeArgs());
                                DriverModels.EngineInput engineArgs = DriverModels.CreateInputModel(item, 0);
                                System.IO.Stream         output     = engine.DoResampler(engineArgs);
                                sound = new CachedSound(output);
                            }
                            else
                            {
                                System.Diagnostics.Debug.WriteLine("Sound {0:x} found on disk {1}", item.HashParameters(), item.GetResamplerExeArgs());
                                sound = new CachedSound(cachefile);
                            }
                            RenderCache.Inst.Put(item.HashParameters(), sound, engine.GetInfo().ToString());
                        }
                        else
                        {
                            System.Diagnostics.Debug.WriteLine("Sound {0} found in cache {1}", item.HashParameters(), item.GetResamplerExeArgs());
                        }

                        item.Sound = sound;
                        renderItems.Add(item);
                        worker.ReportProgress(100 * ++i / count, string.Format("Resampling \"{0}\" {1}/{2}", phoneme.Phoneme, i, count));
                    }
                }
            }
            watch.Stop();
            System.Diagnostics.Debug.WriteLine("Resampling end");
            System.Diagnostics.Debug.WriteLine("Total cache size {0:n0} bytes", RenderCache.Inst.TotalMemSize);
            System.Diagnostics.Debug.WriteLine("Total time {0} ms", watch.Elapsed.TotalMilliseconds);
            return(renderItems);
        }
示例#17
0
 private void BuildVoicePartAudio(UVoicePart part, UProject project,IResamplerDriver engine)
 {
     ResamplerInterface ri = new ResamplerInterface();
     ri.ResamplePart(part, project, engine, (o) => { this.BuildVoicePartDone(o, part, project); });
 }