blob: a50b3306fc03a9941d9eb7359c7dc98d78d678d0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
// Copyright (C) 2026 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
import QtQuick.Layouts
import QtQuick.Dialogs
import QtMultimedia
import Drumpad
import Audio
Rectangle {
id: root
property string decodingError: ""
required property int index
property int status: SoundEffect.Null
property bool isLoading: status == SoundEffect.Loading
property bool isError: status == SoundEffect.Error || status == SoundEffect.Null
property bool isReady: status == SoundEffect.Ready
function play() {
if (root.status == SoundEffect.Ready) {
audioEngine.play();
}
}
color: Constants.darkGray
implicitHeight: layout.implicitHeight + 2 * layout.anchors.margins
implicitWidth: layout.implicitWidth + 2 * layout.anchors.margins
radius: 10
onDecodingErrorChanged: {
if (status == SoundEffect.Error && root.decodingError) {
errorMessageDialog.text = root.decodingError;
errorMessageDialog.open();
}
}
AudioEngine {
id: audioEngine
file: availableSoundsComboBox.currentFile
volume: volumeSlider.value
onDecodingStatusChanged: (status, error) => {
root.status = status;
if (status == SoundEffect.Error && error) {
root.decodingError = error;
} else {
root.decodingError = "";
}
}
}
MessageDialog {
id: errorMessageDialog
buttons: MessageDialog.Ok
title: "Error decoding file"
}
ColumnLayout {
id: layout
anchors.fill: parent
anchors.margins: 10
spacing: 10
RowLayout {
spacing: 10
Text {
Layout.alignment: Qt.AlignVCenter
Layout.fillWidth: true
color: "white"
text: `Player ${root.index + 1}`
}
AvailableSoundsComboBox {
id: availableSoundsComboBox
Layout.alignment: Qt.AlignCenter
initialIndex: root.index
}
}
WaveformItem {
id: waveformItem
file: audioEngine.file
height: 100
width: 300
}
Row {
Layout.alignment: Qt.AlignCenter
spacing: 10
PadButton {
id: padRectangle
height: 100
width: 100
isPlaying: audioEngine.isPlaying
isError: root.isError
isLoading: root.isLoading
onPressed: root.play()
}
VolumeSlider {
id: volumeSlider
height: padRectangle.height
value: 0.75
width: 16
}
}
}
}
|