async private void OnOpenMenuClick(object sender, EventArgs e) { var openDialog = new OpenFileDialog(); openDialog.Filter = "O2Jam Chart File|*.ojn"; openDialog.Multiselect = true; if (openDialog.ShowDialog() == DialogResult.OK) { int count = charts.Count; AddChart(openDialog.FileNames); if (charts.Count > 0 && openDialog.FileNames.Length > 0) { try { var header = await ChartDecoder.DecodeHeaderAsync(openDialog.FileNames[0]); var item = MusicList.Items.Cast <ListViewItem>().FirstOrDefault((listItem) => listItem.Text == header.Title); MusicList.FocusedItem = item; BtnPlay.PerformClick(); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } }
private void AddChart(string[] filenames) { bool initial = MusicList.Items.Count == 0; var err = new List <string>(); MusicList.BeginUpdate(); { LoadingForm loader = null; loader = new LoadingForm(async() => { float progress = 0; foreach (string filename in filenames) { Chart chart = null; try { if (charts.FirstOrDefault((existing) => existing.Filename == filename) == null) { chart = await ChartDecoder.DecodeHeaderAsync(filename, (int)OJN.Difficulty.HX); charts.Add(chart); var item = new ListViewItem(new string[] { chart.Title, chart.Artist, chart.Pattern, chart.Duration.ToString(@"mm\:ss") }); MusicList.Items.Add(item); } } catch (Exception ex) { err.Add(string.Format("{0}: {1}", Path.GetFileName(filename), ex.Message)); } progress++; if (loader.IsHandleCreated) { loader.SetStatus(string.Format("Processing {0} - {1}", Path.GetFileName(filename), chart?.Title)); loader.SetProgress((progress / filenames.Length) * 100f); } } loader.Close(); }); loader.ShowDialog(); if (MusicList.ListViewItemSorter == null) { var listSorter = new ListViewColumnSorter(); listSorter.Order = SortOrder.Ascending; MusicList.ListViewItemSorter = listSorter; } var sorter = MusicList.ListViewItemSorter as ListViewColumnSorter; var chartSorter = new ChartSorter(); chartSorter.SortType = (ChartSortType)sorter.SortColumn; chartSorter.Order = sorter.Order; MusicList.Sort(); charts?.Sort(chartSorter); } MusicList.EndUpdate(); if (err.Count > 0) { string errfn = ""; foreach (string fn in err) { errfn += fn + Environment.NewLine; } MessageBox.Show("Failed to decode following charts: " + Environment.NewLine + errfn, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); } if (charts.Count > 0 && initial) { playback.Track = 0; GenerateOJNListMenu.Enabled = SavePlaylistMenu.Enabled = RenderMenu.Enabled = OpenMenu.Enabled = GroupPlayback.Enabled = PlaybackMenu.Enabled = true; } }
async private void OnBtnPlayClick(object sender, EventArgs e) { if (playback.Renderer != null && playback.Renderer.IsPaused) { playback.Renderer.Resume(); return; } if (MusicList.FocusedItem == null) { if (MusicList.Items.Count > 0) { MusicList.FocusedItem = MusicList.Items[0]; } else { return; } } if (playback.Renderer != null && playback.Renderer.IsRendering && MusicList.FocusedItem.Index == playback.Track) { return; } Chart chart = null; try { BtnEditMeta.Enabled = GroupUtilities.Enabled = RenderToFileMenu.Enabled = RenderSelectedMenu.Enabled = true; if (playback.Renderer == null) { var renderer = new ChartRenderer(); renderer.Rendering += ((send, args) => { string offset = string.Format("{0} / {1}", renderer.Elapsed.ToString(@"mm\:ss"), renderer.Duration.ToString(@"mm\:ss")); string status = string.Format("{0} - {1}", offset, renderer.Chart.Title); lblPlayingOffset.SetTextAsync(offset); StatusStrip.Invoke(new Action(() => StatusLabel.Text = renderer.IsPaused ? "Paused - " + renderer.Chart.Title : status)); }); renderer.RenderComplete += OnRenderComplete; playback.Renderer = renderer; } else { playback.Renderer.Stop(); await renderTask; } OpenMenu.Enabled = GroupPlayback.Enabled = PlaybackMenu.Enabled = false; playback.Track = MusicList.FocusedItem.Index; var header = charts[playback.Track]; SetLayoutInfo(header, true); SetHighlightState(true); BtnSaveThumbnail.Enabled = header.ThumbnailData != null && header.ThumbnailData.Length > 0; BtnSaveCover.Enabled = header.CoverArtData != null && header.CoverArtData.Length > 0; chart = await ChartDecoder.DecodeAsync(header.Filename, DifficultyBox.SelectedIndex); if (chart == null) { throw new Exception("Invalid / unsupported chart file."); } //foreach (var ev in chart.Events) //{ // var sample = ev as Event.Sound; // if (sample != null) // sample.Payload = null; //} renderTask = playback.Renderer.RenderAsync(chart); } catch (Exception ex) { StatusLabel.Text = "Ready"; MessageBox.Show(ex.Message, "Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { OpenMenu.Enabled = GroupPlayback.Enabled = PlaybackMenu.Enabled = true; await renderTask; } }
private void OnStartButtonClick(object sender, EventArgs e) { string filename = ""; string directory = ""; string err = ""; int format = FormatSelector.SelectedIndex; int freq = int.Parse(FrequencySelector.SelectedItem.ToString().Split(' ').First()); int channel = StereoRadio.Checked ? 2 : 1; if (charts.Length == 1) { var saveDialog = new SaveFileDialog(); saveDialog.FileName = string.Format("{0} - {1}", charts[0].Artist, charts[0].Title); if (format == 0) { saveDialog.FileName += ".mp3"; saveDialog.Filter = "MP3 - MPEG-1 Audio Layer 3|*.mp3"; } else if (format == 1) { saveDialog.FileName += ".ogg"; saveDialog.Filter = "OGG - Vorbis Audio|*.ogg"; } else { saveDialog.FileName += ".wav"; saveDialog.Filter = "WAV - Waveform Audio|*.wav"; } if (saveDialog.ShowDialog() != DialogResult.OK) { return; } filename = saveDialog.FileName; } else if (charts.Length > 1) { var browserDialog = new FolderBrowserDialog(); browserDialog.ShowNewFolderButton = true; if (browserDialog.ShowDialog() != DialogResult.OK) { return; } directory = browserDialog.SelectedPath; } LoadingForm loader = null; loader = new LoadingForm(async() => { float progress = 0; loader.SetStatus("Initializing.."); foreach (var chart in charts) { try { loader.SetStatus(string.Format("Prerendering {0}..", chart.Title)); var fullChart = await ChartDecoder.DecodeAsync(chart.Filename, 2); var data = await Prerender(fullChart, format, channel, freq); if (charts.Length == 1) { File.WriteAllBytes(filename, data); } else if (charts.Length > 1) { filename = string.Format("{0} - {1}", chart.Artist, chart.Title); if (format == 0) { filename += ".mp3"; } else if (format == 1) { filename += ".ogg"; } else { filename += ".wav"; } filename = string.Format("{0}{1}{2}", directory, Path.DirectorySeparatorChar, filename ); File.WriteAllBytes(filename, data); } } catch (Exception ex) { if (charts.Length == 1) { err = ex.Message; loader.DialogResult = DialogResult.Cancel; loader.Close(); } } finally { progress++; loader.SetProgress((progress / charts.Length) * 100f); } } loader.Close(); }); if (loader.ShowDialog() == DialogResult.Abort) { if (charts.Length == 1) { MessageBox.Show("Failed to prerender the chart into file\n." + err, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } else if (!string.IsNullOrEmpty(directory)) { MessageBox.Show("Failed to render following charts:\n." + err, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } else { MessageBox.Show("Prerender has been completed successfully.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); } Close(); }