# ===== Skrypt automatycznej instalacji poprawek (USB, Audio, DroidCam) =====
# Opis: Skrypt łączy wszystkie poprawki w jeden proces. Automatycznie wykrywa wersję WirePlumber (0.4 vs 0.5+) dla dystrybucji Ubuntu/Kubuntu i konfiguruje system pod kątem bezawaryjnego streamingu z OBS Flatpak.
# 1. Pobranie i uruchomienie skryptu instalacyjnego
cat << 'EOF' > setup-obs-fix.sh
#!/bin/bash
set -e
echo "=== [1/4] Wyłączanie autosuspendu USB (Globalnie + udev) ==="
sudo tee /etc/modprobe.d/usbcore.conf > /dev/null << 'EOT'
options usbcore autosuspend=-1
EOT
sudo tee /etc/systemd/system/usb-global-keepalive.service > /dev/null << 'EOT'
[Unit]
Description=Disable USB Autosuspend Globally for All Ports
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'for d in /sys/bus/usb/devices/*/power/control; do [ -f "$d" ] && echo on > "$d"; done; for s in /sys/bus/usb/devices/*/power/autosuspend; do [ -f "$s" ] && echo 0 > "$s"; done'
RemainAfterExit=true
[Install]
WantedBy=multi-user.target
EOT
echo 'ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="19f7", ATTR{idProduct}=="002e", TEST=="power/control", ATTR{power/control}="on"' | sudo tee /etc/udev/rules.d/50-rode-power.rules > /dev/null
sudo udevadm control --reload
sudo update-initramfs -u
sudo systemctl daemon-reload
sudo systemctl enable --now usb-global-keepalive.service
echo "=== [2/4] Optymalizacja PipeWire & WirePlumber (Rode / Audio) ==="
WP_VER=$(wireplumber --version 2>/dev/null | awk '{print $NF}' | cut -d. -f1,2)
if [ -n "$WP_VER" ]; then
WP_MAJOR=$(echo $WP_VER | cut -d. -f1)
WP_MINOR=$(echo $WP_VER | cut -d. -f2)
if [ "$WP_MAJOR" -gt 0 ] || [ "$WP_MINOR" -ge 5 ]; then
echo "Wykryto WirePlumber 0.5+ (Tworzenie konfiguracji SPA-JSON)..."
mkdir -p ~/.config/wireplumber/wireplumber.conf.d
cat > ~/.config/wireplumber/wireplumber.conf.d/51-rode-nosuspend.conf << 'EOT'
monitor.alsa.rules = [
{
matches = [
{ node.name = "~alsa_input.usb-R__DE_Wireless_GO_II_RX.*" }
]
actions = {
update-props = {
session.suspend-timeout-seconds = 0
node.pause-on-idle = false
api.alsa.headroom = 1024
}
}
}
]
EOT
else
echo "Wykryto WirePlumber 0.4.x (Tworzenie konfiguracji Lua)..."
mkdir -p ~/.config/wireplumber/main.lua.d
cat > ~/.config/wireplumber/main.lua.d/51-rode-nosuspend.lua << 'EOT'
rule = {
matches = {
{
{ "node.name", "matches", "alsa_input.usb-R__DE_Wireless_GO_II_RX.*" },
},
},
apply_properties = {
["session.suspend-timeout-seconds"] = 0,
["node.pause-on-idle"] = false,
["api.alsa.headroom"] = 1024,
},
}
table.insert(alsa_monitor.rules, rule)
EOT
fi
fi
mkdir -p ~/.config/pipewire/pipewire.conf.d ~/.config/pipewire/pipewire-pulse.conf.d
cat > ~/.config/pipewire/pipewire.conf.d/99-stable.conf << 'EOT'
context.properties = {
default.clock.rate = 48000
default.clock.quantum = 1024
default.clock.min-quantum = 512
default.clock.max-quantum = 2048
}
EOT
cat > ~/.config/pipewire/pipewire-pulse.conf.d/99-stable.conf << 'EOT'
pulse.properties = {
pulse.min.req = 512/48000
pulse.min.quantum = 512/48000
pulse.default.req = 1024/48000
}
EOT
systemctl --user restart wireplumber pipewire pipewire-pulse
echo "=== [3/4] Trwała naprawa gniazda usbmuxd (iPhone / DroidCam OBS) ==="
if [ -f /lib/udev/rules.d/39-usbmuxd.rules ]; then
sudo cp /lib/udev/rules.d/39-usbmuxd.rules /etc/udev/rules.d/39-usbmuxd.rules
sudo sed -i '/usbmuxd -x/d' /etc/udev/rules.d/39-usbmuxd.rules
sudo udevadm control --reload
fi
sudo mkdir -p /etc/systemd/system/multi-user.target.wants
sudo ln -sf /lib/systemd/system/usbmuxd.service /etc/systemd/system/multi-user.target.wants/usbmuxd.service
sudo mkdir -p /etc/systemd/system/usbmuxd.service.d
printf '[Service]\nRestart=always\nRestartSec=1\n' | sudo tee /etc/systemd/system/usbmuxd.service.d/restart.conf > /dev/null
sudo systemctl daemon-reload
sudo systemctl start usbmuxd
echo "=== [4/4] Uprawnienia Flatpak OBS Studio ==="
if flatpak list | grep -q "com.obsproject.Studio"; then
flatpak override --user --device=all com.obsproject.Studio
flatpak override --user --socket=pulseaudio com.obsproject.Studio
echo "Uprawnienia Flatpak zostały zaktualizowane."
fi
echo "======================================================"
echo " GOTOWE! Zalecany restart komputera (sudo reboot)."
echo "======================================================"
EOF
chmod +x setup-obs-fix.sh
./setup-obs-fix.sh
# ===== Co robi ten skrypt? =====
1. Wyłącza usypianie portów USB w jądrze oraz wymusza tryb on w systemd.
2. Sprawdza wersję WirePlumbera – jeśli system to starszy Ubuntu (np. 24.04 LTS), tworzy skrypt Lua, a jeśli nowszy (0.5+), tworzy plik w nowym formacie SPA JSON.
3. Ustawia pasmo PipeWire na 48 kHz i chroni bufor audio przed chrupaniem/przerwami.
4. Naprawia usbmuxd, uniemożliwiając zabijanie gniazda po wypięciu kabla iPhone'a.
5. Nadaje uprawnienia dla OBS Studio we Flatpaku do urządzeń i dźwięku.
# ===== Weryfikacja po restarcie =====
systemctl is-active usb-global-keepalive.service usbmuxd
pw-metadata -n settings 0 | grep -E "quantum|clock.rate"