Windows 音乐控制器设计

bandit 发布于 2025-06-16 308 次阅读


Windows 播放音乐API

使用C#的NAudio库进行封装 (只支持Windows)

MusicPlayer类

一个Player控制一个歌曲播放 以下为C#代码

namespace Web_Music_Controller_Base;
using System.Timers;
using System.Threading.Tasks;
using NAudio.Wave;
public class MusicPlayer : IDisposable
{
    private AudioFileReader? _audioFile;
    private WaveOutEvent? _outputDevice;
    private TaskCompletionSource<bool>? _playbackFinished;
    private PlayStatus _playStatus = PlayStatus.BeforeInit;
    private String? _filePath;

    public String GetFilePath()
    {
        return _filePath;
    }

    public PlayStatus GetPlaySataus()
    {
        return _playStatus;
    }

    public int GetCurrentSec()
    {
        if (_playStatus == PlayStatus.BeforeInit) throw new Exception("GetCurrentSec(Error) _audioFile实例未初始化");
        return (int)_audioFile.CurrentTime.TotalSeconds;
    }
    
    public int GetTotalSec()
    {
        if (_playStatus == PlayStatus.BeforeInit) throw new Exception("GetTotalSec(Error) _audioFile实例未初始化");
        return (int)_audioFile.TotalTime.TotalSeconds;
    }
    
    public MusicPlayer(string filePath)
    {
        _playStatus = PlayStatus.Stop;
        _audioFile = new AudioFileReader(filePath);
        _filePath = filePath;
    }
    
    

    public async Task Play()
    {
        Stop();
        _outputDevice = new WaveOutEvent();
        _outputDevice.Init(_audioFile);
        _playbackFinished = new TaskCompletionSource<bool>();
        _outputDevice.PlaybackStopped += (s, e) =>
        {
            _playStatus = PlayStatus.Stop;
            _playbackFinished.TrySetResult(true);
        };
        _outputDevice.Play();
        _playStatus = PlayStatus.Playing;
        await _playbackFinished.Task;
    }

    public void Pause()
    {
        if (_outputDevice != null && _outputDevice.PlaybackState == PlaybackState.Playing)
        {
            _outputDevice.Pause();
            _playStatus = PlayStatus.Pause;
        }
    }

    public void Resume()
    {
        if (_outputDevice != null && _outputDevice.PlaybackState == PlaybackState.Paused)
        {
            _outputDevice.Play();
            _playStatus = PlayStatus.Playing;
        }
    }

    public void Stop()
    {
        _playStatus = PlayStatus.Stop;
        _outputDevice?.Stop();
        _audioFile.CurrentTime = TimeSpan.Zero;
    }
    
    public void setCurrentSec(int sec)
    {
        if (_playStatus == PlayStatus.BeforeInit) throw new Exception("Seek(Error) _audioFile实例未初始化");
        _audioFile.CurrentTime = TimeSpan.FromSeconds(sec);
    }

    public void Dispose()
    {
        Stop();
        _audioFile?.Dispose();
        _outputDevice?.Dispose();
        _audioFile = null;
        _outputDevice = null;
        _playStatus = PlayStatus.BeforeInit;
    }
}

MusicController类

用于管理所有的MusicController并提供控制方法(以下代码示例)

using System.Collections;

namespace Web_Music_Controller_Base;

public class MusicController : IEnumerable<KeyValuePair<string, MusicPlayer>>
{
    private Dictionary<string, MusicPlayer> musicPlayers = new ();

    public MusicPlayer this[string musicName]
    {
        get => GetMusicPlayer(musicName);
    }
    
    public int GetCount()
    {
        return musicPlayers.Count;
    }

    public void RemoveMusicPlayer(String musicName)
    {
        musicPlayers.Remove(musicName);
    }
    
    public MusicController()
    {
        
    }

    public bool exist(String musicName)
    {
        return musicPlayers.ContainsKey(musicName);
    }
    
    public void AddMusicPlayer(string musicName, MusicPlayer musicPlayer)
    {
        if (musicPlayers.ContainsKey(musicName))
        {
            throw new Exception("音乐已存在");
        }
        musicPlayers.Add(musicName, musicPlayer);
    }
    
    public MusicPlayer GetMusicPlayer(string musicName)
    {
        if (!musicPlayers.ContainsKey(musicName))
        {
            throw new Exception("音乐不存在");
        }
        return musicPlayers[musicName];
    }
    
    public IEnumerator<KeyValuePair<string, MusicPlayer>> GetEnumerator()
    {
        return musicPlayers.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
此作者没有提供个人介绍。
最后更新于 2025-06-16