首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 音樂播放器循環播放實現:索引輪換法

     編輯:程式設計綜合問答

核心邏輯

維護一個 currentIndex 指向播放列表,播放結束事件中遞增並取模。

完整示例 (NAudio / MediaPlayer 均適用)

public class MusicPlayer {
    private readonly List _playlist = new List();
    private int _currentIndex = -1;
    private IWavePlayer _waveOut; // NAudio
    // 或 MediaPlayer _player = new MediaPlayer(); // WPF

    public void AddSongs(IEnumerable files) {
        _playlist.AddRange(files);
    }

    public void Play() {
        if (_playlist.Count == 0) return;
        _currentIndex = (_currentIndex + 1) % _playlist.Count;
        PlayFile(_playlist[_currentIndex]);
    }

    public void PlayFile(string path) {
        // NAudio 示例
        _waveOut?.Dispose();
        var reader = new AudioFileReader(path);
        _waveOut = new WaveOutEvent();
        _waveOut.Init(reader);
        _waveOut.PlaybackStopped += (s, e) => Play(); // 循環關鍵:播放結束自動下一首
        _waveOut.Play();
    }

    public void Next() => Play(); // 手動下一首同邏輯
    public void Prev() {
        _currentIndex = (_currentIndex - 1 + _playlist.Count) % _playlist.Count;
        PlayFile(_playlist[_currentIndex]);
    }
}

關鍵點

  • 事件驅動:訂閱 PlaybackStopped (NAudio) 或 MediaEnded (MediaPlayer) 自動觸發下一首。
  • 取模運算:(index + 1) % count 實現無縫循環,無需判斷邊界。
  • 資源釋放:切歌前 Dispose() 舊播放器,防止內存洩漏。
  • 隨機/單曲循環:擴展枚舉 PlayMode { Sequence, RepeatOne, Shuffle },在事件中根據模式計算新索引。

WPF MediaPlayer 版本

_player.MediaEnded += (s, e) => {
    _player.Position = TimeSpan.Zero; // 單曲循環
    // 或 _currentIndex = (_currentIndex + 1) % _playlist.Count; _player.Open(new Uri(_playlist[_currentIndex])); _player.Play();
};
_player.MediaFailed += (s, e) => { /* 記錄錯誤,嘗試下一首 */ };
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved