# Đồ án MediaPlayer - Class definition ## Media Bài hát hoặc video ```dart= class Media { String id; String name; int duration; String filePath; bool get isMusic => bool get isVideo => } ``` ## Playlist Danh sách phát ```dart= class Playlist { String id; String name; List<Media> medias; } ``` ## GLOBAL ```dart= static class GLOBAL { PlayerController player; List<Playlist> allPlaylists; String currPlaylistId; String nowPlaylistId; // thêm playlist addPlaylist() // thêm media vào playlist theo id addMedia(Media media, String playlistId) { // thêm vào cuối // + allPlaylists // + player.playlist } // xóa media removeMedia(String mediaId, String playlistId) { // xóa trong allPlaylists // xóa trong player.playlist (nếu là playlist đang phát) // nếu là bài đang phát thì playNext hoặc playRandom rồi mới xóa } } ``` ## PlayerState ```dart= enum PlayerState { STOPPED, // chưa phát bài nào (hoặc khi xảy ra lỗi phát nhạc) PLAYING, // đang phát PAUSED, // đang tạm dừng COMPLETE, // đã phát hết playlist } ``` ## PlayerController - PlayerController không liên quan đến Playlist, chỉ phát Media - Cơ chế Shuffle: - Bật/tắt trạng thái isShuffle - Dựa vào isShuffle để PlayNext() - Không tạo mảng random Media ```dart= class PlayerController { // Thư viện của WPF MediaPlayer player; // List id các bài đã phát (từ lúc setPlaylist) List<String> history; // danh sách Media đang chơi // lí do là List<Media> mà không phải Playlist: // + không phụ thuộc vào lớp Playlist // + ý nghĩa của PlayerController: phát danh sách bài hát List<Media> playlist; // id bài hiện tại đang phát String nowId; // trạng thái hiện tại PlayerState state; // shuffle mode bool isShuffle; //======================= // Trả về bài đang phát Media get nowMedia => // Trả về vị trí của bài đang phát int get position => //======================= // gán playlist sẽ chơi setPlaylist() // phát bài đầu tiên: clear history playAll() // dùng player để chơi bài: now = index // tại thời điểm position (optional, not required) playMedia(int index, [int position = 0]) // phát bài tiếp theo (kiểm tra isShuffle) playNext() // phát bài trước đó (dựa trên history): xóa history.last playPrevious() // Lấy index bài tiếp theo ngẫu nhiên // loại trừ những bài gần đây (dựa trên history) int getNextRandom() // đảo isShuffleMode toggleShuffle() { isShuffleMode = !isShuffleMode; } // Lấy index media theo id getIndexById() // Lấy id media theo index getIdByIndex() } ```