/// <summary> /// questionで指定された曲ファイルをオープンします。 /// オープンが完了すると、MediaOpenedイベントが発生します。 /// </summary> /// <param name="question"></param> public void Open(SweetQuestion question) { Close(); _questionTimeLine = new MediaTimeline(new Uri(question.FileName)); //_questionTimeLine.Completed += question_Completed; CurrentQuestion = question; }
// (0.2.0.2) #region *Order削除時 private void MyDocument_OrderRemoved(object sender, GrandMutus.Data.OrderEventArgs e) { this.CurrentPhase = PlayingPhase.Talking; MyQuestionPlayer.Close(); this.CurrentQuestion = null; }
// (0.2.0.2) #region *Order追加時 private void MyDocument_OrderAdded(object sender, GrandMutus.Data.OrderEventArgs e) { var q_id = e.QuestionID; if (q_id.HasValue) { var nextQuestion = MyDocument.Questions.Get(q_id.Value); this.CurrentQuestion = nextQuestion; MyQuestionPlayer.Open(nextQuestion); this.CurrentPhase = PlayingPhase.Ready; } }
//AutoResetEvent _mediaOpenedEvent = new AutoResetEvent(false); // (0.1.0)再生開始位置から再生するように修正。 #region Playコマンド void Play_Executed(object sender, ExecutedRoutedEventArgs e) { if (e.Parameter is SweetQuestion) { var song = (SweetQuestion)e.Parameter; _songPlayer.Open(song.FileName); // このまま次の処理に進むと、まだファイルが開いていないうちにCurrentPositionを設定しまうことがある! // =ここでの設定が反映されない! // 同期をとればよい?が、そのやり方がよくわからないので適当にDelayを挟む。 Task.Delay(10); this.CurrentSong = song; _songPlayer.CurrentPosition = song.PlayPos; _songPlayer.Play(); this.expanderSongPlayer.IsExpanded = true; // ←これはここに書くべきものなのか? } }
/// <summary> /// questionで指定された曲ファイルをオープンします。 /// オープンが完了すると、MediaOpenedイベントが発生します。 /// </summary> /// <param name="question"></param> public void Open(SweetQuestion question) { Close(); _questionTimeLine = new MediaTimeline(new Uri(question.FileName)); //_questionTimeLine.Completed += question_Completed; CurrentQuestion = question; }
bool LoadGrandMutusDocument(XElement root, string fileName) { // rootからMutusDocumentというメソッドはないんだっけ? MutusDocument doc = new MutusDocument(); doc.LoadGrandMutusDocument(root, fileName); // 0.6.4.2以降! NowLoading = true; try { foreach (var q in doc.Questions) { IntroQuestion question = (IntroQuestion)q; var sweet_question = new SweetQuestion(question.Song); sweet_question.PlayPos = question.PlayPos; // intro_question側で未実装. //sweet_question.StopPos = question.StopPos; sweet_question.Category = question.Category; sweet_question.No = question.No; this.AddQuestion(sweet_question); } } finally { NowLoading = false; } return true; }
// (0.3.1) //void Questions_QuestionsRemoved(object sender, ItemEventArgs<IEnumerable<SweetQuestion>> e) //{ // AddOperationHistory(new SweetQuestionsRemovedCache(this, e.Item)); //} // (0.2.0)staticを解除。boolを返すように変更。 // (0.1.7)再生開始位置もロードするように変更. // HyperMutusからのパクリ.古いメソッドだけど,とりあえずそのまま使う. // 場所も未定.とりあえずstatic化してここに置いておく. #region *ファイルからメタデータを読み込み(LoadInformation) /// <summary> /// songのFileNameプロパティで指定されたファイルからメタデータを読み込みます. /// </summary> bool LoadInformation(SweetQuestion question) { SPP.Aldente.IID3Tag tag; try { tag = SPP.Aldente.AldenteMP3TagAccessor.ReadFile(question.FileName); } catch (IOException ex) { // 通知したい。 if (Confirm(string.Format( "読み込みに失敗しました。 - {0} \n曲情報を読み込まずに曲ファイルを追加しますか?", ex.Message))) { tag = null; } else { return false; } } catch (ApplicationException) { tag = null; } question.Title = tag == null ? string.Empty : tag.Title; question.Artist = tag == null ? string.Empty : tag.Artist; question.SabiPos = tag == null ? TimeSpan.Zero : TimeSpan.FromSeconds(Convert.ToDouble(tag.SabiPos)); question.PlayPos = tag == null ? TimeSpan.Zero : TimeSpan.FromSeconds(Convert.ToDouble(tag.StartPos)); return true; }
/// <summary> /// questionがnullの場合は、何もせずにnullを返します。 /// </summary> /// <param name="question"></param> /// <returns></returns> private SweetQuestion AddQuestion(SweetQuestion question) { if (question == null) { return null; } try { _questions.Add(question); // この後の処理でSongDuplicateExceptionが発生する。 _addedSongFiles.Add(question.FileName); //SongAdded(this, new ItemEventArgs<Song> { Item = song }); return question; } catch (SongDuplicateException) { // この時点ではsongが_songsに追加された状態になっているので、ここで削除する。 _questions.Remove(question); return null; } }
// (0.2.2.1)カテゴリを設定できるように改良。 // (0.2.0)曲を追加しない場合にnullを返すように変更。 #region *曲を追加(AddQuestions) /// <summary> /// このメソッドが直接呼び出されることは想定していません. /// 呼び出し元でAddSongsActionに設定されるActionの中で呼び出して下さい(ややこしい...). /// </summary> /// <param name="fileName"></param> /// <returns></returns> public SweetQuestion AddQuestion(string fileName, string category = null) { SweetQuestion question = new SweetQuestion { FileName = fileName, Category = string.IsNullOrEmpty(category) ? string.Empty : category }; if (LoadInformation(question)) { return this.AddQuestion(question); } else { return null; } }