sobota 13. prosince 2025

Přesměrování audia do virtuálního sinku a vytvoření sinku

 

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-inputs

713    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

Přesměrování audia do virtuálního sinku a vytvoření sinku

  pactl load-module module-null-sink sink_name=MySink sink_properties=device.description=MySink Tím vznikne MySink + zdroj MySink.monitor ...

Štítky

.profile adm administrace Adobe Aho-Corasick AI akcelerace alfa transparence analýza AND any aplikace apt ar archiv asociativní pole atomicity audacity audio audio redirect autentifikace awk balíčkovací systém bash beacon beacon_hint benchmark Bézierovy křivky bezpečnost biblehub BJT blogger boolean Braessův paradox brainstorming BRE buffer buffering bufferované čtení Cache-Conrol Cloudflare code Collector Cut-off ColorManager colorpicker common compare config cookies CPU CPU pipe crop css CSS3 curl current code cut čas data loss data lost data transfer reliability datasheet datetime.strptime deb deb-systemd-helper debian debián depricated development dict dioda diody disonance doprava dpkg dpkg -S dpkg-deb drivers EBO efekt Emitter Cut-off Current eps ETag exclude exec Expires extrakce jediného extrakce názvu balíčku souboru extrakce obrázků extrakce souboru .deb fflock fflush ffmpeg FIFO file read file write file_get_contents file_get_contents/file_put_contents file_put_contents filter find first_install.sh flock Fly-back dioda font-face fonty fóra formant-preserving morphing fotorezistor fread functions funkce fwrite gate gate drive GDVfs gedit gedit-common geolokace getdata Ghostscript GIO glib gnome gnome settings GNU Privacy Guard gnupg gpg gradient-background grafika grep grep -v groupadd grub grub update gs gsettings gtk gtk.css gtk+ hebrejština history hlavičky HS html html 5 https hudba hunspell charakterizace chatGPT chroot chyba ICES IGBT Image img sizes img srcset impedance implementace imshow inference inkscape inrush current install IQ jalový výkon javascript javescript jednocení seznamů js jsonData kapacita součástek koeficient zesílení komponenty xFce komunikace se serverem koncept konfigurace kontejner korekce barev Krita KSF kvantifikátor Last-Modified lazy caching led LEFT JOIN librosa ligatury light-locker lightdm linux list log maják manuál map mapování maskování maskování hlasu maskování služby masky matplotlib Max-Age measure memory měření meta MFCC MFCC koeficienty mint Mint 21.3 Mint xFce míry modules moralizace morphologie MOSFET mount moviepy mysql náběhový proud napěťová ochrana nastavení šablony návod nel Network Error Logging NLP normalizace šedi po resize not Notifications NTFS nth-child oblasti oblékání ochrana okruhy přátel OpenVINO IR formát oprava oprava balíčku optočlen org.gnome.desktop.screensaver org.gnome.nm-applet ořezové masky OSHB otázky otázky_jazyky otázky_moralismu_řešení overlay ovladače panely parsování path pdf personifikace photorec php php 4 php 5 php 6 php 7 php 8 phpbb phpBB3 PipeWire pitch plus PN přechody pnp pole Policykit postscript práva profilování program prune průraz přeinstalování přepěťová ochrana přepolování příkazy připojení k síti připojení k wifi pseudokódd pstoedit pulse PulseAudio PWM regulátory pydub python python3 pytorch ramdisk RBE RDSon read reaktance rectifier regex regulace vstupního napětí reinstall relyability remount replace restore reverzní geolokace RIGHT JOIN rm robotický hlas role rozvržení disků pro OS linux a data databází řešení samba scan scroll sdílení sdílení souborů Sec-Fetch-Dest Sec-Fetch-Mode Sec-Fetch-Site Sec-Fetch-User Secure Shell sed Set Cookie show-manual-login show-remote-login shunt schemas schémata schottka signal morphing sink skript skupiny sledovanost sloupce slučování seznamů služby small song sort soubory soundfile spínané zdroje spínání splines split spojování správa diskových zařízení SQL ssh stabilizace napětí stahování stíny stream stream redirect string strojové učení stropové učení supplicant svg syntax systemctl systemd-logind T5 tabulka tabulky Tangentové úsečky tar témata tepelná ztráta terminologie test text-shadow themes thermal runaway time timestamp tkinter tr transformace transistor transition transpose tranzistor tranzistory ttf tuple tvorba otázek TVS typografie ubuntu účiník udiskd udisks unconfined underrun unity-greeter update usermod uživatelé va charakteristika vala věda vektorová grafika Vgs video virtual devices vocoder Vth výkon vynechání adresářů vývoj while wpa wpa_supplicant wrapovací funkce x xandr xapp-watt xargs -I xed xed-common xfdesktop xml xmp XOR Xorg Xorg Thumbnails xrandr závislosti zdánlivý výkon zdroj zenerka zenerovo napětí zip zip archiv zkratky zpomalení zpracování textu zrychlení zvuk Žalmy