Changeset View
Changeset View
Standalone View
Standalone View
applet/contents/ui/main.qml
Show All 37 Lines | 33 | Item { | |||
---|---|---|---|---|---|
38 | property int volumeStep: Math.round(Plasmoid.configuration.volumeStep * PulseAudio.NormalVolume / 100.0) | 38 | property int volumeStep: Math.round(Plasmoid.configuration.volumeStep * PulseAudio.NormalVolume / 100.0) | ||
39 | property string displayName: i18n("Audio Volume") | 39 | property string displayName: i18n("Audio Volume") | ||
40 | property QtObject draggedStream: null | 40 | property QtObject draggedStream: null | ||
41 | property var maxVolumeList: Plasmoid.configuration.maxVolumeList | 41 | property var maxVolumeList: Plasmoid.configuration.maxVolumeList | ||
42 | 42 | | |||
43 | // DEFAULT_SINK_NAME in module-always-sink.c | 43 | // DEFAULT_SINK_NAME in module-always-sink.c | ||
44 | readonly property string dummyOutputName: "auto_null" | 44 | readonly property string dummyOutputName: "auto_null" | ||
45 | 45 | | |||
46 | property int preferredSinkMaxVolume: { | ||||
47 | var port = paSinkModel.preferredSink.ports[paSinkModel.preferredSink.activePortIndex]; | ||||
48 | var maxVolumeTarget = port ? port.description + " (" + paSinkModel.preferredSink.description + ")" | ||||
49 | : paSinkModel.preferredSink.description; | ||||
50 | | ||||
51 | if (maxVolumeList.indexOf(maxVolumeTarget) == -1) { | ||||
52 | return PulseAudio.NormalVolume; | ||||
53 | } else { | ||||
54 | return maxVolumeValue; | ||||
55 | } | ||||
56 | } | ||||
57 | | ||||
46 | Layout.minimumHeight: units.gridUnit * 18 | 58 | Layout.minimumHeight: units.gridUnit * 18 | ||
47 | Layout.minimumWidth: units.gridUnit * 18 | 59 | Layout.minimumWidth: units.gridUnit * 18 | ||
48 | Layout.preferredHeight: units.gridUnit * 20 | 60 | Layout.preferredHeight: units.gridUnit * 20 | ||
49 | Layout.preferredWidth: units.gridUnit * 20 | 61 | Layout.preferredWidth: units.gridUnit * 20 | ||
50 | 62 | | |||
51 | Plasmoid.icon: paSinkModel.preferredSink && !isDummyOutput(paSinkModel.preferredSink) ? Icon.name(paSinkModel.preferredSink.volume, paSinkModel.preferredSink.muted) | 63 | Plasmoid.icon: paSinkModel.preferredSink && !isDummyOutput(paSinkModel.preferredSink) ? Icon.name(paSinkModel.preferredSink.volume, paSinkModel.preferredSink.muted) | ||
52 | : Icon.name(0, true) | 64 | : Icon.name(0, true) | ||
53 | Plasmoid.switchWidth: units.gridUnit * 18 | 65 | Plasmoid.switchWidth: units.gridUnit * 18 | ||
Show All 11 Lines | 67 | Plasmoid.toolTipMainText: { | |||
65 | } | 77 | } | ||
66 | } | 78 | } | ||
67 | Plasmoid.toolTipSubText: paSinkModel.preferredSink && !isDummyOutput(paSinkModel.preferredSink) ? paSinkModel.preferredSink.description : "" | 79 | Plasmoid.toolTipSubText: paSinkModel.preferredSink && !isDummyOutput(paSinkModel.preferredSink) ? paSinkModel.preferredSink.description : "" | ||
68 | 80 | | |||
69 | function isDummyOutput(output) { | 81 | function isDummyOutput(output) { | ||
70 | return output && output.name === dummyOutputName; | 82 | return output && output.name === dummyOutputName; | ||
71 | } | 83 | } | ||
72 | 84 | | |||
73 | function boundVolume(volume) { | 85 | function boundVolume(volume, max) { | ||
74 | return Math.max(PulseAudio.MinimalVolume, Math.min(volume, maxVolumeValue)); | 86 | if (!max) { | ||
87 | max = maxVolumeValue; | ||||
88 | } | ||||
89 | return Math.max(PulseAudio.MinimalVolume, Math.min(volume, max)); | ||||
75 | } | 90 | } | ||
76 | 91 | | |||
77 | function volumePercent(volume, max) { | 92 | function volumePercent(volume, max) { | ||
78 | if (!max) { | 93 | if (!max) { | ||
79 | max = PulseAudio.NormalVolume; | 94 | max = PulseAudio.NormalVolume; | ||
80 | } | 95 | } | ||
81 | return Math.round(volume / max * 100.0); | 96 | return Math.round(volume / max * 100.0); | ||
82 | } | 97 | } | ||
83 | 98 | | |||
84 | function increaseVolume() { | 99 | function increaseVolume() { | ||
85 | if (!paSinkModel.preferredSink || isDummyOutput(paSinkModel.preferredSink)) { | 100 | if (!paSinkModel.preferredSink || isDummyOutput(paSinkModel.preferredSink)) { | ||
86 | return; | 101 | return; | ||
87 | } | 102 | } | ||
88 | var volume = boundVolume(paSinkModel.preferredSink.volume + volumeStep); | 103 | var volume = boundVolume(paSinkModel.preferredSink.volume + volumeStep, preferredSinkMaxVolume); | ||
89 | var percent = volumePercent(volume, maxVolumeValue); | 104 | var percent = volumePercent(volume, preferredSinkMaxVolume); | ||
90 | paSinkModel.preferredSink.muted = percent == 0; | 105 | paSinkModel.preferredSink.muted = percent == 0; | ||
91 | paSinkModel.preferredSink.volume = volume; | 106 | paSinkModel.preferredSink.volume = volume; | ||
92 | osd.show(percent); | 107 | osd.show(percent); | ||
93 | playFeedback(); | 108 | playFeedback(); | ||
94 | } | 109 | } | ||
95 | 110 | | |||
96 | function decreaseVolume() { | 111 | function decreaseVolume() { | ||
97 | if (!paSinkModel.preferredSink || isDummyOutput(paSinkModel.preferredSink)) { | 112 | if (!paSinkModel.preferredSink || isDummyOutput(paSinkModel.preferredSink)) { | ||
98 | return; | 113 | return; | ||
99 | } | 114 | } | ||
100 | var volume = boundVolume(paSinkModel.preferredSink.volume - volumeStep); | 115 | var volume = boundVolume(paSinkModel.preferredSink.volume - volumeStep, preferredSinkMaxVolume); | ||
101 | var percent = volumePercent(volume, maxVolumeValue); | 116 | var percent = volumePercent(volume, preferredSinkMaxVolume); | ||
102 | paSinkModel.preferredSink.muted = percent == 0; | 117 | paSinkModel.preferredSink.muted = percent == 0; | ||
103 | paSinkModel.preferredSink.volume = volume; | 118 | paSinkModel.preferredSink.volume = volume; | ||
104 | osd.show(percent); | 119 | osd.show(percent); | ||
105 | playFeedback(); | 120 | playFeedback(); | ||
106 | } | 121 | } | ||
107 | 122 | | |||
108 | function muteVolume() { | 123 | function muteVolume() { | ||
109 | if (!paSinkModel.preferredSink || isDummyOutput(paSinkModel.preferredSink)) { | 124 | if (!paSinkModel.preferredSink || isDummyOutput(paSinkModel.preferredSink)) { | ||
110 | return; | 125 | return; | ||
111 | } | 126 | } | ||
112 | var toMute = !paSinkModel.preferredSink.muted; | 127 | var toMute = !paSinkModel.preferredSink.muted; | ||
113 | paSinkModel.preferredSink.muted = toMute; | 128 | paSinkModel.preferredSink.muted = toMute; | ||
114 | osd.show(toMute ? 0 : volumePercent(paSinkModel.preferredSink.volume, maxVolumeValue)); | 129 | osd.show(toMute ? 0 : volumePercent(paSinkModel.preferredSink.volume, preferredSinkMaxVolume)); | ||
115 | if (!toMute) { | 130 | if (!toMute) { | ||
116 | playFeedback(); | 131 | playFeedback(); | ||
117 | } | 132 | } | ||
118 | } | 133 | } | ||
119 | 134 | | |||
120 | function increaseMicrophoneVolume() { | 135 | function increaseMicrophoneVolume() { | ||
121 | if (!paSourceModel.defaultSource) { | 136 | if (!paSourceModel.defaultSource) { | ||
122 | return; | 137 | return; | ||
▲ Show 20 Lines • Show All 409 Lines • Show Last 20 Lines |