1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-05-04 03:22:12 -04:00

audio: use typed PwNode list to assign audio devices

related to #2279
This commit is contained in:
bbedward
2026-05-03 10:04:31 -04:00
parent d2f6cb3ae4
commit 434490e100

View File

@@ -84,19 +84,51 @@ Singleton {
return Pipewire.nodes.values.filter(node => node.audio && node.isSink && !node.isStream && !hidden.includes(node.name)); return Pipewire.nodes.values.filter(node => node.audio && node.isSink && !node.isStream && !hidden.includes(node.name));
} }
// Resolve a PwNode by name from the live typed list and assign it as the property list<PwNode> typedSinks: []
// default sink. Going through Pipewire.nodes.values directly (no .filter property list<PwNode> typedSources: []
// / spread / .sort / property var) avoids QML type erasure to QObject*,
// which newer quickshell rejects when assigning to preferredDefaultAudioSink. function rebuildTypedNodeLists() {
const newSinks = [];
const newSources = [];
for (const node of Pipewire.nodes.values) {
if (!node?.audio || node.isStream)
continue;
if (node.isSink)
newSinks.push(node);
else
newSources.push(node);
}
typedSinks = newSinks;
typedSources = newSources;
}
Connections {
target: Pipewire.nodes
function onValuesChanged() {
root.rebuildTypedNodeLists();
}
}
function setSink(node: PwNode): bool {
if (!node)
return false;
Pipewire.preferredDefaultAudioSink = node;
return true;
}
function setSource(node: PwNode): bool {
if (!node)
return false;
Pipewire.preferredDefaultAudioSource = node;
return true;
}
function setDefaultSinkByName(name) { function setDefaultSinkByName(name) {
if (!name) if (!name)
return false; return false;
for (let i = 0; i < Pipewire.nodes.values.length; i++) { for (const node of typedSinks) {
const node = Pipewire.nodes.values[i]; if (node?.name === name)
if (node && node.name === name && node.audio && node.isSink && !node.isStream) { return setSink(node);
Pipewire.preferredDefaultAudioSink = node;
return true;
}
} }
return false; return false;
} }
@@ -104,12 +136,9 @@ Singleton {
function setDefaultSourceByName(name) { function setDefaultSourceByName(name) {
if (!name) if (!name)
return false; return false;
for (let i = 0; i < Pipewire.nodes.values.length; i++) { for (const node of typedSources) {
const node = Pipewire.nodes.values[i]; if (node?.name === name)
if (node && node.name === name && node.audio && !node.isSink && !node.isStream) { return setSource(node);
Pipewire.preferredDefaultAudioSource = node;
return true;
}
} }
return false; return false;
} }
@@ -123,8 +152,7 @@ Singleton {
const currentIndex = sinks.findIndex(s => s.name === currentName); const currentIndex = sinks.findIndex(s => s.name === currentName);
const nextIndex = (currentIndex + 1) % sinks.length; const nextIndex = (currentIndex + 1) % sinks.length;
const nextSink = sinks[nextIndex]; const nextSink = sinks[nextIndex];
if (!setDefaultSinkByName(nextSink.name)) setDefaultSinkByName(nextSink.name);
Pipewire.preferredDefaultAudioSink = nextSink;
const name = displayName(nextSink); const name = displayName(nextSink);
audioOutputCycled(name, sinkIcon(nextSink)); audioOutputCycled(name, sinkIcon(nextSink));
return name; return name;
@@ -1097,6 +1125,8 @@ EOFCONFIG
} }
Component.onCompleted: { Component.onCompleted: {
rebuildTypedNodeLists();
if (soundsAvailable) { if (soundsAvailable) {
checkGsettings(); checkGsettings();
Qt.callLater(createSoundPlayers); Qt.callLater(createSoundPlayers);