137 lines
4.4 KiB
QML
137 lines
4.4 KiB
QML
import Quickshell
|
|
import Quickshell.Io
|
|
import Quickshell.Services.Pipewire
|
|
import QtQuick
|
|
|
|
import "services/AudioStreams.js" as AudioStreams
|
|
import qs.services
|
|
|
|
ShellRoot {
|
|
readonly property int audioOutStreamFlag: 4
|
|
|
|
property var fixtureNodes: [
|
|
{
|
|
id: 10,
|
|
ready: true,
|
|
type: audioOutStreamFlag,
|
|
properties: {
|
|
"application.id": "org.chromium.Chromium",
|
|
"application.name": "Chromium",
|
|
"application.icon_name": "chromium"
|
|
},
|
|
description: "Chromium audio",
|
|
audio: { volume: 0.4, muted: false }
|
|
},
|
|
{
|
|
id: 11,
|
|
ready: true,
|
|
type: audioOutStreamFlag,
|
|
properties: {
|
|
"application.id": "org.chromium.Chromium",
|
|
"application.name": "Chromium",
|
|
"application.icon_name": "chromium"
|
|
},
|
|
description: "Chromium audio",
|
|
audio: { volume: 0.8, muted: true }
|
|
},
|
|
{
|
|
id: 20,
|
|
ready: true,
|
|
type: audioOutStreamFlag,
|
|
properties: {
|
|
"application.process.binary": "spotify",
|
|
"application.name": "Spotify"
|
|
},
|
|
description: "Spotify",
|
|
audio: { volume: 0.25, muted: false }
|
|
},
|
|
{
|
|
id: 30,
|
|
ready: true,
|
|
type: 2,
|
|
properties: { "application.name": "Microphone capture" },
|
|
description: "Input stream",
|
|
audio: { volume: 0.5, muted: false }
|
|
},
|
|
{
|
|
id: 40,
|
|
ready: false,
|
|
type: audioOutStreamFlag,
|
|
properties: { "application.name": "Not ready" },
|
|
description: "Unready stream",
|
|
audio: { volume: 0.5, muted: false }
|
|
},
|
|
{
|
|
id: 99,
|
|
ready: true,
|
|
type: audioOutStreamFlag,
|
|
properties: {},
|
|
description: "",
|
|
audio: { volume: 1, muted: false }
|
|
}
|
|
]
|
|
|
|
function groups(): var {
|
|
return AudioStreams.group(fixtureNodes, audioOutStreamFlag);
|
|
}
|
|
|
|
IpcHandler {
|
|
target: "application-volume-test"
|
|
|
|
function summary(): string {
|
|
const applications = groups();
|
|
const chromium = applications.find(application =>
|
|
application.key === "org.chromium.Chromium");
|
|
return JSON.stringify({
|
|
groups: applications.map(application => ({
|
|
key: application.key,
|
|
label: application.label,
|
|
icon: application.icon,
|
|
count: application.nodes.length
|
|
})),
|
|
chromiumVolume: AudioStreams.volume(chromium),
|
|
chromiumMuted: AudioStreams.muted(chromium)
|
|
});
|
|
}
|
|
|
|
function mutateVolume(): string {
|
|
const chromium = groups().find(application =>
|
|
application.key === "org.chromium.Chromium");
|
|
const changed = AudioStreams.setVolume(chromium, 0.7);
|
|
return JSON.stringify({
|
|
changed,
|
|
volumes: chromium.nodes.map(node => node.audio.volume),
|
|
muted: chromium.nodes.map(node => node.audio.muted)
|
|
});
|
|
}
|
|
|
|
function mutateMute(): string {
|
|
const chromium = groups().find(application =>
|
|
application.key === "org.chromium.Chromium");
|
|
const changed = AudioStreams.setMuted(chromium, true);
|
|
return JSON.stringify({
|
|
changed,
|
|
muted: chromium.nodes.map(node => node.audio.muted)
|
|
});
|
|
}
|
|
|
|
function serviceSummary(): string {
|
|
const applications = AudioDevices.applications;
|
|
return JSON.stringify({
|
|
count: applications.length,
|
|
validTypes: applications.every(application =>
|
|
application.nodes.every(node =>
|
|
(node.type & PwNodeType.AudioOutStream)
|
|
=== PwNodeType.AudioOutStream))
|
|
});
|
|
}
|
|
|
|
function invalidMutations(): string {
|
|
return JSON.stringify({
|
|
nullVolume: AudioDevices.setApplicationVolume(null, 0.5),
|
|
emptyMute: AudioDevices.setApplicationMuted({ nodes: [] }, true)
|
|
});
|
|
}
|
|
}
|
|
}
|