//将解析好的内容再序列化成osb文件格式的文本内容 private static void SerializeDecodeStoryboardContent(string beatmap_folder, bool parse_osb, string output_path) { try { var info = BeatmapFolderInfoEx.Parse(beatmap_folder, null); var input_file = parse_osb ? info.osb_file_path : info.osu_file_path; output_path = string.IsNullOrWhiteSpace(output_path) ? input_file + ".parse_output" : output_path; Log.User($"Start serialize {input_file} ...."); using (var writer = new StreamWriter(File.OpenWrite(output_path))) { writer.WriteLine($"[{Section.Events.ToString()}]"); OsuFileReader reader = new OsuFileReader(input_file); VariableCollection collection = new VariableCollection(new VariableReader(reader).EnumValues()); SectionReader section = new SectionReader(Section.Events, reader); EventReader event_section = new EventReader(reader, collection); foreach (var line in section.EnumValues()) { var decode_line = event_section.LineProcessVariable(line); writer.WriteLine(decode_line); } } Log.User("Serialize successfully! it output to " + output_path); Exit("Serialize successfully! it output to " + output_path); } catch (Exception e) { Log.Error("Serialize failed!" + e.Message); Exit("Serialize failed!" + e.Message); } }
public static void Main(string[] argv) { //Test(); Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory; //hook Ctrl-C action for console window. SetConsoleCtrlHandler(type => { Exit(); return(true); }, false); //apply settings from file PlayerSetting.Init(); //apply settings from commandline var args = ParseProgramCommands(argv, out var beatmap_folder); //apply features and settings from diff envs EnvironmentHelper.SetupEnvironment(); //Update check and notify if (PlayerSetting.EnableUpdateCheck) { ProgramUpdater.UpdateCheck(); } //clean temp folder if updated just now. ProgramUpdater.CleanTemp(); PlayerSetting.PrintSettings(); //init window StoryboardWindow window = new StoryboardWindow(PlayerSetting.Width, PlayerSetting.Height); Log.User($"Start to parse folder :{beatmap_folder}"); if (Directory.Exists(beatmap_folder)) { var info = BeatmapFolderInfoEx.Parse(beatmap_folder, args); var instance = StoryboardInstance.Load(info); window.LoadStoryboardInstance(instance); var player = new MusicPlayer(); player.Load(info.audio_file_path); MusicPlayerManager.ApplyPlayer(player); var auto_trigger = ToolManager.GetOrCreateTool <AutoTrigger>(); auto_trigger.Load(info); auto_trigger.Trim(); } else { Exit($"You have to select a beatmap folder which contains storyboard to play"); } if (PlayerSetting.EncodingEnvironment) { //init encoding environment var encoding_opt = new EncoderOption(args); EncodingKernel encoding_kernel = new EncodingKernel(encoding_opt); EncodingProcessPlayer encoding_player = new EncodingProcessPlayer(MusicPlayerManager.ActivityPlayer.Length, encoding_opt.FPS); MusicPlayerManager.ActivityPlayer.Pause(); MusicPlayerManager.ApplyPlayer(encoding_player); ToolManager.AddTool(encoding_kernel); encoding_kernel.Start(); } #region Setup Loop Playback if ((PlayerSetting._LoopPlayStartTime != null || PlayerSetting._LoopPlayEndTime != null) && MusicPlayerManager.ActivityPlayer is MusicPlayer mp) { var len = mp.Length; LoopPlayer lp = new LoopPlayer(PlayerSetting._LoopPlayStartTime ?? 0, PlayerSetting._LoopPlayEndTime ?? len); Log.User($"Loop playback : {lp}"); MusicPlayerManager.ApplyPlayer(lp); } #endregion MusicPlayerManager.ActivityPlayer.Volume = PlayerSetting.Volume; MusicPlayerManager.ActivityPlayer?.Play(); window.Run(); /*/ 不曾设想的操作.jpg * window.IsVisible = true; * window.RefreshResize(); * * while (true) * { * UpdateKernel.Update(); * RenderKernel.Draw(); * window.SwapBuffers(); * UpdateKernel.FrameRateLimit(); * Application.DoEvents(); * } * /*/ }
public void ExecuteCommand(string command) { //考虑到还有其他玩意用CLI接口 lock (this) { if (string.IsNullOrWhiteSpace(command)) { return; } var cmd = parser.Parse(command, out var cmdName) ?? new Parameters();//default empty switch (cmdName) { /* * 播放指定的文件夹的sb * >file "G:\osu!\Songs\747313 Shimotsuki Haruka - Liblume" */ case "file": var folder_path = cmd.FreeArgs.FirstOrDefault(); if ((!string.IsNullOrWhiteSpace(folder_path)) && Directory.Exists(folder_path)) { var info = BeatmapFolderInfoEx.Parse(folder_path, null); StoryboardPlayerHelper.PlayStoryboard(info); } break; /* * 开始/恢复播放 * >play */ case "play": MusicPlayerManager.ActivityPlayer.Play(); break; /* * 暂停播放 * >pause */ case "pause": MusicPlayerManager.ActivityPlayer.Pause(); break; /* * 跳到15000ms处的画面 * >jump 15000 */ case "jump": var str = cmd.FreeArgs.FirstOrDefault(); if (str == null) { break; } var num = uint.Parse(str); ExecutorSync.PostTask(() => MusicPlayerManager.ActivityPlayer.Jump(num, true)).Wait(); break; /* * QUITZERA,关闭播放器 * >exit * 或者 * >quit */ case "exit": case "quit": StoryboardWindow.CurrentWindow.Close(); break; case "moveTo": //x,y坐标 throw new NotImplementedException(); case "scale": //1.0为基准这样 //case "sizeTo": //或者具体到分辨率 throw new NotImplementedException(); /* * 改变窗口分辨率(不是渲染大小) * >window_resize 1600x900 * 或者 * >window_resize 1600*900 */ case "window_resize": var rstr = cmd.FreeArgs.FirstOrDefault(); if (rstr == null || !rstr.Any(x => size_split.Contains(x))) { break; } var d = rstr.Split(size_split); var nw = d[0].ToInt(); var nh = d[1].ToInt(); StoryboardWindow.CurrentWindow.Size = new Vector2i(nw, nh); break; /* * 改变播放音乐音量(0~1) * >volume 0.5 */ case "volume": MusicPlayerManager.ActivityPlayer.Volume = cmd.FreeArgs.FirstOrDefault()?.ToSigle() ?? MusicPlayerManager.ActivityPlayer.Volume; break; /* * 改变 音乐/画面 播放速率 * >playback_speed 2 * >playback_speed 0.5 */ case "playback_speed": MusicPlayerManager.ActivityPlayer.PlaybackSpeed = cmd.FreeArgs.FirstOrDefault()?.ToSigle() ?? MusicPlayerManager.ActivityPlayer.PlaybackSpeed; break; /* * 切换全屏播放 * >fullscreen * >fullscreen true * >fullscreen false */ case "fullscreen": var fsw = cmd.FreeArgs.FirstOrDefault() ?? string.Empty; var window = StoryboardWindow.CurrentWindow; if (string.IsNullOrWhiteSpace(fsw)) { window.SwitchFullscreen(!window.IsFullScreen); } else { window.SwitchFullscreen(bool.Parse(fsw)); } break; /* * 切换无边窗播放 * >borderless * >borderless true * >borderless false */ case "borderless": var bsw = cmd.FreeArgs.FirstOrDefault() ?? string.Empty; window = StoryboardWindow.CurrentWindow; if (string.IsNullOrWhiteSpace(bsw)) { window.ApplyBorderless(!window.IsBorderless); } else { window.ApplyBorderless(bool.Parse(bsw)); } break; default: break; } } }