2017-10-05 27 views
0

私はグローバルミュージックプレーヤーを管理するはずの "Player"クラスを持っています。 これもこれまでのところ動作します。あなたが改善の提案があれば、クラスは一番下にあります。自由に感じてください。再生中に次の曲を再生する

現在の曲が終了している間に2番目の曲を開始します。 次の曲にフェードインし、現在の曲からフェードアウトして、曲を静かにします。

私のアプローチは、現在、 "waveOutDevice1"オブジェクトで1つの曲が実行されており、2番目のオブジェクトで2つ目の曲が待機しているということです。現在の曲が終了するとすぐに、2番目のWavePlayerが起動します。しかし、現在の曲がやっと終わるとすぐに、私はそれにどのように反応できるのか分かりません。

アイデアや提案はありますか?種類で は

私のプレーヤーのクラスについて:

public class Player 
{ 
    #region Properties, Fields 
    private IWavePlayer waveOutDevice1; 
    private IWavePlayer waveOutDevice2; 
    private AudioFileReader fileReader1; 
    private AudioFileReader fileReader2; 

    public AudioFile CurrentSong { get; private set; } 
    public Playlist CurrentPlaylist { get; private set; } 

    public List<AudioFile> lstPastSongs { get; private set; } 

    public List<AudioFile> lstNextSongs { get; set; } 

    public PlaybackState PlaybackState { get; private set; } 

    public bool Muted { get; private set; } 

    private float OldVolume = 0.0f; 
    #endregion 

    public Player() 
    { 
     this.lstNextSongs = new List<AudioFile>(); 
     this.lstPastSongs = new List<AudioFile>(); 
    } 

    #region Methods 
    public void Play(int index) 
    { 
     if (this.lstNextSongs.Count > 0 && index >= 0 && index < this.lstNextSongs.Count) 
     { 
      this.ResetFileReader(); 
      this.CurrentSong = this.lstNextSongs[index]; 
      this.CurrentPlaylist = this.CurrentSong.Playlist; 
      this.lstNextSongs.RemoveAt(index); 
      this.fileReader1 = new AudioFileReader(this.CurrentSong.Path); 
      this.waveOutDevice1 = new WaveOut(); 
      this.waveOutDevice1.PlaybackStopped += WaveOutDevice1_PlaybackStopped; 

      this.waveOutDevice1.Init(this.fileReader1); 
      this.PlaybackState = PlaybackState.Playing; 
      this.waveOutDevice1.Play(); 
     } 
    } 

    private void WaveOutDevice1_PlaybackStopped(object sender, StoppedEventArgs e) 
    { 
     this.Next(); 
    } 

    private void ResetFileReader() 
    { 
     if (this.fileReader1 != null) 
     {     
      this.fileReader1.Dispose(); 
      this.fileReader1 = null; 
     } 
     if (this.fileReader2 != null) 
     { 
      this.fileReader2.Dispose(); 
      this.fileReader2 = null; 
     } 
     if(this.waveOutDevice1 != null) 
     { 
      this.waveOutDevice1.Dispose(); 
      this.waveOutDevice1 = null; 
     } 
     if(this.waveOutDevice2 != null) 
     { 
      this.waveOutDevice2.Dispose(); 
      this.waveOutDevice2 = null; 
     } 
    } 

    public void Pause() 
    { 
     if(this.waveOutDevice1 != null) 
      if (this.waveOutDevice1.PlaybackState == PlaybackState.Playing) 
       this.waveOutDevice1.Pause(); 
     if(this.waveOutDevice2 != null) 
      if (this.waveOutDevice2.PlaybackState == PlaybackState.Playing) 
       this.waveOutDevice2.Pause(); 
     this.PlaybackState = PlaybackState.Paused; 
    } 

    public void Continue() 
    { 
     if (this.waveOutDevice1 != null) 
      if (this.waveOutDevice1.PlaybackState == PlaybackState.Paused) 
       this.waveOutDevice1.Play(); 
     if (this.waveOutDevice2 != null) 
      if (this.waveOutDevice2.PlaybackState == PlaybackState.Paused) 
       this.waveOutDevice2.Play(); 
     this.PlaybackState = PlaybackState.Playing; 
    } 

    public void Next() 
    { 
     if(this.lstNextSongs.Count > 0) 
     { 
      if (this.CurrentSong != null) 
       this.lstPastSongs.Add(this.CurrentSong); 
      if (GlobalSettings.Shuffle) 
      { 
       System.Random random = new System.Random(); 
       int randomNumber = random.Next(0, this.lstNextSongs.Count - 1); 
       this.Play(randomNumber); 
      } 
      else 
       this.Play(0); 
     } 
     else 
     { 
      if(GlobalSettings.Replay) 
       if(GlobalSettings.CurrentPlaylist != null) 
        for (int i = 0; i < GlobalSettings.CurrentPlaylist.panPlaylist.SongPlaylist.NumberOfSongs; i++) 
         this.lstNextSongs.AddRange(GlobalSettings.CurrentPlaylist.panPlaylist.SongPlaylist.AllSongs); 
     } 
    } 

    public void Previous() 
    { 
     if(this.CurrentSong == null) 
     { 
      if(this.lstPastSongs.Count > 0) 
      { 
       this.lstNextSongs.Insert(0, this.lstPastSongs[this.lstPastSongs.Count - 1]); 
       this.lstPastSongs.RemoveAt(this.lstPastSongs.Count - 1); 
       this.Play(0); 
      } 
     } 
     else 
     { 
      if(this.fileReader1 != null) 
       this._Previous(this.waveOutDevice1, this.fileReader1); 
      else if(this.fileReader2 != null) 
       this._Previous(this.waveOutDevice2, this.fileReader2); 
     } 
    } 

    private void _Previous(IWavePlayer waveOutDevice, AudioFileReader fileReader) 
    { 
     if (fileReader.CurrentTime.Seconds >= 10 || this.lstPastSongs.Count == 0) 
     { 
      waveOutDevice.Pause(); 
      fileReader.CurrentTime = new System.TimeSpan(0, 0, 0); 
      waveOutDevice.Play(); 
     } 
     else 
     { 
      this.lstNextSongs.Insert(0, this.CurrentSong); 
      this.lstNextSongs.Insert(0, this.lstPastSongs[this.lstPastSongs.Count - 1]); 
      this.lstPastSongs.RemoveAt(this.lstPastSongs.Count - 1); 
      this.Play(0); 
     } 
    } 

    public void SetVolume(int Volume) 
    { 
     if (Volume > -1 && Volume < 101) 
     { 

      float vol = (float)Volume/100; 
      if (this.fileReader1 != null) 
       this.fileReader1.Volume = vol; 
      if (this.fileReader2 != null) 
       this.fileReader2.Volume = vol; 
      this.Muted = false; 
     } 
    } 

    public void Mute() 
    { 
     if(this.Muted) 
     { 
      if(this.fileReader1 != null) 
      { 
       this.fileReader1.Volume = this.OldVolume; 
       this.Muted = false; 
      } 
      else if(this.fileReader2 != null) 
      { 
       this.fileReader2.Volume = this.OldVolume; 
       this.Muted = false; 
      } 
     } 
     else 
     { 
      this.Muted = true; 
      if(this.fileReader1 != null) 
      { 
       this.OldVolume = this.fileReader1.Volume; 
       this.fileReader1.Volume = 0; 
      } 
      else if(this.fileReader2 != null) 
      { 
       this.OldVolume = this.fileReader2.Volume; 
       this.fileReader2.Volume = 0; 
      } 
     } 
    } 
    #endregion 
} 

答えて

0

あなたはそれの再生開始時に、あなたはduration - fadeInTimeのためのタイマーを設定することができ、いつタイマー火災あなたのフェードを開始し、曲の長さを得ることができる場合。

+0

これは別の方法です。私の意見では、タイマーは良いパフォーマンスのために悪い考えです。 – ExclusivAtom

+0

そうではありません。特に別のスレッドで実行する場合は特にそうです。 'Thread.Sleep()'は非常に影響が少ないです。 – theGleep

+0

次に、私はより良い解決策を見つけるまで別のタイマーを使用します。 – ExclusivAtom

0

もう1つの方法は、単一のウェーブアウトデバイスを使用し、MixingSampleProviderを使用して、最初のものが終了するときに2番目のソングを新しい入力としてミキサーに追加することです。独自のラッパーISampleProviderを作成して、Readメソッドを使用して、現在の位置を正確に追跡できます。

+0

私は今、数時間の移行に座っていましたが、私はそれを正しくするようです。私もプロジェクト "MusicToCodeBy"を見ましたが、音楽は同時に動くのですが、トランジションが次々と出てきて、私はそこに着きます。あなたは私のための例を持っていますか? – ExclusivAtom

+0

私もクラス "https://stackoverflow.com/questions/9468083/fading-sound-in-out-using-naudio"を見ていました しかしクラスは私をどこにも連れてこなかった。 – ExclusivAtom

関連する問題