Пример #1
0
        public static void PlayStoryboard(BeatmapFolderInfoEx info)
        {
            //init audio
            if (!(MusicPlayerManager.ActivityPlayer is MusicPlayer player))
            {
                throw new Exception("Player must be MusicPlayer if you want to call PlayStoryboard()");
            }

            player.Load(info.audio_file_path);

            MusicPlayerManager.ActivityPlayer?.Stop();
            MusicPlayerManager.ApplyPlayer(player);

            //load Storyboard objects
            var instance = StoryboardInstance.Load(info);

            var auto_trigger = ToolManager.GetOrCreateTool <AutoTrigger>();

            auto_trigger.Load(info);
            auto_trigger.Trim();

            ExecutorSync.PostTask(() =>
            {
                StoryboardWindow.CurrentWindow.LoadStoryboardInstance(instance);
                MusicPlayerManager.ActivityPlayer?.Play();
            }
                                  );
        }
Пример #2
0
        public void UpdateInfo()
        {
            var t = MusicPlayerManager.ActivityPlayer.CurrentTime;

            if (Math.Abs(t - prev_display_time) >= 1000)
            {
                UpdateProgressTime(t);
            }

            if (prev_info_display != StoryboardInstanceManager.ActivityInstance.Info)
            {
                prev_info_display = StoryboardInstanceManager.ActivityInstance.Info;
                label2.Text       = prev_info_display.folder_path;
            }

            if (Math.Abs((prev_playback_display - DateTime.Now).TotalMilliseconds) > 250)
            {
                UpdateTimeText();
            }

            if (prev_playspeed_display != MusicPlayerManager.ActivityPlayer.PlaybackSpeed)
            {
                prev_playspeed_display = MusicPlayerManager.ActivityPlayer.PlaybackSpeed;
                label1.Text            = prev_playspeed_display + "x";
            }

            button1.Enabled = !MusicPlayerManager.ActivityPlayer.IsPlaying;
            button2.Enabled = MusicPlayerManager.ActivityPlayer.IsPlaying;
        }
Пример #3
0
        public void Load(BeatmapFolderInfoEx info)
        {
            try
            {
                HitSoundInfos = new LinkedList <HitSoundInfo>(); //todo HitSoundInfosHelpers.Parse(info.osu_file_path);
            }
            catch (Exception e)
            {
                Log.Warn(e.Message);
                HitSoundInfos = new LinkedList <HitSoundInfo>();
            }

            Flush();
        }
Пример #4
0
        //将解析好的内容再序列化成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);
            }
        }
Пример #5
0
        public static StoryboardInstance Load(BeatmapFolderInfoEx info)
        {
            StoryboardInstance instance = new StoryboardInstance();

            instance.Info = info;

            using (StopwatchRun.Count("Load and Parse osb/osu file"))
            {
                List <StoryboardObject> temp_objs_list = new List <StoryboardObject>(), parse_osb_Storyboard_objs = new List <StoryboardObject>();

                //get objs from osu file
                List <StoryboardObject> parse_osu_Storyboard_objs = string.IsNullOrWhiteSpace(info.osu_file_path) ? new List <StoryboardObject>() : StoryboardParserHelper.GetStoryboardObjects(info.osu_file_path);
                AdjustZ(parse_osu_Storyboard_objs);

                if ((!string.IsNullOrWhiteSpace(info.osb_file_path)) && File.Exists(info.osb_file_path))
                {
                    parse_osb_Storyboard_objs = StoryboardParserHelper.GetStoryboardObjects(info.osb_file_path);
                    AdjustZ(parse_osb_Storyboard_objs);
                }

                temp_objs_list = CombineStoryboardObjects(parse_osb_Storyboard_objs, parse_osu_Storyboard_objs);

                void AdjustZ(List <StoryboardObject> list)
                {
                    list.Sort((a, b) => (int)(a.FileLine - b.FileLine));
                }

                List <StoryboardObject> CombineStoryboardObjects(List <StoryboardObject> osb_list, List <StoryboardObject> osu_list)
                {
                    List <StoryboardObject> result = new List <StoryboardObject>();

                    Add(Layer.Background);
                    Add(Layer.Fail);
                    Add(Layer.Pass);
                    Add(Layer.Foreground);
                    Add(Layer.Overlay);

                    int z = 0;

                    foreach (var obj in result)
                    {
                        obj.Z = z++;
                    }

                    return(result);

                    void Add(Layer layout)
                    {
                        result.AddRange(osu_list.Where(x => x.layer == layout));//先加osu
                        result.AddRange(osb_list.Where(x => x.layer == layout).Select(x =>
                        {
                            x.FromOsbFile = true;
                            return(x);
                        }));//后加osb覆盖
                    }
                }

                instance.Updater = new StoryboardUpdater(temp_objs_list);
            }

            return(instance);
        }
Пример #6
0
        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();
             * }
             * /*/
        }
Пример #7
0
        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;
                }
            }
        }