using NAudio.Wave; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Resources; using System.Text; using System.Threading.Tasks; using CDSAE3_Lian_Lian_Kan.Properties; using NAudio.Wave.SampleProviders; namespace CDSAE3_Lian_Lian_Kan.Sound { public class SongFinishedEventArgs : EventArgs { public string SongName { get; set; } public SongFinishedEventArgs(string songName) => SongName = songName; } public delegate void SongFinishedEventHandler(Song_Audio_processer s, SongFinishedEventArgs e); public class Song_Audio_processer:IDisposable { AudioPlayer? audioPlayer; private List audioFiles = new List(); public event SongFinishedEventHandler? SongFinished; int next_song = 1; private void OnPlaybackStopped(string s,object? obj) { SongFinished?.Invoke(this, new SongFinishedEventArgs(s)); set_song(get_next_song()); } public void pause_song()=> audioPlayer?.pause_song(); public void resume_song()=> audioPlayer?.resume_song(); public string get_last_song() { next_song+=audioFiles.Count-2; next_song %= audioFiles.Count; string name = audioFiles[next_song]; next_song++; return name; } public string get_next_song() { string name = audioFiles[next_song]; next_song++; next_song %= audioFiles.Count; return name; } /// /// 调整音乐音量 /// /// 音量大小 1-100 public void volume_change(int val)=> audioPlayer?.volume_change(val); public void set_albums(string s) { next_song = 0; var result = Etcs.musics.Where(x => x.Key == s).ToList(); if (result.Count == 0) throw new Exception("no such album"); audioFiles = result.First().Value; Etcs.setting.SetAlbum(result.First().Key); } internal void set_song(string s,int volume = -1,Action? finished = null) { Etcs.setting.SetSongInfo(s); audioPlayer?.Dispose(); try { audioPlayer = new AudioPlayer(s, volume == -1 ? Etcs.Song_Volume : volume, finished ?? OnPlaybackStopped); } catch (Exception e) { MessageBox.Show($"failed to play {s}\n{e.Message}"); return; } audioPlayer.resume_song(); } public void Dispose() { audioPlayer?.Dispose(); GC.SuppressFinalize(this); } ~Song_Audio_processer() => Dispose(); } }