Skip to content

Commit

Permalink
add a queue to manage the random play list
Browse files Browse the repository at this point in the history
  • Loading branch information
YuziO2 committed Jun 26, 2022
1 parent 4c3b3c0 commit 5a66fe2
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 7 deletions.
10 changes: 10 additions & 0 deletions src/renderer/components/TrackList/TrackList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import { mapActions } from 'vuex';
import TrackItem from './TrackItem.vue';
import CenteredTip from '@/components/CenteredTip.vue';
import { LOOP_MODE } from '@/store/modules/playlist';
/** @typedef {{ event: string, icon: string, title: string }} TrackListShortcut */
Expand Down Expand Up @@ -82,6 +83,7 @@ export default {
'playTrackIndex',
'toggleCollectPopup',
'insertTrackIntoPlaylist',
'insertTrackIntoRandomPlaylist',
'playPlaylist'
]),
handleCollect(id) {
Expand All @@ -103,6 +105,11 @@ export default {
queueTrack(index) {
if (this.findTrackInPlaylist(index) > -1) {
// track exists in playlist
if (this.playlist.loopMode == LOOP_MODE.RANDOM) {
this.insertTrackIntoRandomPlaylist(index);
this.$toast.message('已添加下一首播放 _(:з」∠)_');
return;
}
this.$toast.message('已经在播放列表中了 ( >﹏<。)~');
return;
}
Expand All @@ -111,6 +118,9 @@ export default {
source: this.source,
index: this.playlist.index + 1
});
if (this.playlist.loopMode == LOOP_MODE.RANDOM) {
this.insertTrackIntoRandomPlaylist(this.playlist.index + 1);
}
this.$toast.message('已添加下一首播放 _(:з」∠)_');
},
handleQueue(index) {
Expand Down
60 changes: 54 additions & 6 deletions src/renderer/store/actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -414,12 +414,28 @@ export async function playTrackIndex({ state, commit, dispatch }, index) {
/**
* @param {ActionContext} param0
*/
export function playNextTrack({ dispatch, getters }) {
const { index, list, loopMode } = getters.queue;
export function playNextTrack({ commit, dispatch, getters }) {
const { index, list, loopMode, randomHeardList, randomHeardListPointer } = getters.queue;
let nextIndex;
switch (loopMode) {
case LOOP_MODE.RANDOM:
nextIndex = Math.floor(Math.random() * list.length);
if (!randomHeardList.length) {//第一次切歌,将当次歌曲也放入
//randomHeardList.push(index);
commit(types.PUSH_RANDOMLIST_HEARD_LIST, index);
nextIndex = Math.floor(Math.random() * list.length);
//randomHeardList.push(nextIndex);
commit(types.PUSH_RANDOMLIST_HEARD_LIST, nextIndex);
commit(types.SET_RANDOMLIST_POINTER, 1);
}
else if (randomHeardListPointer === randomHeardList.length - 1) {//若已到队列尾部,随机生成新歌
nextIndex = Math.floor(Math.random() * list.length);
commit(types.PUSH_RANDOMLIST_HEARD_LIST, nextIndex);
commit(types.SET_RANDOMLIST_POINTER, randomHeardListPointer + 1);
}
else {//否则,使用队列里的歌曲
nextIndex = randomHeardList[randomHeardListPointer + 1];
commit(types.SET_RANDOMLIST_POINTER, randomHeardListPointer + 1);
}
break;
default:
nextIndex = (index + 1) % list.length;
Expand All @@ -431,12 +447,28 @@ export function playNextTrack({ dispatch, getters }) {
/**
* @param {ActionContext} param0
*/
export function playPreviousTrack({ dispatch, getters }) {
const { index, list, loopMode } = getters.queue;
export function playPreviousTrack({ commit, dispatch, getters }) {
const { index, list, loopMode, randomHeardList, randomHeardListPointer } = getters.queue;
let nextIndex;
switch (loopMode) {
case LOOP_MODE.RANDOM:
nextIndex = Math.floor(Math.random() * list.length);
if (!randomHeardList.length) {
nextIndex = Math.floor(Math.random() * list.length);
commit(types.UNSHIFT_RANDOMLIST_HEARD_LIST, index);
commit(types.UNSHIFT_RANDOMLIST_HEARD_LIST, nextIndex);
// randomHeardList.unshift(index);
// randomHeardList.unshift(nextIndex);
commit(types.SET_RANDOMLIST_POINTER, 0);
}
else if (randomHeardListPointer === 0) {//若在队列头部,则在队列头插入随机新歌,此时指针不用变!
nextIndex = Math.floor(Math.random() * list.length);
//randomHeardList.unshift(nextIndex);
commit(types.UNSHIFT_RANDOMLIST_HEARD_LIST, nextIndex);
}
else {
nextIndex = randomHeardList[randomHeardListPointer - 1];
commit(types.SET_RANDOMLIST_POINTER, randomHeardListPointer - 1);
}
break;
default:
nextIndex = (index + list.length - 1) % list.length;
Expand All @@ -462,6 +494,8 @@ export async function playPlaylist({ commit, dispatch, state }, { tracks, source
}
if (firstIndex === -1 && state.playlist.loopMode === LOOP_MODE.RANDOM) {
firstIndex = Math.floor(Math.random() * list.length);
commit(types.CLEAR_RANDOMLIST);
commit(types.SET_RANDOMLIST_POINTER, 0);//换歌单了,重置随机队列
}
if (firstIndex === -1) {
firstIndex = 0;
Expand Down Expand Up @@ -587,6 +621,8 @@ export function nextLoopMode({ commit, state }) {
commit(types.SET_LOOP_MODE_SINGLE);
break;
case LOOP_MODE.SINGLE:
commit(types.CLEAR_RANDOMLIST);//换播放方式了,重置随机队列
commit(types.SET_RANDOMLIST_POINTER, 0);
commit(types.SET_LOOP_MODE_RANDOM);
break;
case LOOP_MODE.RANDOM:
Expand All @@ -609,10 +645,22 @@ export function insertTrackIntoPlaylist({ commit, state }, payload) {
commit(types.INSERT_TRACK_INTO_PLAYLIST, { tracks: payload.tracks, index });
}

/**
* @param {ActionContext} param0
* @param {number} payload
*/
export function insertTrackIntoRandomPlaylist({ commit, state }, payload) {
if (state.playlist.randomHeardList.length == 0)
commit(types.PUSH_RANDOMLIST_HEARD_LIST, 0);
commit(types.INSERT_TRACK_INTO_RANDOM_PLAYLIST, payload);
}

/**
* @param {ActionContext} param0
*/
export function removeTrackFromPlaylist({ getters, commit, dispatch }, payload) {
commit(types.CLEAR_RANDOMLIST);//删歌了,重置随机队列
commit(types.SET_RANDOMLIST_POINTER, 0);
const playingId = getters.playing.id;
commit(types.REMOVE_TRACK_FROM_PLAYLIST, payload);
if (playingId !== getters.playing.id) {
Expand Down
2 changes: 1 addition & 1 deletion src/renderer/store/getters.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

/**
* @param {State} state
* @returns {{ index: number, loopMode: number, list: Models.Track[] }}
* @returns {{ index: number, loopMode: number, list: Models.Track[], randomHeardList: number[], randomHeardListPointer: number }}
*/
export function queue(state) {
if (state.ui.radioMode === true) {
Expand Down
18 changes: 18 additions & 0 deletions src/renderer/store/modules/playlist.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ const state = {
loopMode: LOOP_MODE.LIST,
/** @type {Models.Track[]} */
list: [],
/** @type {[number]} */
randomHeardList: [],
randomHeardListPointer: 0,
};

/**
Expand All @@ -36,6 +39,21 @@ const mutations = {
[types.SET_LOOP_MODE_RANDOM](state) {
state.loopMode = LOOP_MODE.RANDOM;
},
[types.PUSH_RANDOMLIST_HEARD_LIST](state, payload) {
state.randomHeardList.push(payload);
},
[types.UNSHIFT_RANDOMLIST_HEARD_LIST](state, payload) {
state.randomHeardList.unshift(payload);
},
[types.SET_RANDOMLIST_POINTER](state, payload) {
state.randomHeardListPointer = payload;
},
[types.CLEAR_RANDOMLIST](state) {
state.randomHeardList = [];
},
[types.INSERT_TRACK_INTO_RANDOM_PLAYLIST](state, payload) {
state.randomHeardList.splice(state.randomHeardListPointer + 1, 0, payload);
},
[types.RESTORE_PLAYLIST](state, { index, loopMode, list }) {
state.index = index || 0;
state.loopMode = loopMode || LOOP_MODE.LIST;
Expand Down
5 changes: 5 additions & 0 deletions src/renderer/store/mutation-types.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ export const SET_CURRENT_INDEX = 'SET_CURRENT_INDEX';
export const SET_LOOP_MODE_LIST = 'SET_LOOP_MODE_LOOP';
export const SET_LOOP_MODE_SINGLE = 'SET_LOOP_MODE_SINGLE';
export const SET_LOOP_MODE_RANDOM = 'SET_LOOP_MODE_RANDOM';
export const PUSH_RANDOMLIST_HEARD_LIST = 'PUSH_RANDOMLIST_HEARD_LIST';
export const UNSHIFT_RANDOMLIST_HEARD_LIST = 'UNSHIFT_RANDOMLIST_HEARD_LIST';
export const SET_RANDOMLIST_POINTER = 'SET_RANDOMLIST_POINTER'
export const CLEAR_RANDOMLIST = 'CLEAR_RANDOMLIST';
export const INSERT_TRACK_INTO_RANDOM_PLAYLIST = 'INSERT_TRACK_INTO_RANDOM_PLAYLIST';
export const RESTORE_PLAYLIST = 'RESTORE_PLAYLIST';
export const INSERT_TRACK_INTO_PLAYLIST = 'INSERT_TRACK_INTO_PLAYLIST';
export const REMOVE_TRACK_FROM_PLAYLIST = 'REMOVE_TRACK_FROM_PLAYLIST';
Expand Down

0 comments on commit 5a66fe2

Please sign in to comment.