You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

141 lines
2.8 KiB

<template>
<div>
<div id="waveform" />
<v-row
no-gutters
align="center"
class="mb-3 mt-1"
>
<v-col md="8">
<v-slider
v-model="zoom"
min="0"
max="500"
step="10"
:append-icon="mdiMagnifyPlusOutline"
:prepend-icon="mdiMagnifyMinusOutline"
hide-details
@click:append="zoomIn"
@click:prepend="zoomOut"
@change="onChangeZoom"
/>
</v-col>
<v-col md="2">
<v-slider
v-model="volume"
min="0"
max="1"
step="0.1"
:append-icon="mdiVolumeHigh"
hide-details
@change="onChangeVolume"
/>
</v-col>
<v-col md="2">
<v-select
v-model="speed"
:items="speeds"
label="Speed"
dense
outlined
hide-details
@change="onChangeSpeed"
/>
</v-col>
</v-row>
<v-btn
color="primary"
class="text-capitalize"
@click="play"
>
<v-icon
v-if="!isPlaying"
left
>
{{ mdiPlayCircleOutline }}
</v-icon>
<v-icon
v-else
left
>
{{ mdiPauseCircleOutline }}
</v-icon>
<span v-if="!isPlaying">Play</span>
<span v-else>Pause</span>
</v-btn>
</div>
</template>
<script>
import Vue from 'vue'
import WaveSurfer from 'wavesurfer.js'
import { mdiPlayCircleOutline, mdiPauseCircleOutline, mdiVolumeHigh, mdiMagnifyPlusOutline, mdiMagnifyMinusOutline } from '@mdi/js'
export default Vue.extend({
props: {
source: {
type: String,
default: '',
required: true
}
},
data() {
return {
wavesurfer: null,
isPlaying: false,
zoom: 0,
volume: 0.6,
speed: 1,
speeds: [0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0],
mdiPlayCircleOutline,
mdiPauseCircleOutline,
mdiVolumeHigh,
mdiMagnifyPlusOutline,
mdiMagnifyMinusOutline
}
},
watch: {
source() {
this.load()
this.isPlaying = false
}
},
mounted() {
this.wavesurfer = WaveSurfer.create({
container: '#waveform',
backend: "MediaElement"
})
this.load()
},
methods: {
load() {
this.wavesurfer.load(this.source)
},
play() {
this.isPlaying = !this.isPlaying
this.wavesurfer.playPause()
},
zoomOut() {
this.zoom = (this.zoom - 10) || 0
this.onChangeZoom(this.zoom)
},
zoomIn() {
this.zoom = (this.zoom + 10) || 500
this.onChangeZoom(this.zoom)
},
onChangeVolume(value) {
this.wavesurfer.setVolume(value)
},
onChangeZoom(value) {
this.wavesurfer.zoom(value)
},
onChangeSpeed(value) {
this.wavesurfer.setPlaybackRate(value)
}
}
})
</script>