2017-10-05 28 views
0

나는 내 글로벌 뮤직 플레이어를 관리해야하는 "Player"클래스를 가지고있다. 이것은 또한 지금까지 작동합니다. 수업은 아래쪽에 있습니다. 개선을위한 제안 사항이 있으면 언제든지 알려 주시기 바랍니다.하나가 연주되는 동안 다음 노래 시작하기

현재 노래가 끝나는 동안 두 번째 노래를 시작하고 싶습니다. 그래서 다음 노래로 FadeIn하고 현재 노래의 FadeOut을 사용하여 노래를 더 조용하게 만듭니다.

현재로서는 "waveOutDevice1"개체에서 하나의 노래가 실행되고 두 번째 개체에서 두 번째 노래가 대기 중입니다. 현재 노래가 끝나면 곧 두 번째 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

또 다른 방법은 단일 웨이브 출력 장치를 사용하고 MixingSampleProvider을 사용하여 두 번째 노래를 새로운 입력으로 믹서에 추가합니다. 첫 번째 노래는 끝납니다. 자신의 래퍼 ISampleProvider을 작성하여 Read 메소드를 사용하여 어디에 있는지 정확하게 추적 할 수 있습니다.

+0

나는 지금 2 시간 동안 전환에 앉아 있었지만, 나는 그것을 올바르게하는 것처럼 보인다. 나는 또한 "MusicToCodeBy"라는 프로젝트를 보았는데, 같은 시간에 음악이 실행되지만, 하나씩 다른 전환점이있는 노래는 거기에 도착합니다. 나에게 모범이 있습니까? – ExclusivAtom

+0

클래스 "https://stackoverflow.com/questions/9468083/fading-sound-in-out-using-naudio"도 보았습니다. 하지만 수업에서 아무 것도받지 못했습니다. – ExclusivAtom