274 lines
7.8 KiB
QML
274 lines
7.8 KiB
QML
import QtQuick
|
|
import QtQuick.Window
|
|
import QtQuick.Layouts
|
|
import QtQuick.Controls
|
|
import QtQuick.Controls.Material
|
|
import QtMultimedia
|
|
|
|
|
|
Item {
|
|
width: 200
|
|
height: 80
|
|
|
|
property bool loop: false
|
|
|
|
function loadSound(audio_path) {
|
|
player.stop()
|
|
player.source = audio_path
|
|
buttonPlay.icon.color = Material.accent
|
|
buttonPlay.enabled = true
|
|
buttonLoop.enabled = true
|
|
}
|
|
|
|
function playSound() {
|
|
buttonPlay.icon.color = Material.foreground
|
|
buttonPause.icon.color = Material.accent
|
|
buttonStop.icon.color = Material.accent
|
|
buttonPlay.enabled = false
|
|
buttonPause.enabled = true
|
|
buttonStop.enabled = true
|
|
buttonLoop.enabled = true
|
|
positionSlider.enabled = player.seekable
|
|
player.play()
|
|
}
|
|
|
|
function pauseSound() {
|
|
buttonPlay.icon.color = Material.accent
|
|
buttonPause.icon.color = Material.foreground
|
|
buttonPlay.enabled = true
|
|
buttonPause.enabled = false
|
|
player.pause()
|
|
}
|
|
|
|
function stopSound() {
|
|
buttonPlay.icon.color = Material.accent
|
|
buttonPause.icon.color = Material.foreground
|
|
buttonStop.icon.color = Material.foreground
|
|
buttonLoop.icon.color = Material.foreground
|
|
buttonPlay.enabled = true
|
|
buttonPause.enabled = false
|
|
buttonStop.enabled = false
|
|
buttonLoop.enabled = false
|
|
loop = false
|
|
player.stop()
|
|
}
|
|
|
|
function resetPlayer() {
|
|
player.stop()
|
|
player.source = ''
|
|
loop = false
|
|
buttonPlay.icon.color = Material.foreground
|
|
buttonPause.icon.color = Material.foreground
|
|
buttonStop.icon.color = Material.foreground
|
|
buttonLoop.icon.color = Material.foreground
|
|
buttonPlay.enabled = false
|
|
buttonPause.enabled = false
|
|
buttonStop.enabled = false
|
|
buttonLoop.enabled = false
|
|
positionSlider.enabled = false
|
|
}
|
|
|
|
Window {
|
|
id: audioSettingWindow
|
|
|
|
width: 450
|
|
height: 150
|
|
|
|
maximumHeight: height
|
|
maximumWidth: width
|
|
|
|
minimumHeight: height
|
|
minimumWidth: width
|
|
|
|
modality: Qt.ApplicationModal
|
|
flags: Qt.Dialog
|
|
|
|
title: qsTr("Artemis - Audio Player Settings")
|
|
|
|
Component.onCompleted: {
|
|
x = Screen.width / 2 - width / 2
|
|
y = Screen.height / 2 - height / 2
|
|
}
|
|
|
|
Page {
|
|
anchors.fill: parent
|
|
|
|
ColumnLayout {
|
|
anchors.fill: parent
|
|
anchors.rightMargin: 10
|
|
anchors.leftMargin: 10
|
|
anchors.bottomMargin: 10
|
|
anchors.topMargin: 10
|
|
|
|
RowLayout {
|
|
Layout.fillWidth: true
|
|
|
|
Label {
|
|
text: "Audio Output"
|
|
font.pixelSize: 12
|
|
clip: true
|
|
Layout.fillWidth: true
|
|
}
|
|
|
|
ComboBox {
|
|
id: audioOutputComboBox
|
|
Layout.preferredWidth: 200
|
|
model: mediaDevices.audioOutputs
|
|
textRole: "description"
|
|
onCurrentIndexChanged: {
|
|
audioOutput.device = mediaDevices.audioOutputs[currentIndex]
|
|
}
|
|
}
|
|
}
|
|
|
|
RowLayout {
|
|
Layout.fillWidth: true
|
|
Label {
|
|
text: "Volume"
|
|
font.pixelSize: 12
|
|
clip: true
|
|
Layout.fillWidth: true
|
|
}
|
|
Slider {
|
|
id: volumeSlider
|
|
Layout.preferredHeight: 20
|
|
Layout.preferredWidth: 200
|
|
value: 0.5
|
|
}
|
|
}
|
|
|
|
RowLayout {
|
|
Layout.fillWidth: true
|
|
Label {
|
|
text: "Replay (Loop)"
|
|
font.pixelSize: 12
|
|
clip: true
|
|
Layout.fillWidth: true
|
|
}
|
|
RoundButton {
|
|
id: buttonLoop
|
|
icon.color: Material.foreground
|
|
icon.source: "qrc:/images/icons/player_loop.svg"
|
|
display: AbstractButton.IconOnly
|
|
enabled: false
|
|
flat: true
|
|
onClicked: {
|
|
if (loop) {
|
|
loop = false
|
|
icon.color = Material.foreground
|
|
} else {
|
|
loop = true
|
|
icon.color = Material.accent
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Item {
|
|
Layout.fillHeight: true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
ColumnLayout {
|
|
anchors.fill: parent
|
|
spacing: 0
|
|
RowLayout {
|
|
spacing: 0
|
|
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
|
|
|
|
RoundButton {
|
|
id: buttonPlay
|
|
icon.color: Material.foreground
|
|
icon.source: "qrc:/images/icons/player_play.svg"
|
|
display: AbstractButton.IconOnly
|
|
enabled: false
|
|
flat: true
|
|
onClicked: playSound()
|
|
}
|
|
|
|
Item {
|
|
Layout.fillWidth: true
|
|
}
|
|
|
|
RoundButton {
|
|
id: buttonPause
|
|
icon.color: Material.foreground
|
|
icon.source: "qrc:/images/icons/player_pause.svg"
|
|
display: AbstractButton.IconOnly
|
|
enabled: false
|
|
flat: true
|
|
onClicked: pauseSound()
|
|
}
|
|
|
|
Item {
|
|
Layout.fillWidth: true
|
|
}
|
|
|
|
RoundButton {
|
|
id: buttonStop
|
|
icon.color: Material.foreground
|
|
icon.source: "qrc:/images/icons/player_stop.svg"
|
|
display: AbstractButton.IconOnly
|
|
enabled: false
|
|
flat: true
|
|
onClicked: stopSound()
|
|
}
|
|
|
|
Item {
|
|
Layout.fillWidth: true
|
|
}
|
|
|
|
RoundButton {
|
|
id: buttonSettings
|
|
icon.color: Material.foreground
|
|
icon.source: "qrc:/images/icons/settings.svg"
|
|
display: AbstractButton.IconOnly
|
|
enabled: true
|
|
flat: true
|
|
onClicked: {
|
|
audioSettingWindow.show()
|
|
}
|
|
}
|
|
}
|
|
|
|
RowLayout {
|
|
Slider {
|
|
id: positionSlider
|
|
Layout.preferredHeight: 20
|
|
enabled: player.seekable
|
|
value: player.duration > 0 ? player.position / player.duration : 0
|
|
Layout.fillWidth: true
|
|
onMoved: {
|
|
player.position = player.duration * positionSlider.position
|
|
}
|
|
}
|
|
}
|
|
|
|
MediaPlayer {
|
|
id: player
|
|
audioOutput: audioOutput
|
|
onPlaybackStateChanged: {
|
|
if (player.playbackState === MediaPlayer.StoppedState) {
|
|
if (loop) {
|
|
playSound()
|
|
} else {
|
|
stopSound()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
AudioOutput {
|
|
id: audioOutput
|
|
device: mediaDevices.defaultAudioOutput
|
|
volume: volumeSlider.value
|
|
}
|
|
|
|
MediaDevices {
|
|
id: mediaDevices
|
|
}
|
|
}
|
|
}
|