XBMC-Kodi.cz
Přepnutí výstupu zvuku od remote control - Verze k tisku

+- XBMC-Kodi.cz (https://www.xbmc-kodi.cz)
+-- Fórum: Obecná diskuse (https://www.xbmc-kodi.cz/forum-obecna-diskuse)
+--- Fórum: Tipy, triky a návody (https://www.xbmc-kodi.cz/forum-tipy-triky-a-navody)
+--- Téma: Přepnutí výstupu zvuku od remote control (/prispevek-prepnuti-vystupu-zvuku-od-remote-control)



Přepnutí výstupu zvuku od remote control - meda - 24.10.2026

Přepnutí výstupu zvuku od remote control (dálkového ovládání)

Na Kodi Omega /LibreElec /Raspberry Pi 3B vyvstala potřeba přepínat výstup zvuku buď do HDMI (TV), nebo do USB zvukové karty (na stereo analog): Jediným tlačítkem na dálkovém ovládání k TV (přes HDMI-CEC). Nikoli vstupem do konfiguračního menu.
RPi 3B má samo 3,5mm Jack, zvuk z něj je ale méně kvalitní. Tento právě slouží na audio-doplňky.

Přepínání už řešilo téma @JiRo: Vychytávky https://www.xbmc-kodi.cz/prispevek-vychytavky?pid=25832#pid25832
Potřeboval jsem k přepnutí používat jediné tlačitko a také udělat jen jednoduché manipulace ze Spravce souborů Kodi přidáním souborů do uživatelského "Adresář profilu". (Nebo kopírovat z počítače s povolenou Sambou.)
Postupně jsem s ChatGPT stvořil soubor PY, a do adresáře "keymaps" soubor XML.

Je potřeba znát přesný a úplný název, který si Kodi po volbě v menu zapisuje do guisettings.xml
(i ten je v "Adresář profilu" ), za tagem obsahujícím id="audiooutput.audiodevice"
Potom vyřešit, že vyjmutá USB zvuková karta nezpůsobí zmatek v logice přepnutí.
Budou se objevovat notifikace: "Výstup: HDMI /USB audio jack 3,5 mm /USB audio nedostupné",
případně při jiné chybě: "Nelze zjistit aktuální výstup /Přepnutí zvuku se nezdařilo"

::
V současnosti verze Kodi/LE jsou 21.3/12.2.1. Doplněk keymaps v.1.4.0 má povoleno v konfiguraci long press a multiple keymap files.
Soubory PY a XML mají formát textu.

Soubor v keymaps jsem podle zvoleného tlačítka "8" pojmenoval: keynum8.xml
Soubor v "Adresář profilu" (úplná cesta je /storage/.kodi/userdata/) se bude jmenovat: switch_audio.py

Obsah keynum8.xml pro přijatý kód 199 je:
<keymap><global><keyboard><key id="199">runscript(/storage/.kodi/userdata/switch_audio.py)</key></keyboard></global></keymap>

Obsah switch_audio.py je:

Kód:
# -*- coding: utf-8 -*-
# LibreELEC / Kodi Omega: přepínání USB zvukové karty <-> HDMI
# Spouští se přes keymaps xml, tlačítkem ovladače mapovaným na tento skript

# 1
import json
import xbmc
import xbmcgui

SETTING = "audiooutput.audiodevice"

USB_DEVICE = "ALSA:@:CARD=Device,DEV=0|USB Advanced Audio Device"
HDMI_DEVICE = "ALSA:hdmi:CARD=vc4hdmi,DEV=0|vc4-hdmi (vc4hdmi)"
USB_CARD_NAME = "USB Advanced Audio Device"

# 2
def rpc(method, params=None):
    request = {"jsonrpc": "2.0", "method": method, "id": 1}
    if params is not None:
        request["params"] = params
    raw = xbmc.executeJSONRPC(json.dumps(request))
    try:
        return json.loads(raw)
    except Exception:
        return {"error": {"message": "Neplatná odpověď JSON-RPC"}}

# 3
def notify(message):
    xbmcgui.Dialog().notification(
        "Zvukový výstup",
        message,
        xbmcgui.NOTIFICATION_INFO,
        2500
    )

# 4
def usb_card_available():
    try:
        with open("/proc/asound/cards", "r") as cards_file:
            return USB_CARD_NAME.lower() in cards_file.read().lower()
    except (IOError, OSError):
        return False

# 5
current_response = rpc(
    "Settings.GetSettingValue",
    {"setting": SETTING}
)

if "error" in current_response or "result" not in current_response:
    notify("Nelze zjistit aktuální výstup")
else:
    current = str(current_response["result"].get("value", ""))
    usb_available = usb_card_available()

# 6
    if not usb_available:
        target = HDMI_DEVICE
        fallback_message = True
    elif current.startswith("ALSA:hdmi:CARD=vc4hdmi,DEV=0"):
        target = USB_DEVICE
        fallback_message = False
    else:
        target = HDMI_DEVICE
        fallback_message = False

# 7
    set_response = rpc(
        "Settings.SetSettingValue",
        {
            "setting": SETTING,
            "value": target
        }
    )

# 8
    if "error" in set_response or set_response.get("result") is not True:
        notify("Přepnutí zvuku se nezdařilo")
    elif fallback_message:
        notify("USB audio nedostupné")
    elif target == USB_DEVICE:
        notify("Výstup: USB audio jack 3,5 mm")
    else:
        notify("Výstup: HDMI")

Podrobný rozbor položek ve switch_audio.py v PDF:

.pdf   switch_audio_rozbor.pdf (Velikost: 86,1 KB / Stažení: 1)