pactl load-module module-null-sink sink_name=MySink sink_properties=device.description=MySink
Tím vznikne MySink + zdroj MySink.monitor (ten použiješ jako záznamový zdroj v Audacity).
$ pactl load-module module-null-sink sink_name=MySink sink_properties=device.description=MySink
536870913
user@Toshi:~$ pactl list short sinks
pactl list short sources
64786 alsa_output.pci-0000_00_1b.0.pro-output-0 PipeWire s32le 2 ch 48000 Hz SUSPENDED
64787 alsa_output.pci-0000_00_1b.0.pro-output-3 PipeWire s32le 8 ch 48000 Hz SUSPENDED
65030 MySink PipeWire float32le 2 ch 48000 Hz SUSPENDED
64786 alsa_output.pci-0000_00_1b.0.pro-output-0.monitor PipeWire s32le 2 ch 48000 Hz SUSPENDED
64787 alsa_output.pci-0000_00_1b.0.pro-output-3.monitor PipeWire s32le 8 ch 48000 Hz SUSPENDED
64788 alsa_input.pci-0000_00_1b.0.pro-input-0 PipeWire s32le 2 ch 48000 Hz RUNNING
65030 MySink.monitor PipeWire float32le 2 ch 48000 Hz SUSPENDED
user@Toshi:~$
Aktivní sink inputs:
pactl list short sink-inputs713 64786 712 PipeWire s16le 1 ch 44100 Hz
ZRUŠENÍ ZAVEDENÉHO SINKU
pactl unload-module module-null-sink
pactl unload-module module-loopback
ZKUSÍM ZAVÉST VIRTUÁLNÍ ZDROJ
pactl load-module module-virtual-source source_name=MixSource source_properties=device.description=MixSource
$ pactl list short sources
66660 alsa_output.pci-0000_00_1b.0.pro-output-0.monitor PipeWire s32le 2 ch 48000 Hz SUSPENDED
66661 alsa_output.pci-0000_00_1b.0.pro-output-3.monitor PipeWire s32le 8 ch 48000 Hz SUSPENDED
66662 alsa_input.pci-0000_00_1b.0.pro-input-0 PipeWire s32le 2 ch 48000 Hz RUNNING
67689 output.MixSource PipeWire float32le 2 ch 48000 Hz SUSPENDED
BASH SKRIPT PRO ZAVEDENÍ SINKU - K NIČEMU, AUDACITY NEPRACUJE S VIRTUÁLNÍM SINKEM ALE SOURCEM
#!/usr/bin/env bash
# Komfortní skript pro vytvoření "MySink" (null sink) + loopbacku
# Pro Linux Mint 21.3 (PulseAudio on PipeWire kompatibilita přes pactl)
# - start : vytvoří null sink a loopback (idempotentní)
# - stop : odstraní moduly načtené tímto skriptem
# - status : zobrazí stav (pactl list short ...)
# - install-autostart / remove-autostart : vytvoří/odstraní .desktop pro spouštění při přihlášení
#
# Poznámky:
# - Skript pracuje v uživatelském sezení (NESPUSŤTE SUDO!).
# - Výchozí fyzický sink je nastaven podle dat, které jsi poslal:
# alsa_output.pci-0000_00_1b.0.pro-output-0
# Pokud máš jiný, nastav proměnnou PHYSICAL_SINK před spuštěním nebo uprav v souboru.
# - Moduly načtené skriptem ukládá do ~/.config/mysink/modules.ids
#
set -euo pipefail
CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/mysink"
MODULES_FILE="$CONFIG_DIR/modules.ids"
SCRIPT_PATH="$(realpath "$0")"
NULL_SINK_NAME="MySink"
PHYSICAL_SINK="${PHYSICAL_SINK:-alsa_output.pci-0000_00_1b.0.pro-output-0}"
LATENCY_MS="50"
AUTOSTART_DESKTOP="$HOME/.config/autostart/mysink-start.desktop"
mkdir -p "$CONFIG_DIR"
function ensure_pactl() {
if ! command -v pactl >/dev/null 2>&1; then
echo "Chyba: pactl nenalezen. Nainstaluj Pulse/pipewire-pulse nebo zkontroluj PATH." >&2
exit 1
fi
}
function save_module_id() {
local key="$1" id="$2"
mkdir -p "$(dirname "$MODULES_FILE")"
# replace key if exists
if grep -q "^${key}=" "$MODULES_FILE" 2>/dev/null; then
sed -i "s/^${key}=.*/${key}=${id}/" "$MODULES_FILE"
else
echo "${key}=${id}" >> "$MODULES_FILE"
fi
}
function get_saved_module_id() {
local key="$1"
if [ -f "$MODULES_FILE" ]; then
awk -F= -v k="$key" '$1==k{print $2}' "$MODULES_FILE" || true
fi
}
function start() {
ensure_pactl
# 1) vytvořit null sink pokud neexistuje
if pactl list short sinks | awk '{print $2}' | grep -xq "$NULL_SINK_NAME"; then
echo "Null sink '$NULL_SINK_NAME' již existuje."
else
echo "Vytvářím null sink '$NULL_SINK_NAME'..."
module_id=$(pactl load-module module-null-sink sink_name="$NULL_SINK_NAME" sink_properties=device.description="$NULL_SINK_NAME")
echo "Načten modul module-null-sink id=$module_id"
save_module_id NULL "$module_id"
fi
# 2) vytvořit loopback (MySink.monitor -> PHYSICAL_SINK) pokud neexistuje
# zkusíme najít existující loopback s odpovídajícími parametry
existing_loopback_id=$(pactl list short modules | awk '$2=="module-loopback"{print $1" "$0}' | grep "source=${NULL_SINK_NAME}.monitor" | grep "sink=${PHYSICAL_SINK}" | awk '{print $1}' || true)
if [ -n "$existing_loopback_id" ]; then
echo "Loopback již existuje (module id=$existing_loopback_id)."
save_module_id LOOPBACK "$existing_loopback_id"
else
echo "Vytvářím loopback z ${NULL_SINK_NAME}.monitor do ${PHYSICAL_SINK}..."
loop_id=$(pactl load-module module-loopback source=${NULL_SINK_NAME}.monitor sink=${PHYSICAL_SINK} latency_msec=${LATENCY_MS})
echo "Načten modul module-loopback id=$loop_id"
save_module_id LOOPBACK "$loop_id"
fi
echo
echo "Hotovo. Stav (krátký přehled):"
pactl list short sinks
pactl list short sources
pactl list short sink-inputs
pactl list short modules | grep -E "module-null-sink|module-loopback" || true
echo
echo "Pokud chceš nahrávat v Audacity, vyber jako záznamový zdroj: Monitor of ${NULL_SINK_NAME}."
}
function stop() {
ensure_pactl
local loop_id saved_null saved_loop
saved_loop=$(get_saved_module_id LOOPBACK || true)
saved_null=$(get_saved_module_id NULL || true)
if [ -n "$saved_loop" ]; then
echo "Odstraňuji loopback (module id=$saved_loop)..."
pactl unload-module "$saved_loop" || echo "Nepodařilo se unload-module $saved_loop" >&2
sed -i "/^LOOPBACK=/d" "$MODULES_FILE" 2>/dev/null || true
else
echo "Loopback nebyl nalezen v uložených modulech. Hledám v běžících modulech..."
# pokusit se najít a unload
found=$(pactl list short modules | awk '$2=="module-loopback"{print $1" "$0}' | grep "source=${NULL_SINK_NAME}.monitor" | grep "sink=${PHYSICAL_SINK}" | awk '{print $1}' || true)
if [ -n "$found" ]; then
echo "Odstraňuji loopback module id=$found"
pactl unload-module "$found" || true
else
echo "Loopback nenalezen."
fi
fi
if [ -n "$saved_null" ]; then
echo "Odstraňuji null sink (module id=$saved_null)..."
pactl unload-module "$saved_null" || echo "Nepodařilo se unload-module $saved_null" >&2
sed -i "/^NULL=/d" "$MODULES_FILE" 2>/dev/null || true
else
echo "Null sink nebyl nalezen v uložených modulech. Hledám v běžících modulech..."
found_null=$(pactl list short modules | awk '$2=="module-null-sink"{print $1" "$0}' | grep "sink_name=${NULL_SINK_NAME}" | awk '{print $1}' || true)
if [ -n "$found_null" ]; then
echo "Odstraňuji module id=$found_null"
pactl unload-module "$found_null" || true
else
echo "Null sink nenalezen."
fi
fi
echo "Hotovo."
}
function status() {
ensure_pactl
echo "=== pactl info ==="
pactl info
echo
echo "=== sinks ==="
pactl list short sinks
echo
echo "=== sources ==="
pactl list short sources
echo
echo "=== sink-inputs ==="
pactl list short sink-inputs
echo
echo "=== modules (null-sink / loopback) ==="
pactl list short modules | grep -E "module-null-sink|module-loopback" || true
echo
echo "Uložené module ids (pokud existují):"
[ -f "$MODULES_FILE" ] && cat "$MODULES_FILE" || echo "(žádné)"
}
function install_autostart() {
mkdir -p "$(dirname "$AUTOSTART_DESKTOP")"
cat > "$AUTOSTART_DESKTOP" <<EOF
[Desktop Entry]
Type=Application
Name=MySink autostart
Exec=${SCRIPT_PATH} start
X-GNOME-Autostart-enabled=true
NoDisplay=false
Comment=Vytvori MySink a loopback pri prihlaseni
Terminal=false
EOF
echo "Vytvořen: $AUTOSTART_DESKTOP"
}
function remove_autostart() {
if [ -f "$AUTOSTART_DESKTOP" ]; then
rm -f "$AUTOSTART_DESKTOP"
echo "Odstraněn: $AUTOSTART_DESKTOP"
else
echo "Autostart soubor neexistuje: $AUTOSTART_DESKTOP"
fi
}
function help() {
cat <<EOF
Pouziti: $0 {start|stop|status|install-autostart|remove-autostart|help}
Př.: $0 start # vytvoří MySink + loopback
$0 stop # odstraní moduly vytvořené tímto skriptem
$0 status # zobrazí stav pactl
$0 install-autostart # spustí při přihlášení
$0 remove-autostart # smaže autostart
Proměnné prostředí:
PHYSICAL_SINK - jméno fyzického sinku (default: $PHYSICAL_SINK)
NULL_SINK_NAME - název virtuálního sinku (default: $NULL_SINK_NAME)
LATENCY_MS - latence pro loopback (ms)
Poznámka: Spouštěj bez sudo (v uživatelském sezení). Pokud používáš jiný fyzický sink,
nastav PHYSICAL_SINK před spuštěním nebo uprav řetězec v souboru.
EOF
}
# main
if [ $# -lt 1 ]; then
help
exit 0
fi
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
install-autostart)
install_autostart
;;
remove-autostart)
remove_autostart
;;
help|--help|-h)
help
;;
*)
echo "Neznama volba: $1" >&2
help
exit 2
;;
esac
Žádné komentáře:
Okomentovat