This repository has been archived on 2024-06-21. You can view files and clone it, but cannot push or open issues or pull requests.
CDSAE3/CDSAE3_Lian_Lian_Kan/Sound/Song_Audio_processer.cs

86 lines
2.8 KiB
C#
Raw Normal View History

2024-04-02 13:57:04 +00:00
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
{
2024-04-19 02:00:37 +00:00
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);
2024-04-02 13:57:04 +00:00
public class Song_Audio_processer:IDisposable
{
AudioPlayer? audioPlayer;
private List<string> audioFiles = new List<string>();
2024-04-19 02:00:37 +00:00
public event SongFinishedEventHandler? SongFinished;
2024-04-02 13:57:04 +00:00
int next_song = 1;
private void OnPlaybackStopped(string s,object? obj)
{
2024-04-19 02:00:37 +00:00
SongFinished?.Invoke(this, new SongFinishedEventArgs(s));
2024-04-02 13:57:04 +00:00
set_song(get_next_song());
}
public void pause_song()=> audioPlayer?.pause_song();
public void resume_song()=> audioPlayer?.resume_song();
2024-04-18 00:38:59 +00:00
public string get_last_song()
{
next_song+=audioFiles.Count-2;
next_song %= audioFiles.Count;
string name = audioFiles[next_song];
next_song++;
return name;
}
2024-04-02 13:57:04 +00:00
public string get_next_song()
{
string name = audioFiles[next_song];
next_song++;
next_song %= audioFiles.Count;
return name;
}
/// <summary>
/// 调整音乐音量
/// </summary>
/// <param name="val">音量大小 1-100</param>
public void volume_change(int val)=> audioPlayer?.volume_change(val);
public void set_albums(string s)
{
2024-04-19 02:00:37 +00:00
next_song = 0;
2024-04-02 13:57:04 +00:00
var result = Etcs.musics.Where(x => x.Key == s).ToList();
if (result.Count == 0)
throw new Exception("no such album");
audioFiles = result.First().Value;
2024-04-18 00:38:59 +00:00
Etcs.setting.SetAlbum(result.First().Key);
2024-04-02 13:57:04 +00:00
}
2024-04-19 02:00:37 +00:00
internal void set_song(string s,int volume = -1,Action<string,AudioPlayer>? finished = null)
2024-04-02 13:57:04 +00:00
{
2024-04-18 00:38:59 +00:00
Etcs.setting.SetSongInfo(s);
2024-04-02 13:57:04 +00:00
audioPlayer?.Dispose();
try
{
2024-04-19 02:00:37 +00:00
audioPlayer = new AudioPlayer(s, volume == -1 ? Etcs.Song_Volume : volume, finished ?? OnPlaybackStopped);
2024-04-02 13:57:04 +00:00
}
catch (Exception e)
{
MessageBox.Show($"failed to play {s}\n{e.Message}");
return;
}
audioPlayer.resume_song();
}
2024-04-08 13:04:47 +00:00
public void Dispose()
{
audioPlayer?.Dispose();
GC.SuppressFinalize(this);
}
2024-04-02 13:57:04 +00:00
~Song_Audio_processer() => Dispose();
}
}