From f918c1d07aec3afcaee8e7be2d34026dc4c92fd8 Mon Sep 17 00:00:00 2001 From: Vic Date: Fri, 19 Aug 2022 01:52:34 +0800 Subject: [PATCH] bugfix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 未选中歌曲时,下一首播放选项变灰 2. 播放列表变动时的处理 3. 随机播放模式回到上一首 --- MusicPlayer2/MusicPlayerDlg.cpp | 2 +- MusicPlayer2/Player.cpp | 280 +++++++++++++++++--------------- MusicPlayer2/Player.h | 5 +- 3 files changed, 151 insertions(+), 136 deletions(-) diff --git a/MusicPlayer2/MusicPlayerDlg.cpp b/MusicPlayer2/MusicPlayerDlg.cpp index 64e2a965..0b376b02 100644 --- a/MusicPlayer2/MusicPlayerDlg.cpp +++ b/MusicPlayer2/MusicPlayerDlg.cpp @@ -1406,6 +1406,7 @@ void CMusicPlayerDlg::SetMenuState(CMenu* pMenu) break; } pMenu->EnableMenuItem(ID_PLAY_ITEM, MF_BYCOMMAND | (selete_valid ? MF_ENABLED : MF_GRAYED)); + pMenu->EnableMenuItem(ID_PLAY_AS_NEXT, MF_BYCOMMAND | (selete_valid ? MF_ENABLED : MF_GRAYED)); pMenu->EnableMenuItem(ID_REMOVE_FROM_PLAYLIST, MF_BYCOMMAND | (selete_valid && playlist_mode ? MF_ENABLED : MF_GRAYED)); pMenu->EnableMenuItem(ID_ITEM_PROPERTY, MF_BYCOMMAND | (selete_valid ? MF_ENABLED : MF_GRAYED)); pMenu->EnableMenuItem(ID_RENAME, MF_BYCOMMAND | (can_delete ? MF_ENABLED : MF_GRAYED)); @@ -6322,7 +6323,6 @@ afx_msg LRESULT CMusicPlayerDlg::OnRecentFolserOrPlaylistChanged(WPARAM wParam, void CMusicPlayerDlg::OnPlayAsNext() { - //TODO 未选中时的情况? CPlayer::GetInstance().PlayAfterCurrentTrack(m_items_selected); DrawInfo(false); } diff --git a/MusicPlayer2/Player.cpp b/MusicPlayer2/Player.cpp index 5cb4e281..ffbb3307 100644 --- a/MusicPlayer2/Player.cpp +++ b/MusicPlayer2/Player.cpp @@ -27,7 +27,8 @@ CPlayer::~CPlayer() UnInitPlayerCore(); } -inline int CPlayer::GetNextShuffled() const { +inline int CPlayer::GetNextShuffleIdx() const { + // 获得下一m_shuffle_index int next = m_shuffle_index + 1; //if (m_is_shuffle_list_played) // next++; @@ -36,7 +37,8 @@ inline int CPlayer::GetNextShuffled() const { return next; } -inline int CPlayer::GetPrevShuffled() const { +inline int CPlayer::GetPrevShuffleIdx() const { + // 获得前一m_shuffle_index int prev = m_shuffle_index - 1; //if (m_is_shuffle_list_played) // prev--; @@ -45,6 +47,14 @@ inline int CPlayer::GetPrevShuffled() const { return prev; } +inline void CPlayer::OnPlaylistChange() { + //播放列表有修改时的相关操作,如清空下一首和随机播放记录 + m_random_list.clear(); + m_next_tracks.clear(); + m_shuffle_list.clear(); //TODO 是否需要重新shuffle + m_is_shuffle_list_played = false; +} + void CPlayer::IniPlayerCore() { if (m_pCore == nullptr) @@ -402,10 +412,12 @@ void CPlayer::IniPlaylistComplate() EmplaceCurrentPathToRecent(); EmplaceCurrentPlaylistToRecent(); SetTitle(); + OnPlaylistChange(); + //初始化随机播放序号列表 + //在OnPlaylistChange后面以免被清空 InitShuffleList(m_index); - m_random_list.clear(); if (m_repeat_mode == RM_PLAY_RANDOM) m_random_list.push_back(m_index); @@ -794,30 +806,44 @@ bool CPlayer::IsPlaying() const bool CPlayer::PlayTrack(int song_track, bool auto_next) { - if (!m_next_tracks.empty()) { - song_track = m_next_tracks.front(); - m_next_tracks.pop_front(); + if (song_track >= 0) { + m_next_tracks.clear(); //手动播放时复位下一首列表 } - else + switch (m_repeat_mode) { - switch (m_repeat_mode) - { - case RM_PLAY_ORDER: //顺序播放 - if (song_track == NEXT) //播放下一曲 - song_track = m_index + 1; - if (song_track == PREVIOUS) //播放上一曲 - song_track = m_index - 1; - break; + case RM_PLAY_ORDER: //顺序播放 - case RM_PLAY_SHUFFLE: //无序播放 - if (m_shuffle_list.size() != m_playlist.size()) - InitShuffleList(); - if (!m_shuffle_list.empty()) + if (song_track == NEXT) //播放下一曲 + { + if (!m_next_tracks.empty()) { + song_track = m_next_tracks.front(); + m_next_tracks.pop_front(); + } + else { - if (song_track == NEXT) + song_track = m_index + 1; + } + } + else if (song_track == PREVIOUS) //播放上一曲 + { + song_track = m_index - 1; + } + break; + + case RM_PLAY_SHUFFLE: //无序播放 + if (m_shuffle_list.size() != m_playlist.size()) + InitShuffleList(); + if (!m_shuffle_list.empty()) + { + if (song_track == NEXT) + { + if (!m_next_tracks.empty()) { + song_track = m_next_tracks.front(); + m_next_tracks.pop_front(); + } + else { - //TODO 下一首? - m_shuffle_index = GetNextShuffled(); + m_shuffle_index = GetNextShuffleIdx(); if (m_shuffle_index == 0 && m_is_shuffle_list_played) { //如果列表中的曲目已经随机播放完了一遍,则重新生成一个新的顺序 @@ -827,88 +853,110 @@ bool CPlayer::PlayTrack(int song_track, bool auto_next) } song_track = m_shuffle_list[m_shuffle_index]; } - else if (song_track == PREVIOUS) - { - if (m_shuffle_list.empty()) - break; - m_shuffle_index = GetPrevShuffled(); - song_track = m_shuffle_list[m_shuffle_index]; - } - else if (m_is_shuffle_list_played) - { - //防止指定播放歌曲时,生成的列表第一个仍是该歌曲导致连续播放两遍 - InitShuffleList(song_track); //手动指定播放曲目时重新生成无序列表 - } - m_is_shuffle_list_played = true; //否则手动指定时,可能会出现下一曲仍是同一曲 } - break; + else if (song_track == PREVIOUS) + { + if (m_shuffle_list.empty() && m_playlist.empty()) + break; + m_shuffle_index = GetPrevShuffleIdx(); + song_track = m_shuffle_list[m_shuffle_index]; + } + else if (m_is_shuffle_list_played) + { + //防止指定播放歌曲时,生成的列表第一个仍是该歌曲导致连续播放两遍 + InitShuffleList(song_track); //手动指定播放曲目时重新生成无序列表 + } + m_is_shuffle_list_played = true; //否则手动指定时,可能会出现下一曲仍是同一曲 + } + break; - case RM_PLAY_RANDOM: //随机播放 - if (song_track == NEXT) + case RM_PLAY_RANDOM: //随机播放 + if (song_track == NEXT) + { + if (!m_next_tracks.empty()) { + song_track = m_next_tracks.front(); + m_next_tracks.pop_front(); + } + else { if (GetSongNum() > 1) { song_track = CCommon::Random(0, GetSongNum()); - m_random_list.push_back(song_track); //保存随机播放过的曲目 } else { song_track = 0; //只有一首歌 - m_random_list.push_back(song_track); //保存随机播放过的曲目 } } - else if (song_track == PREVIOUS) //回溯上一个随机播放曲目 - { - if (m_random_list.size() >= 2) - { - if (m_index == m_random_list.back()) - m_random_list.pop_back(); - song_track = m_random_list.back(); - } - else - { - MusicControl(Command::STOP); //无法回溯时停止播放 - return true; - } - } - else if (song_track >= 0 && song_track < GetSongNum() && song_track != m_index) //手动指定歌曲时 - { - m_random_list.push_back(song_track); //保存随机播放过的曲目 - } - break; - - case RM_LOOP_TRACK: //单曲循环 - if (auto_next) - { - if (song_track == NEXT || song_track == PREVIOUS) - song_track = m_index; - } - else - { - LoopPlaylist(song_track); //如果不是播放完成后自动下一曲,则执行列表循环中的代码 - } - break; - - case RM_LOOP_PLAYLIST: //列表循环 - LoopPlaylist(song_track); - break; - - case RM_PLAY_TRACK: - if (auto_next) - { - if (song_track == NEXT || song_track == PREVIOUS) - { - MusicControl(Command::STOP); - return false; - } - } - else - { - LoopPlaylist(song_track); //如果不是播放完成后自动下一曲,则执行列表循环中的代码 - } - break; + m_random_list.push_back(song_track); //保存随机播放过的曲目 } + else if (song_track == PREVIOUS) //回溯上一个随机播放曲目 + { + if (m_random_list.size() >= 2) + { + if (m_index == m_random_list.back()) + m_random_list.pop_back(); + song_track = m_random_list.back(); + } + else + { + MusicControl(Command::STOP); //无法回溯时停止播放 + return true; + } + } + else if (song_track >= 0 && song_track < GetSongNum() && song_track != m_index) //手动指定歌曲时 + { + m_random_list.push_back(song_track); //保存随机播放过的曲目 + } + break; + case RM_LOOP_TRACK: //单曲循环 + if (auto_next) + { + if (song_track == NEXT) + { + if (!m_next_tracks.empty()) { + song_track = m_next_tracks.front(); + m_next_tracks.pop_front(); + } + else { + song_track = m_index; + } + } + else if (song_track == PREVIOUS) + song_track = m_index; + } + else + { + LoopPlaylist(song_track); //如果不是播放完成后自动下一曲,则执行列表循环中的代码 + } + break; + + case RM_LOOP_PLAYLIST: //列表循环 + if (!m_next_tracks.empty()) { + song_track = m_next_tracks.front(); + m_next_tracks.pop_front(); + } + else + { + LoopPlaylist(song_track); + } + break; + + case RM_PLAY_TRACK: + if (auto_next) + { + if (song_track == NEXT || song_track == PREVIOUS) + { + MusicControl(Command::STOP); + return false; + } + } + else + { + LoopPlaylist(song_track); //如果不是播放完成后自动下一曲,则执行列表循环中的代码 + } + break; } bool valid = (song_track >= 0 && song_track < GetSongNum()); @@ -944,41 +992,7 @@ bool CPlayer::PlayAfterCurrentTrack(vector tracks_to_play) { return false; } m_next_tracks.insert(m_next_tracks.begin(), tracks_to_play.begin(), tracks_to_play.end()); - //switch (m_repeat_mode) { - //case RM_PLAY_SHUFFLE: - // //TODO 无序播放的处理 - // //一首的代码,之前写的,姑且保留 - // //if (tracks_to_play.size() == 1) - // //{ - // // if (m_shuffle_list.size() != m_playlist.size()) - // // InitShuffleList(); - // // int song_track = tracks_to_play[0]; - // // if (song_track == m_index) - // // break; - // // if (GetSongNum() > 1) { - // // //交换两首歌在列表中的位置 - // // for (size_t i{ 0 }; i < m_shuffle_list.size(); ++i) - // // { - // // if (m_shuffle_list[i] == song_track) - // // { - // // int tmp = m_shuffle_list[i]; - // // int next = GetNextShuffled(); - // // m_shuffle_list[i] = m_shuffle_list[next]; - // // m_shuffle_list[next] = tmp; - // // break; - // // } - // // } - // // } - // //} - // break; - //case RM_PLAY_RANDOM: - //case RM_LOOP_PLAYLIST: - //case RM_LOOP_TRACK: - // //m_next_song = song_track; - // break; - //default: - // break; - //} + // TODO 无序播放时的修改 return true; } @@ -1760,7 +1774,7 @@ bool CPlayer::RemoveSong(int index) m_album_cover_blur.Destroy(); m_Lyrics = CLyrics(); } - m_random_list.clear(); + OnPlaylistChange(); return true; } return false; @@ -1867,7 +1881,7 @@ bool CPlayer::MoveUp(int first, int last) std::swap(m_playlist[i - 1], m_playlist[i]); } SaveCurrentPlaylist(); - m_random_list.clear(); + OnPlaylistChange(); return true; } @@ -1891,7 +1905,7 @@ bool CPlayer::MoveDown(int first, int last) std::swap(m_playlist[i], m_playlist[i - 1]); } SaveCurrentPlaylist(); - m_random_list.clear(); + OnPlaylistChange(); return true; } @@ -1964,7 +1978,7 @@ int CPlayer::MoveItems(std::vector indexes, int dest) else m_index = iter_play - m_playlist.begin(); - m_random_list.clear(); + OnPlaylistChange(); return dest_index; } @@ -2060,7 +2074,7 @@ SongInfo CPlayer::GetNextTrack() const case RM_PLAY_SHUFFLE: { - int shuffle_index = GetNextShuffled(); + int shuffle_index = GetNextShuffleIdx(); if (shuffle_index == 0 && m_is_shuffle_list_played || m_shuffle_index < 0 || m_shuffle_list.empty()) { //如果shuffle_index == 0且列表播放过,说明列表中的曲目已经无序播放完一遍,此时无序列表要重新生成,因此下一首曲目是不确定的 @@ -2286,7 +2300,7 @@ void CPlayer::SortPlaylist(bool change_index) } } } - m_random_list.clear(); + OnPlaylistChange(); SaveCurrentPlaylist(); } @@ -2300,7 +2314,7 @@ void CPlayer::InvertPlaylist() //当前播放曲目更改 m_index = m_playlist.size() - m_index - 1; - m_random_list.clear(); + OnPlaylistChange(); SaveCurrentPlaylist(); } @@ -2811,7 +2825,7 @@ bool CPlayer::RemoveSongNotPlay(int index) m_index--; } } - m_random_list.clear(); + OnPlaylistChange(); return true; } return false; diff --git a/MusicPlayer2/Player.h b/MusicPlayer2/Player.h index 06ba16bc..24236fd4 100644 --- a/MusicPlayer2/Player.h +++ b/MusicPlayer2/Player.h @@ -152,8 +152,8 @@ private: vector m_shuffle_list; //储存乱序播放过的曲目序号 int m_shuffle_index{}; //乱序播放时当前的索引 bool m_is_shuffle_list_played{ false }; - inline int GetNextShuffled() const; //返回乱序播放下下一曲的序号 - inline int GetPrevShuffled() const; //返回乱序播放下前一曲的序号 + inline int GetNextShuffleIdx() const; //返回乱序播放下下一曲的序号 + inline int GetPrevShuffleIdx() const; //返回乱序播放下前一曲的序号 std::list m_random_list; //随机播放模式下的历史记录,用于回溯之前的记录 deque m_next_tracks{}; //下n首播放的歌曲,用于“下一首播放” @@ -187,6 +187,7 @@ public: void SaveRecentPath() const; //将最近路径列表保存到文件 void OnExit(); //退出时的处理 void IniPlaylistComplate(); //播放列表加载完毕时的处理 + void OnPlaylistChange(); //播放列表有修改时的相关操作 void SetEqualizer(int channel, int gain); //设置均衡器(channel为通道,取值为0~9,gain为增益,取值为-15~15) int GeEqualizer(int channel); //获取指定均衡器通道的增益