public void GenerateBinaryFile(double TimePosition) { if (TimePosition < 0) { TimePosition = 0; } string temp = System.Environment.GetEnvironmentVariable("TEMP"); DirectoryInfo info = new DirectoryInfo(temp); DirectoryInfo baseDir = info.CreateSubdirectory("Chorista\\Instance." + System.Diagnostics.Process.GetCurrentProcess().Id.ToString()); BinaryFileStruct BFS = new BinaryFileStruct(); BFS.GlobalVolume = (float)((double)projectObject.GlobalVolume / 100.0); BFS.TrackVolumes = new Dictionary <int, float>(); for (int i = 0; i < projectObject.TrackerList.Count; i++) { Calculators.VocalTrackCalculator tc = new Calculators.VocalTrackCalculator(SingerDataFinder); BFS.VocalTrackStructs.Add(i, tc.CalcTracker(TimePosition, projectObject.TrackerList[i], projectObject.BaseTempo)); BFS.TrackVolumes.Add(i, (float)projectObject.TrackerList[i].getVolume()); } for (int i = 0; i < projectObject.BackerList.Count; i++) { BarkerCalculator bc = new BarkerCalculator(); BFS.BarkerTrackStructs.Add(i, bc.CalcTracker(TimePosition, projectObject.BackerList[i])); BFS.TrackVolumes.Add(projectObject.TrackerList.Count + i, (float)projectObject.BackerList[i].getVolume()); } BFS.StartTimePosition = TimePosition; using (System.IO.FileStream ms = new System.IO.FileStream(baseDir.FullName + @"\\RendCmd.binary", System.IO.FileMode.Create)) { //序列化操作,把内存中的东西写到硬盘中 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter fomatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(null, new System.Runtime.Serialization.StreamingContext(System.Runtime.Serialization.StreamingContextStates.File)); fomatter.Serialize(ms, BFS); ms.Flush(); } }
static void Main(string[] args) { tme.Elapsed += tme_Elapsed; tme.Enabled = false; Console.WriteLine("CreateNamedPipe:" + System.Diagnostics.Process.GetCurrentProcess().Id); int Instance = int.Parse(args[0]); if (Instance > 0) { cmdReciever = new CommandPipe_Server(System.Diagnostics.Process.GetCurrentProcess().Id); cmdReciever.OnRecieve += cmdReciever_OnRecieve; client = new CommandPipe_Client(Instance); string temp = System.Environment.GetEnvironmentVariable("TEMP"); DirectoryInfo info = new DirectoryInfo(temp); DirectoryInfo baseDir = info.CreateSubdirectory("Chorista\\Instance." + Instance); BinaryFileStruct BFS = new BinaryFileStruct(); CplayerList.Clear(); using (System.IO.FileStream ms = new System.IO.FileStream(baseDir.FullName + @"\\RendCmd.binary", System.IO.FileMode.Open)) { //序列化操作,把内存中的东西写到硬盘中 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter fomatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(null, new System.Runtime.Serialization.StreamingContext(System.Runtime.Serialization.StreamingContextStates.File)); object obj = fomatter.Deserialize(ms); ms.Flush(); BFS = (BinaryFileStruct)obj; } StartTimeMs = (BFS.StartTimePosition * 1000); client.SendData_ASync("Status:Buffering"); _EmptyProgram = false; for (int i = 0; i < BFS.VocalTrackStructs.Count; i++) { CplayerList.Add(i, new CacheRender()); CplayerList[i].RendingStateChange += Program_RendingStateChange; Task.Factory.StartNew((object prm) => { object[] prms = (object[])prm; IRender cplayer = (IRender)prms[0]; DirectoryInfo TempDir = (DirectoryInfo)prms[1]; List <Calculators.NoteListCalculator.NotePreRender> NList = (List <Calculators.NoteListCalculator.NotePreRender>)prms[2]; cplayer.StartRending(TempDir, NList); }, new object[] { CplayerList[i], baseDir, BFS.VocalTrackStructs[i] }); } for (int j = 0; j < BFS.BarkerTrackStructs.Count; j++) { int i = BFS.VocalTrackStructs.Count + j; CplayerList.Add(i, new BgmRender()); CplayerList[i].RendingStateChange += (object sender) => { IRender cr = (IRender)sender; int Key = -1; foreach (KeyValuePair <int, IRender> kv in CplayerList) { if (kv.Value == cr) { Key = kv.Key; break; } } if (cmder != null) { cmder.SetupRendingStatus(Key, cr.getIsRending()); } }; Task.Factory.StartNew((object prm) => { object[] prms = (object[])prm; IRender cplayer = (IRender)prms[0]; DirectoryInfo TempDir = (DirectoryInfo)prms[1]; List <VocalUtau.Calculators.BarkerCalculator.BgmPreRender> NList = (List <VocalUtau.Calculators.BarkerCalculator.BgmPreRender>)prms[2]; cplayer.StartRending(TempDir, NList); }, new object[] { CplayerList[i], baseDir, BFS.BarkerTrackStructs[j] }); } cmder = new PlayCommander(CplayerList); cmder.SetTrackerVolumes(BFS.TrackVolumes); cmder.SetGlobalVolume(BFS.GlobalVolume); cmder.WaitRendingStart(); cmder.PlayFinished += Program_PlayFinished; cmder.PlayProcessUpdate += cmder_PlayProcessUpdate; cmder.PlayPlaying += cmder_PlayPlaying; cmder.PlayPaused += cmder_PlayPaused; ProcessStr = "0/0/False"; //如果为空项目,则渲染未开始即结束 if (_EmptyProgram) { cmder.StopAll(); } else { cmder.PlayAll(); } _EmptyProgram = false; Console.ReadLine(); } }