add mute toggle

This commit is contained in:
Thomas Amland 2021-01-30 21:24:34 +01:00
parent fef13f18a9
commit 8b4c482efa
3 changed files with 23 additions and 7 deletions

View File

@ -48,12 +48,12 @@
<div class="col-auto col-sm p-0"> <div class="col-auto col-sm p-0">
<div class="d-flex flex-nowrap justify-content-end pr-3"> <div class="d-flex flex-nowrap justify-content-end pr-3">
<div class="m-0 d-none d-sm-inline-flex align-items-center pr-3"> <div class="m-0 d-none d-sm-inline-flex align-items-center pr-3">
<b-button variant="link"> <b-button variant="link" @click="toggleMute">
<Icon class="volume-icon" icon="volume-up-fill" /> <Icon :icon="muteActive ? 'volume-mute-fill' : 'volume-up-fill'" />
</b-button> </b-button>
<b-form-input type="range" min="0" max="1" step="0.05" style="width: 130px" <b-form-input type="range" min="0" max="1" step="0.05" style="width: 130px"
:title="`Volume: ${Math.round(volume * 100)}%`" :title="`Volume: ${Math.round(volume * 100)}%`"
:value="volume" @input="setVolume" /> :value="muteActive ? 0.0 : volume" @input="setVolume" />
</div> </div>
<b-button variant="link" <b-button variant="link"
class="m-0 d-none d-sm-inline-block " class="m-0 d-none d-sm-inline-block "
@ -130,6 +130,7 @@
currentTime: (state: any) => state.currentTime, currentTime: (state: any) => state.currentTime,
repeatActive: (state: any) => state.repeat, repeatActive: (state: any) => state.repeat,
shuffleActive: (state: any) => state.shuffle, shuffleActive: (state: any) => state.shuffle,
muteActive: (state: any) => state.mute,
visible: (state: any) => state.queue.length > 0, visible: (state: any) => state.queue.length > 0,
volume: (state: any) => state.volume, volume: (state: any) => state.volume,
}), }),
@ -145,6 +146,7 @@
'previous', 'previous',
'toggleRepeat', 'toggleRepeat',
'toggleShuffle', 'toggleShuffle',
'toggleMute',
]), ]),
seek(event: any) { seek(event: any) {
if (event.target) { if (event.target) {

View File

@ -5,11 +5,12 @@ import { API } from '@/shared/api'
const audio = new Audio() const audio = new Audio()
const storedQueue = JSON.parse(localStorage.getItem('queue') || '[]') const storedQueue = JSON.parse(localStorage.getItem('queue') || '[]')
const storedQueueIndex = parseInt(localStorage.getItem('queueIndex') || '-1') const storedQueueIndex = parseInt(localStorage.getItem('queueIndex') || '-1')
const storedVolume = parseFloat(localStorage.getItem('player.volume') || '1.0')
if (storedQueueIndex > -1 && storedQueueIndex < storedQueue.length) { if (storedQueueIndex > -1 && storedQueueIndex < storedQueue.length) {
audio.src = storedQueue[storedQueueIndex].url audio.src = storedQueue[storedQueueIndex].url
} }
audio.volume = storedVolume const storedVolume = parseFloat(localStorage.getItem('player.volume') || '1.0')
const storedMuteState = localStorage.getItem('player.mute') === 'true'
audio.volume = storedMuteState ? 0.0 : storedVolume
const mediaSession: MediaSession | undefined = navigator.mediaSession const mediaSession: MediaSession | undefined = navigator.mediaSession
interface State { interface State {
@ -21,6 +22,7 @@ interface State {
currentTime: number; // position of current track in seconds currentTime: number; // position of current track in seconds
repeat: boolean; repeat: boolean;
shuffle: boolean; shuffle: boolean;
mute: boolean;
volume: number; // integer between 0 and 1 representing the volume of the player volume: number; // integer between 0 and 1 representing the volume of the player
} }
@ -35,6 +37,7 @@ export const playerModule: Module<State, any> = {
currentTime: 0, currentTime: 0,
repeat: localStorage.getItem('player.repeat') !== 'false', repeat: localStorage.getItem('player.repeat') !== 'false',
shuffle: localStorage.getItem('player.shuffle') === 'true', shuffle: localStorage.getItem('player.shuffle') === 'true',
mute: storedMuteState,
volume: storedVolume, volume: storedVolume,
}, },
@ -59,6 +62,10 @@ export const playerModule: Module<State, any> = {
state.shuffle = enable state.shuffle = enable
localStorage.setItem('player.shuffle', enable) localStorage.setItem('player.shuffle', enable)
}, },
setMute(state, enable) {
state.mute = enable
localStorage.setItem('player.mute', enable)
},
setQueue(state, queue) { setQueue(state, queue) {
state.queue = queue state.queue = queue
state.queueIndex = -1 state.queueIndex = -1
@ -106,10 +113,11 @@ export const playerModule: Module<State, any> = {
setScrobbled(state) { setScrobbled(state) {
state.scrobbled = true state.scrobbled = true
}, },
setVolume(state, value: any) { setVolume(state, value: number) {
state.volume = value state.volume = value
state.mute = value <= 0.0
localStorage.setItem('player.volume', String(value)) localStorage.setItem('player.volume', String(value))
} },
}, },
actions: { actions: {
@ -178,6 +186,10 @@ export const playerModule: Module<State, any> = {
toggleShuffle({ commit, state }) { toggleShuffle({ commit, state }) {
commit('setShuffle', !state.shuffle) commit('setShuffle', !state.shuffle)
}, },
toggleMute({ commit, state }) {
commit('setMute', !state.mute)
audio.volume = state.mute ? 0.0 : state.volume
},
addToQueue({ commit }, track) { addToQueue({ commit }, track) {
commit('addToQueue', track) commit('addToQueue', track)
}, },

View File

@ -29,6 +29,7 @@
BIconRss, BIconRss,
BIconX, BIconX,
BIconVolumeUpFill, BIconVolumeUpFill,
BIconVolumeMuteFill,
} from 'bootstrap-vue' } from 'bootstrap-vue'
export default Vue.extend({ export default Vue.extend({
@ -58,6 +59,7 @@
BIconRss, BIconRss,
BIconX, BIconX,
BIconVolumeUpFill, BIconVolumeUpFill,
BIconVolumeMuteFill,
}, },
props: { props: {
icon: { type: String, required: true } icon: { type: String, required: true }