1. 未选中歌曲时,下一首播放选项变灰
2. 播放列表变动时的处理
3. 随机播放模式回到上一首
This commit is contained in:
Vic
2022-08-19 01:52:34 +08:00
parent 97968e1a4c
commit f918c1d07a
3 changed files with 151 additions and 136 deletions
+1 -1
View File
@@ -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);
}
+147 -133
View File
@@ -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<int> 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<int> 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;
+3 -2
View File
@@ -152,8 +152,8 @@ private:
vector<int> 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<int> m_random_list; //随机播放模式下的历史记录,用于回溯之前的记录
deque<int> 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); //获取指定均衡器通道的增益