diff --git a/checkbox-support/checkbox_support/scripts/pipewire_utils.py b/checkbox-support/checkbox_support/scripts/pipewire_utils.py index 4000378b42..e421096308 100755 --- a/checkbox-support/checkbox_support/scripts/pipewire_utils.py +++ b/checkbox-support/checkbox_support/scripts/pipewire_utils.py @@ -22,6 +22,7 @@ import json import logging import re +import shlex import subprocess import sys import time @@ -78,7 +79,7 @@ class PipewireTest: logger = logging.getLogger() - def _get_pw_type(self, media_class) -> str: + def _get_pw_type(self, media_class: str) -> str: """ convert sink to Output and source to Input @@ -96,7 +97,9 @@ def _get_pw_type(self, media_class) -> str: self.logger.info("Media class:[{}] is unknown".format(media_class)) return "UNKNOWN CLASS" - def _get_pw_dump(self, p_type) -> dict: + def _get_pw_dump( + self, p_type: 't.Literal["Device", "Node"]' + ) -> "list[dict[str, t.Any]]": """ Use to convert the json output of pw-dump to dict object @@ -113,7 +116,7 @@ def _get_pw_dump(self, p_type) -> dict: return json.loads(pw_dump) except (json.decoder.JSONDecodeError, TypeError): self.logger.error("pw-dump {} failed !!!".format(p_type)) - return {} + return [] def generate_pw_media_class(self, media_type, media_class) -> str: """ @@ -319,7 +322,7 @@ def gst_pipeline(self, pipe, timeout, device) -> int: return PipewireTestError.NO_ERROR - def _get_audio_config(self, mode) -> set: + def _get_audio_config(self, mode): """ Get simple audio configuration This function parse output of pw-dump to find the device type @@ -331,7 +334,7 @@ def _get_audio_config(self, mode) -> set: :type mode: str """ clients = self._get_pw_dump("Device") - cfg = set() + cfg = set() # type: set[tuple[str, str, str]] for client in clients: active_ports = None mclass = client["info"]["props"].get("media.class") @@ -380,7 +383,7 @@ def monitor_active_port_change(self, timeout, mode) -> int: self.logger.info("Couldn't detect active port change!") return PipewireTestError.NO_CHANGE_DETECTED - def go_through_ports(self, cmd, mode): + def go_through_ports(self, cmd: str, mode: 't.Literal["source", "sink"]'): """ Go through available ports for testing This script checks if the ports on either sinks @@ -395,46 +398,213 @@ def go_through_ports(self, cmd, mode): """ clients = self._get_pw_dump("Device") for client in clients: - ports = None + ports = [] mclass = client["info"]["props"].get("media.class") if mclass == "Audio/Device": ports = client["info"]["params"]["EnumRoute"] - if ports: - for p in ports: - chosen = None - if p["direction"] == self._get_pw_type(mode) and p[ - "available" - ] in [ - "yes", - "unknown", - ]: - while chosen != "yes": - self.logger.info( - "Please select [{}] for " - "testing (if selected, " - "please enter 'yes')".format(p["description"]) - ) + assert type(ports) is list + + for p in ports: + chosen = None + if p["direction"] == self._get_pw_type(mode) and p[ + "available" + ] in [ + "yes", + "unknown", + ]: + while chosen != "yes": + self.logger.info( + "Please select [{}] for " + "testing (if selected, " + "please enter 'yes')".format(p["description"]) + ) - chosen = input() - checked = None - while checked != "yes": - with subprocess.Popen( - cmd, - shell=True, - stdout=subprocess.PIPE, - universal_newlines=True, - ) as p: - while p.poll() is None: - line = p.stdout.readline().strip() - self.logger.info(line) - p.kill() - self.logger.info( - "Is working ? please enter 'yes' to leave" + chosen = input() + checked = None + while checked != "yes": + # check_call will print to stdout for us + subprocess.check_call(cmd, shell=True) + self.logger.info( + "Is working ? please enter 'yes' to leave" + ) + checked = input() + + def iter_audio_sinks(self, cmd: "list[str]"): + """Execute the cmd for each audio sink discovered by pipewire + + :param cmd: the command to run + """ + + tested_ids = set() # type: set[int] + nothing_failed = True + audio_sink_ids = list(self._find_available_audio_sinks().items()) + N = len(audio_sink_ids) + + if N == 0: + raise SystemExit("No audio sinks are available for this test") + + while True: + try: + for i, (node_id, node_description) in enumerate( + audio_sink_ids + ): + print( + "({}) - '{}' {}".format( + i, + node_description, + ("- Tested" if node_id in tested_ids else ""), + ) + ) + + print( + "Choose an audio sink to test [0-{}],".format(N - 1), + "or type 'q' to quit: ", + end="", + flush=True, + ) + choice = input() + + if choice == "q": + if len(tested_ids) == N: + if nothing_failed: + print( + "[ OK ] Quitting with return code 0.", + "All {} audio sinks have been tested".format( + N + ), + ) + return + else: + raise SystemExit( + "[ ERR ] Some of the speakers failed the test" + ) + else: + raise SystemExit( + "[ ERR ] Only {} audio sinks were tested, ".format( + len(tested_ids) ) + + "but expected {}".format(N) + ) + + idx = int(choice) + subprocess.check_call( + ["wpctl", "set-default", str(audio_sink_ids[idx][0])] + ) + except (ValueError, IndexError): + # this would loop at input() until a valid index is selected + print( + "Please select an index from 0 to", N - 1, file=sys.stderr + ) + continue + + node_id, node_description = audio_sink_ids[idx] + + TIMEOUT = 60 + try: + print("=" * 80, flush=True) + print( + "Testing '{}', id={}, command={}, {}s timeout".format( + node_description, node_id, cmd, TIMEOUT + ) + ) + # don't let this fail, just go to the next sink + subprocess.run(cmd, timeout=TIMEOUT, check=True) + except subprocess.TimeoutExpired: + print( + "[ ERR ]", + cmd, + "did not finish in {}s".format(TIMEOUT), + file=sys.stderr, + ) + nothing_failed = False + except subprocess.CalledProcessError as e: + print("[ ERR ]", e, file=sys.stderr) + nothing_failed = False + finally: + tested_ids.add(audio_sink_ids[idx][0]) + print("=" * 80, flush=True) + print( + "Progress: {}/{} audio sinks tested".format( + len(tested_ids), N + ) + ) - checked = input() + def _find_available_audio_sinks(self) -> "dict[int, str]": + """ + Finds the list of audio "devices" as shown in gnome's control center - def _get_node_description(self, properties) -> str: + :return: Returns a set of IDs that can be consumed by wpctl. + The values are human readable names. + These IDs are the "ID" to use as shown in `wpctl --help` + """ + testable_node_ids = {} # type: dict[int, str] + pw_audio_devices = [ + device + for device in self._get_pw_dump("Device") + if device["info"]["props"].get("media.class") == "Audio/Device" + ] + pw_sink_nodes = [ + node + for node in self._get_pw_dump("Node") + if node["info"]["props"].get("media.class") == "Audio/Sink" + ] + + for node in pw_sink_nodes: + # IDs of these "nodes" can be passed to wpctl set-default + node_id = int(node["id"]) + device_id = int(node["info"]["props"]["device.id"]) + + device = None # type: dict[str, t.Any] | None + for dev in pw_audio_devices: + if dev["id"] == device_id: + device = dev + break + + if not device: + print("Could not find device", device_id, file=sys.stderr) + continue + + # now check if the device has at least 1 available route + enum_routes = device["info"]["params"]["EnumRoute"] + + if not isinstance(enum_routes, list): + raise TypeError( + "EnumRoute of device {} is not a list, got {}".format( + device_id, type(enum_routes) + ) + ) + + for route in enum_routes: + # try to match the device to this node + if ( + route["devices"][0] # this is an array with just 1 value + != node["info"]["props"]["card.profile.device"] + ): + continue + if route["direction"] != "Output": + print( + "Skipping '{}'".format(route["description"]), + "because it's not a sink", + ) + continue + if route["available"] not in ("yes", "unknown"): + print( + "Skipping '{}'".format(route["description"]), + "because it's unavailable", + ) + continue + + # correct direction + at least 1 available route => testable + testable_node_ids[node_id] = " - ".join( + [ + route["description"], + # this product name can be empty + device["info"]["props"].get("device.product.name", ""), + ] + ) + return testable_node_ids + + def _get_node_description(self, properties) -> "str | None": """ Get node description from the output of wpctl inspect @@ -490,7 +660,7 @@ def show_default_device(self, device_type): except subprocess.CalledProcessError as e: raise RuntimeError("Show default device error {}".format(repr(e))) - def _sort_wpctl_status(self, lines: list) -> list: + def _sort_wpctl_status(self, lines: "list[str]") -> "list[str]": """ This method will sort wpctl status for sub-items under catalog only @@ -533,17 +703,17 @@ def compare_wpctl_status(self, status_1: str, status_2: str): :param status_2: path to second wpctl status """ with open(status_1, "r") as s1, open(status_2, "r") as s2: - status_1 = s1.readlines() - status_2 = s2.readlines() - sorted_status_1 = self._sort_wpctl_status(status_1) - sorted_status_2 = self._sort_wpctl_status(status_2) + status_1_lines = s1.readlines() + status_2_lines = s2.readlines() + sorted_status_1 = self._sort_wpctl_status(status_1_lines) + sorted_status_2 = self._sort_wpctl_status(status_2_lines) delta = difflib.unified_diff(sorted_status_1, sorted_status_2, n=0) diff = "".join(delta) if diff: self.logger.info("The first status:\n") - self.logger.info("".join(status_1)) + self.logger.info("".join(status_1_lines)) self.logger.info("And the second status:\n") - self.logger.info("".join(status_2)) + self.logger.info("".join(status_2_lines)) self.logger.info( "Differ in the following lines (after sorting):" ) @@ -753,6 +923,17 @@ def _args_parsing(self, args=sys.argv[1:]): "-m", "--mode", type=str, help="Either sinks or sources" ) + parser_iter_sink = subparsers.add_parser( + "iter-audio-sinks", help="Iterate all available audio sinks" + ) + parser_iter_sink.add_argument( + "-c", + "--command", + type=str, + required=True, + help="command for testing", + ) + # Add parser for show default device function parser_show = subparsers.add_parser( "show", help="show the default device" @@ -823,6 +1004,8 @@ def function_select(self, args): return PipewireTestError.NO_ERROR else: return PipewireTestError.NOT_REAL_DEVICE + elif args.test_type == "iter-audio-sinks": + return self.iter_audio_sinks(shlex.split(args.command)) def main(): diff --git a/checkbox-support/checkbox_support/scripts/tests/test_data/pw_dump_device_happy_path.txt b/checkbox-support/checkbox_support/scripts/tests/test_data/pw_dump_device_happy_path.txt new file mode 100644 index 0000000000..b9db4782a3 --- /dev/null +++ b/checkbox-support/checkbox_support/scripts/tests/test_data/pw_dump_device_happy_path.txt @@ -0,0 +1,789 @@ +[ + { + "id": 44, + "type": "PipeWire:Interface:Device", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "change-mask": [ "props", "params" ], + "props": { + "alsa.card": 0, + "alsa.card_name": "HD-Audio Generic", + "alsa.components": "HDA:1002aa01,00aa0100,00100900", + "alsa.driver_name": "snd_hda_intel", + "alsa.id": "Generic", + "alsa.long_card_name": "HD-Audio Generic at 0xb45c8000 irq 142", + "alsa.mixer_name": "ATI R6xx HDMI", + "api.acp.auto-port": false, + "api.acp.auto-profile": false, + "api.alsa.card": 0, + "api.alsa.card.longname": "HD-Audio Generic at 0xb45c8000 irq 142", + "api.alsa.card.name": "HD-Audio Generic", + "api.alsa.path": "hw:0", + "api.alsa.split-enable": true, + "api.alsa.use-acp": true, + "api.dbus.ReserveDevice1": "Audio0", + "api.dbus.ReserveDevice1.Priority": -20, + "client.id": 42, + "device.api": "alsa", + "device.bus": "pci", + "device.bus-path": "pci-0000:c3:00.1", + "device.description": "Radeon High Definition Audio Controller [Rembrandt/Strix]", + "device.enum.api": "udev", + "device.icon-name": "audio-card-analog-pci", + "device.name": "alsa_card.pci-0000_c3_00.1", + "device.nick": "HD-Audio Generic", + "device.plugged.usec": 13012287, + "device.product.id": "0x1640", + "device.product.name": "Radeon High Definition Audio Controller [Rembrandt/Strix]", + "device.string": 0, + "device.subsystem": "sound", + "device.sysfs.path": "/devices/pci0000:00/0000:00:08.1/0000:c3:00.1/sound/card0", + "device.vendor.id": "0x1002", + "device.vendor.name": "Advanced Micro Devices, Inc. [AMD/ATI]", + "factory.id": 15, + "media.class": "Audio/Device", + "object.id": 44, + "object.path": "alsa:acp:Generic", + "object.serial": 44, + "spa.object.id": 2 + }, + "params": { + "EnumProfile": [ + { + "index": 0, + "name": "off", + "description": "Off", + "priority": 0, + "available": "yes", + "classes": [ + 0 + ] + }, + { + "index": 1, + "name": "HiFi", + "description": "Play HiFi quality Music", + "priority": 13000, + "available": "yes", + "classes": [ + 1, + [ + "Audio/Sink", + 4, + "card.profile.devices", + [ 0, 1, 2, 3 ] + ] + ] + }, + { + "index": 2, + "name": "pro-audio", + "description": "Pro Audio", + "priority": 1, + "available": "unknown", + "classes": [ + 1, + [ + "Audio/Sink", + 4, + "card.profile.devices", + [ 4, 5, 6, 7 ] + ] + ] + } + ], + "Profile": [ + { + "index": 1, + "name": "HiFi", + "description": "Play HiFi quality Music", + "priority": 13000, + "available": "yes", + "classes": [ + 1, + [ + "Audio/Sink", + 4, + "card.profile.devices", + [ 0, 1, 2, 3 ] + ] + ], + "save": false + } + ], + "EnumRoute": [ + { + "index": 0, + "direction": "Output", + "name": "[Out] HDMI4", + "description": "HDMI / DisplayPort 4 Output", + "priority": 1400, + "available": "no", + "info": [ + 4, + "port.type", + "hdmi", + "port.availability-group", + "HDMI/DP,pcm=9", + "device.icon_name", + "video-display", + "card.profile.port", + "0" + ], + "profiles": [ 1 ], + "devices": [ 0 ] + }, + { + "index": 1, + "direction": "Output", + "name": "[Out] HDMI3", + "description": "HDMI / DisplayPort 3 Output", + "priority": 1300, + "available": "no", + "info": [ + 4, + "port.type", + "hdmi", + "port.availability-group", + "HDMI/DP,pcm=8", + "device.icon_name", + "video-display", + "card.profile.port", + "1" + ], + "profiles": [ 1 ], + "devices": [ 1 ] + }, + { + "index": 2, + "direction": "Output", + "name": "[Out] HDMI2", + "description": "HDMI / DisplayPort 2 Output", + "priority": 1200, + "available": "yes", + "info": [ + 6, + "port.type", + "hdmi", + "port.availability-group", + "HDMI/DP,pcm=7", + "device.icon_name", + "video-display", + "card.profile.port", + "2", + "device.product.name", + "LG IPS FULLHD", + "iec958.codecs.detected", + "[\"PCM\"]" + ], + "profiles": [ 1 ], + "devices": [ 2 ] + }, + { + "index": 3, + "direction": "Output", + "name": "[Out] HDMI1", + "description": "HDMI / DisplayPort 1 Output", + "priority": 1100, + "available": "no", + "info": [ + 4, + "port.type", + "hdmi", + "port.availability-group", + "HDMI/DP,pcm=3", + "device.icon_name", + "video-display", + "card.profile.port", + "3" + ], + "profiles": [ 1 ], + "devices": [ 3 ] + } + ], + "Route": [ + { + "index": 2, + "direction": "Output", + "name": "[Out] HDMI2", + "description": "HDMI / DisplayPort 2 Output", + "priority": 1200, + "available": "yes", + "info": [ + 8, + "port.type", + "hdmi", + "port.availability-group", + "HDMI/DP,pcm=7", + "device.icon_name", + "video-display", + "card.profile.port", + "2", + "device.product.name", + "LG IPS FULLHD", + "iec958.codecs.detected", + "[\"PCM\"]", + "route.hw-mute", + "false", + "route.hw-volume", + "false" + ], + "profiles": [ 1 ], + "device": 2, + "props": { + "mute": false, + "channelVolumes": [ 1.000000, 1.000000 ], + "volumeBase": 1.000000, + "volumeStep": 0.000015, + "channelMap": [ "FL", "FR" ], + "softVolumes": [ 1.000000, 1.000000 ], + "latencyOffsetNsec": 0 + }, + "devices": [ 2 ], + "profile": 1, + "save": false + } + ] + } + } + }, + { + "id": 45, + "type": "PipeWire:Interface:Device", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "change-mask": [ "props", "params" ], + "props": { + "alsa.card": 1, + "alsa.card_name": "HD-Audio Generic", + "alsa.components": "HDA:10ec0245,103c8d08,00100001", + "alsa.driver_name": "snd_hda_intel", + "alsa.id": "Generic_1", + "alsa.long_card_name": "HD-Audio Generic at 0xb45c0000 irq 143", + "alsa.mixer_name": "Realtek ALC245", + "api.acp.auto-port": false, + "api.acp.auto-profile": false, + "api.alsa.card": 1, + "api.alsa.card.longname": "HD-Audio Generic at 0xb45c0000 irq 143", + "api.alsa.card.name": "HD-Audio Generic", + "api.alsa.path": "hw:1", + "api.alsa.split-enable": true, + "api.alsa.use-acp": true, + "api.dbus.ReserveDevice1": "Audio1", + "api.dbus.ReserveDevice1.Priority": -20, + "client.id": 42, + "device.api": "alsa", + "device.bus": "pci", + "device.bus-path": "pci-0000:c3:00.6", + "device.description": "Family 17h/19h/1ah HD Audio Controller", + "device.enum.api": "udev", + "device.icon-name": "audio-card-analog-pci", + "device.name": "alsa_card.pci-0000_c3_00.6", + "device.nick": "HD-Audio Generic", + "device.plugged.usec": 13076837, + "device.product.id": "0x15e3", + "device.product.name": "Family 17h/19h/1ah HD Audio Controller", + "device.string": 1, + "device.subsystem": "sound", + "device.sysfs.path": "/devices/pci0000:00/0000:00:08.1/0000:c3:00.6/sound/card1", + "device.vendor.id": "0x1022", + "device.vendor.name": "Advanced Micro Devices, Inc. [AMD]", + "factory.id": 15, + "media.class": "Audio/Device", + "object.id": 45, + "object.path": "alsa:acp:Generic_1", + "object.serial": 45, + "spa.object.id": 4 + }, + "params": { + "EnumProfile": [ + { + "index": 0, + "name": "off", + "description": "Off", + "priority": 0, + "available": "yes", + "classes": [ + 0 + ] + }, + { + "index": 1, + "name": "HiFi (Headphones, Mic1, Mic2)", + "description": "Play HiFi quality Music (Headphones, Mic1, Mic2)", + "priority": 8500, + "available": "no", + "classes": [ + 2, + [ + "Audio/Source", + 2, + "card.profile.devices", + [ 1, 2 ] + ], + [ + "Audio/Sink", + 1, + "card.profile.devices", + [ 3 ] + ] + ] + }, + { + "index": 2, + "name": "HiFi (Mic1, Mic2, Speaker)", + "description": "Play HiFi quality Music (Mic1, Mic2, Speaker)", + "priority": 8400, + "available": "yes", + "classes": [ + 2, + [ + "Audio/Source", + 2, + "card.profile.devices", + [ 1, 2 ] + ], + [ + "Audio/Sink", + 1, + "card.profile.devices", + [ 0 ] + ] + ] + }, + { + "index": 3, + "name": "pro-audio", + "description": "Pro Audio", + "priority": 1, + "available": "unknown", + "classes": [ + 2, + [ + "Audio/Source", + 1, + "card.profile.devices", + [ 5 ] + ], + [ + "Audio/Sink", + 1, + "card.profile.devices", + [ 4 ] + ] + ] + } + ], + "Profile": [ + { + "index": 2, + "name": "HiFi (Mic1, Mic2, Speaker)", + "description": "Play HiFi quality Music (Mic1, Mic2, Speaker)", + "priority": 8400, + "available": "yes", + "classes": [ + 2, + [ + "Audio/Source", + 2, + "card.profile.devices", + [ 1, 2 ] + ], + [ + "Audio/Sink", + 1, + "card.profile.devices", + [ 0 ] + ] + ], + "save": false + } + ], + "EnumRoute": [ + { + "index": 0, + "direction": "Output", + "name": "[Out] Speaker", + "description": "Speaker", + "priority": 100, + "available": "unknown", + "info": [ + 3, + "port.type", + "speaker", + "device.icon_name", + "audio-speakers", + "card.profile.port", + "0" + ], + "profiles": [ 2 ], + "devices": [ 0 ] + }, + { + "index": 1, + "direction": "Input", + "name": "[In] Mic2", + "description": "Headphones Stereo Microphone", + "priority": 200, + "available": "no", + "info": [ + 4, + "port.type", + "mic", + "port.availability-group", + "Mic", + "device.icon_name", + "audio-input-microphone", + "card.profile.port", + "1" + ], + "profiles": [ 2, 1 ], + "devices": [ 1 ] + }, + { + "index": 2, + "direction": "Input", + "name": "[In] Mic1", + "description": "Digital Microphone", + "priority": 100, + "available": "unknown", + "info": [ + 3, + "port.type", + "mic", + "device.icon_name", + "audio-input-microphone", + "card.profile.port", + "2" + ], + "profiles": [ 2, 1 ], + "devices": [ 2 ] + }, + { + "index": 3, + "direction": "Output", + "name": "[Out] Headphones", + "description": "Headphones", + "priority": 200, + "available": "no", + "info": [ + 4, + "port.type", + "headphones", + "port.availability-group", + "Headphone", + "device.icon_name", + "audio-headphones", + "card.profile.port", + "3" + ], + "profiles": [ 1 ], + "devices": [ 3 ] + } + ], + "Route": [ + { + "index": 0, + "direction": "Output", + "name": "[Out] Speaker", + "description": "Speaker", + "priority": 100, + "available": "unknown", + "info": [ + 5, + "port.type", + "speaker", + "device.icon_name", + "audio-speakers", + "card.profile.port", + "0", + "route.hw-mute", + "true", + "route.hw-volume", + "true" + ], + "profiles": [ 2 ], + "device": 0, + "props": { + "mute": true, + "channelVolumes": [ 0.386722, 0.386722 ], + "volumeBase": 1.000000, + "volumeStep": 0.000015, + "channelMap": [ "FL", "FR" ], + "softVolumes": [ 1.000000, 1.000000 ], + "latencyOffsetNsec": 0 + }, + "devices": [ 0 ], + "profile": 2, + "save": true + }, + { + "index": 2, + "direction": "Input", + "name": "[In] Mic1", + "description": "Digital Microphone", + "priority": 100, + "available": "unknown", + "info": [ + 5, + "port.type", + "mic", + "device.icon_name", + "audio-input-microphone", + "card.profile.port", + "2", + "route.hw-mute", + "true", + "route.hw-volume", + "false" + ], + "profiles": [ 2, 1 ], + "device": 2, + "props": { + "mute": false, + "channelVolumes": [ 1.000000, 1.000000 ], + "volumeBase": 1.000000, + "volumeStep": 0.000015, + "channelMap": [ "FL", "FR" ], + "softVolumes": [ 1.000000, 1.000000 ], + "latencyOffsetNsec": 0 + }, + "devices": [ 2 ], + "profile": 2, + "save": true + } + ] + } + } + }, + { + "id": 55, + "type": "PipeWire:Interface:Device", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "change-mask": [ "props", "params" ], + "props": { + "api.v4l2.cap.bus_info": "usb-0000:c3:00.4-1", + "api.v4l2.cap.capabilities": "84a00001", + "api.v4l2.cap.card": "HP 5MP Camera: HP 5MP Camera", + "api.v4l2.cap.device-caps": 4200001, + "api.v4l2.cap.driver": "uvcvideo", + "api.v4l2.cap.version": "6.17.13", + "api.v4l2.path": "/dev/video0", + "client.id": 42, + "device.api": "v4l2", + "device.bus": "usb", + "device.bus-path": "pci-0000:c3:00.4-usb-0:1:1.0", + "device.capabilities": ":capture:", + "device.description": "HP 5MP Camera", + "device.devids": "[ 20736 ]", + "device.enum.api": "udev", + "device.name": "v4l2_device.pci-0000_c3_00.4-usb-0_1_1.0", + "device.plugged.usec": 12949314, + "device.product.id": "0x00e4", + "device.product.name": "HP 5MP Camera", + "device.serial": "DTRPP0A5AKQ1P4_HP_5MP_Camera_200901010001", + "device.subsystem": "video4linux", + "device.sysfs.path": "/devices/pci0000:00/0000:00:08.1/0000:c3:00.4/usb1/1-1/1-1:1.0/video4linux/video0", + "device.vendor.id": "0x30c9", + "device.vendor.name": "DTRPP0A5AKQ1P4", + "factory.id": 15, + "media.class": "Video/Device", + "object.id": 55, + "object.path": "v4l2:/dev/video0", + "object.serial": 55 + }, + "params": { + } + } + }, + { + "id": 56, + "type": "PipeWire:Interface:Device", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "change-mask": [ "props", "params" ], + "props": { + "api.v4l2.cap.bus_info": "usb-0000:c3:00.4-1", + "api.v4l2.cap.capabilities": "84a00001", + "api.v4l2.cap.card": "HP 5MP Camera: HP 5MP Camera", + "api.v4l2.cap.device-caps": "04a00000", + "api.v4l2.cap.driver": "uvcvideo", + "api.v4l2.cap.version": "6.17.13", + "api.v4l2.path": "/dev/video1", + "client.id": 42, + "device.api": "v4l2", + "device.bus": "usb", + "device.bus-path": "pci-0000:c3:00.4-usb-0:1:1.0", + "device.capabilities": ":", + "device.description": "HP 5MP Camera", + "device.devids": "[ 20737 ]", + "device.enum.api": "udev", + "device.name": "v4l2_device.pci-0000_c3_00.4-usb-0_1_1.0.2", + "device.plugged.usec": 12949344, + "device.product.id": "0x00e4", + "device.product.name": "HP 5MP Camera", + "device.serial": "DTRPP0A5AKQ1P4_HP_5MP_Camera_200901010001", + "device.subsystem": "video4linux", + "device.sysfs.path": "/devices/pci0000:00/0000:00:08.1/0000:c3:00.4/usb1/1-1/1-1:1.0/video4linux/video1", + "device.vendor.id": "0x30c9", + "device.vendor.name": "DTRPP0A5AKQ1P4", + "factory.id": 15, + "media.class": "Video/Device", + "object.id": 56, + "object.path": "v4l2:/dev/video1", + "object.serial": 56 + }, + "params": { + } + } + }, + { + "id": 57, + "type": "PipeWire:Interface:Device", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "change-mask": [ "props", "params" ], + "props": { + "api.v4l2.cap.bus_info": "usb-0000:c3:00.4-1", + "api.v4l2.cap.capabilities": "84a00001", + "api.v4l2.cap.card": "HP 5MP Camera: HP IR Camera", + "api.v4l2.cap.device-caps": 4200001, + "api.v4l2.cap.driver": "uvcvideo", + "api.v4l2.cap.version": "6.17.13", + "api.v4l2.path": "/dev/video2", + "client.id": 42, + "device.api": "v4l2", + "device.bus": "usb", + "device.bus-path": "pci-0000:c3:00.4-usb-0:1:1.2", + "device.capabilities": ":capture:", + "device.description": "HP 5MP Camera", + "device.devids": "[ 20738 ]", + "device.enum.api": "udev", + "device.name": "v4l2_device.pci-0000_c3_00.4-usb-0_1_1.2", + "device.plugged.usec": 12961148, + "device.product.id": "0x00e4", + "device.product.name": "HP 5MP Camera", + "device.serial": "DTRPP0A5AKQ1P4_HP_5MP_Camera_200901010001", + "device.subsystem": "video4linux", + "device.sysfs.path": "/devices/pci0000:00/0000:00:08.1/0000:c3:00.4/usb1/1-1/1-1:1.2/video4linux/video2", + "device.vendor.id": "0x30c9", + "device.vendor.name": "DTRPP0A5AKQ1P4", + "factory.id": 15, + "media.class": "Video/Device", + "object.id": 57, + "object.path": "v4l2:/dev/video2", + "object.serial": 57 + }, + "params": { + } + } + }, + { + "id": 58, + "type": "PipeWire:Interface:Device", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "change-mask": [ "props", "params" ], + "props": { + "api.v4l2.cap.bus_info": "usb-0000:c3:00.4-1", + "api.v4l2.cap.capabilities": "84a00001", + "api.v4l2.cap.card": "HP 5MP Camera: HP IR Camera", + "api.v4l2.cap.device-caps": "04a00000", + "api.v4l2.cap.driver": "uvcvideo", + "api.v4l2.cap.version": "6.17.13", + "api.v4l2.path": "/dev/video3", + "client.id": 42, + "device.api": "v4l2", + "device.bus": "usb", + "device.bus-path": "pci-0000:c3:00.4-usb-0:1:1.2", + "device.capabilities": ":", + "device.description": "HP 5MP Camera", + "device.devids": "[ 20739 ]", + "device.enum.api": "udev", + "device.name": "v4l2_device.pci-0000_c3_00.4-usb-0_1_1.2.2", + "device.plugged.usec": 12961174, + "device.product.id": "0x00e4", + "device.product.name": "HP 5MP Camera", + "device.serial": "DTRPP0A5AKQ1P4_HP_5MP_Camera_200901010001", + "device.subsystem": "video4linux", + "device.sysfs.path": "/devices/pci0000:00/0000:00:08.1/0000:c3:00.4/usb1/1-1/1-1:1.2/video4linux/video3", + "device.vendor.id": "0x30c9", + "device.vendor.name": "DTRPP0A5AKQ1P4", + "factory.id": 15, + "media.class": "Video/Device", + "object.id": 58, + "object.path": "v4l2:/dev/video3", + "object.serial": 58 + }, + "params": { + } + } + }, + { + "id": 64, + "type": "PipeWire:Interface:Device", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "change-mask": [ "props", "params" ], + "props": { + "api.libcamera.location": "front", + "api.libcamera.path": "\\_SB_.PCI0.GPPA.XHC1.RHUB.HS01-1:1.0-30c9:00e4", + "client.id": 42, + "device.api": "libcamera", + "device.description": "HP 5MP Camera: HP 5MP Camera", + "device.devids": "[ 20736 ]", + "device.enum.api": "libcamera.manager", + "device.name": "libcamera_device.\\_SB_.PCI0.GPPA.XHC1.RHUB.HS01-1:1.0-30c9:00e4", + "device.product.name": "HP 5MP Camera: HP 5MP Camera", + "factory.id": 15, + "media.class": "Video/Device", + "object.id": 64, + "object.path": "libcamera:\\_SB_.PCI0.GPPA.XHC1.RHUB.HS01-1:1.0-30c9:00e4", + "object.serial": 64 + }, + "params": { + "EnumProfile": [ + ], + "Profile": [ ] + } + } + }, + { + "id": 65, + "type": "PipeWire:Interface:Device", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "change-mask": [ "props", "params" ], + "props": { + "api.libcamera.location": "front", + "api.libcamera.path": "\\_SB_.PCI0.GPPA.XHC1.RHUB.HS01-1:1.2-30c9:00e4", + "client.id": 42, + "device.api": "libcamera", + "device.description": "HP 5MP Camera: HP IR Camera", + "device.devids": "[ 20738 ]", + "device.enum.api": "libcamera.manager", + "device.name": "libcamera_device.\\_SB_.PCI0.GPPA.XHC1.RHUB.HS01-1:1.2-30c9:00e4", + "device.product.name": "HP 5MP Camera: HP IR Camera", + "factory.id": 15, + "media.class": "Video/Device", + "object.id": 65, + "object.path": "libcamera:\\_SB_.PCI0.GPPA.XHC1.RHUB.HS01-1:1.2-30c9:00e4", + "object.serial": 65 + }, + "params": { + "EnumProfile": [ + ], + "Profile": [ ] + } + } + } +] diff --git a/checkbox-support/checkbox_support/scripts/tests/test_data/pw_dump_node_happy_path.txt b/checkbox-support/checkbox_support/scripts/tests/test_data/pw_dump_node_happy_path.txt new file mode 100644 index 0000000000..82ae2117f7 --- /dev/null +++ b/checkbox-support/checkbox_support/scripts/tests/test_data/pw_dump_node_happy_path.txt @@ -0,0 +1,5555 @@ +[ + { + "id": 30, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 0, + "max-output-ports": 0, + "change-mask": [ "input-ports", "output-ports", "state", "props", "params" ], + "n-input-ports": 0, + "n-output-ports": 0, + "state": "suspended", + "error": null, + "props": { + "clock.id": "monotonic", + "clock.name": "clock.system.monotonic", + "clock.quantum-limit": 8192, + "factory.id": 11, + "factory.name": "support.node.driver", + "node.driver": true, + "node.group": "pipewire.dummy", + "node.loop.name": "data-loop.0", + "node.name": "Dummy-Driver", + "node.sync-group": "sync.dummy", + "object.id": 30, + "object.serial": 30, + "priority.driver": 200000 + }, + "params": { + } + } + }, + { + "id": 31, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 0, + "max-output-ports": 0, + "change-mask": [ "input-ports", "output-ports", "state", "props", "params" ], + "n-input-ports": 0, + "n-output-ports": 0, + "state": "suspended", + "error": null, + "props": { + "clock.id": "monotonic", + "clock.name": "clock.system.monotonic", + "clock.quantum-limit": 8192, + "factory.id": 11, + "factory.name": "support.node.driver", + "node.driver": true, + "node.freewheel": true, + "node.group": "pipewire.freewheel", + "node.loop.name": "data-loop.0", + "node.name": "Freewheel-Driver", + "node.sync-group": "sync.dummy", + "object.id": 31, + "object.serial": 31, + "priority.driver": 190000 + }, + "params": { + } + } + }, + { + "id": 46, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 256, + "max-output-ports": 256, + "change-mask": [ "input-ports", "output-ports", "state", "props", "params" ], + "n-input-ports": 1, + "n-output-ports": 1, + "state": "suspended", + "error": null, + "props": { + "client.id": 42, + "clock.quantum-limit": 8192, + "device.api": "alsa", + "factory.id": 11, + "factory.name": "api.alsa.seq.bridge", + "media.class": "Midi/Bridge", + "node.driver": true, + "node.loop.name": "data-loop.0", + "node.name": "Midi-Bridge", + "object.id": 46, + "object.serial": 46, + "priority.driver": 1, + "priority.session": 100 + }, + "params": { + "PropInfo": [ + { + "id": "device", + "description": "The ALSA device", + "type": "default" + } + ], + "Props": [ + { + "device": "default" + } + ], + "IO": [ + { + "id": "Clock", + "size": 160 + }, + { + "id": "Position", + "size": 1688 + } + ] + } + } + }, + { + "id": 49, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 1, + "max-output-ports": 1, + "change-mask": [ "input-ports", "output-ports", "state", "props", "params" ], + "n-input-ports": 1, + "n-output-ports": 1, + "state": "suspended", + "error": null, + "props": { + "api.bluez5.role": "server", + "api.glib.mainloop": true, + "client.id": 42, + "clock.quantum-limit": 8192, + "device.api": "bluez5", + "factory.id": 14, + "factory.name": "api.bluez5.midi.node", + "media.class": "Midi/Bridge", + "node.description": "BLE MIDI 1", + "node.loop.name": "data-loop.0", + "node.name": "bluez_midi.server", + "object.id": 49, + "object.serial": 49 + }, + "params": { + "PropInfo": [ + { + "id": "latencyOffsetNsec", + "description": "Latency offset (ns)", + "type": { "default": 0, "min": -9223372036854775808, "max": 9223372036854775807 } + }, + { + "id": "deviceName", + "description": "Device name", + "type": "BLE MIDI 1" + } + ], + "Props": [ + { + "latencyOffsetNsec": 0, + "deviceName": "BLE MIDI 1" + } + ], + "IO": [ + ] + } + } + }, + { + "id": 52, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 65, + "max-output-ports": 0, + "change-mask": [ "input-ports", "output-ports", "state", "props", "params" ], + "n-input-ports": 2, + "n-output-ports": 2, + "state": "suspended", + "error": null, + "props": { + "alsa.card": 1, + "alsa.card_name": "HD-Audio Generic", + "alsa.class": "generic", + "alsa.components": "HDA:10ec0245,103c8d08,00100001", + "alsa.device": 0, + "alsa.driver_name": "snd_hda_intel", + "alsa.id": "ALC245 Analog", + "alsa.long_card_name": "HD-Audio Generic at 0xb45c0000 irq 143", + "alsa.mixer_device": "_ucm0003.hw:Generic_1", + "alsa.mixer_name": "Realtek ALC245", + "alsa.name": "ALC245 Analog", + "alsa.resolution_bits": 16, + "alsa.subclass": "generic-mix", + "alsa.subdevice": 0, + "alsa.subdevice_name": "subdevice #0", + "alsa.sync.id": "00000000:00000000:00000000:00000000", + "api.alsa.card.longname": "HD-Audio Generic at 0xb45c0000 irq 143", + "api.alsa.card.name": "HD-Audio Generic", + "api.alsa.open.ucm": true, + "api.alsa.path": "hw:Generic_1", + "api.alsa.pcm.card": 1, + "api.alsa.pcm.stream": "playback", + "audio.channels": 2, + "audio.position": "FL,FR", + "card.profile.device": 0, + "client.id": 42, + "clock.quantum-limit": 8192, + "device.api": "alsa", + "device.class": "sound", + "device.icon-name": "audio-card-analog", + "device.icon_name": "audio-speakers", + "device.id": 45, + "device.profile.description": "Speaker", + "device.profile.name": "HiFi: Speaker: sink", + "device.routes": 1, + "factory.id": 19, + "factory.name": "api.alsa.pcm.sink", + "library.name": "audioconvert/libspa-audioconvert", + "media.class": "Audio/Sink", + "node.description": "Family 17h/19h/1ah HD Audio Controller Speaker", + "node.driver": true, + "node.loop.name": "data-loop.0", + "node.name": "alsa_output.pci-0000_c3_00.6.HiFi__Speaker__sink", + "node.nick": "ALC245 Analog", + "node.pause-on-idle": false, + "object.id": 52, + "object.path": "alsa:acp:Generic_1:0:playback", + "object.serial": 52, + "port.group": "playback", + "priority.driver": 1000, + "priority.session": 1000 + }, + "params": { + "EnumFormat": [ + { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": { + "default": "S32LE", + "alt1": "S32LE", + "alt2": "S16LE" + }, + "rate": 48000, + "channels": 2, + "position": [ "FL", "FR" ] + } + ], + "PropInfo": [ + { + "id": "volume", + "description": "Volume", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "mute", + "description": "Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "channelVolumes", + "description": "Channel Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "channelMap", + "description": "Channel Map", + "type": "", + "container": "Array" + }, + { + "id": "monitorMute", + "description": "Monitor Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "monitorVolumes", + "description": "Monitor Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "softMute", + "description": "Soft Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "softVolumes", + "description": "Soft Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "name": "monitor.channel-volumes", + "description": "Monitor channel volume", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.disable", + "description": "Disable Channel mixing", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.min-volume", + "description": "Minimum volume level", + "type": { "default": 0.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.max-volume", + "description": "Maximum volume level", + "type": { "default": 10.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.normalize", + "description": "Normalize Volumes", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.mix-lfe", + "description": "Mix LFE into channels", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.upmix", + "description": "Enable upmixing", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.lfe-cutoff", + "description": "LFE cutoff frequency", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.fc-cutoff", + "description": "FC cutoff frequency (Hz)", + "type": { "default": 0.000000, "min": 0.000000, "max": 48000.000000 }, + "params": true + }, + { + "name": "channelmix.rear-delay", + "description": "Rear channels delay (ms)", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.stereo-widen", + "description": "Stereo widen", + "type": { "default": 0.000000, "min": 0.000000, "max": 1.000000 }, + "params": true + }, + { + "name": "channelmix.hilbert-taps", + "description": "Taps for phase shift of rear", + "type": { "default": 0, "min": 0, "max": 255 }, + "params": true + }, + { + "name": "channelmix.upmix-method", + "description": "Upmix method to use", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "simple", + "Simple upmixing", + "psd", + "Passive Surround Decoding" + ] + }, + { + "id": "rate", + "description": "Rate scaler", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "quality", + "name": "resample.quality", + "description": "Resample Quality", + "type": { "default": 4, "min": 0, "max": 14 }, + "params": true + }, + { + "name": "resample.disable", + "description": "Disable Resampling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "dither.noise", + "description": "Add noise bits", + "type": { "default": 0, "min": 0, "max": 16 }, + "params": true + }, + { + "name": "dither.method", + "description": "The dithering method", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "rectangular", + "Rectangular dithering", + "triangular", + "Triangular dithering", + "triangular-hf", + "Sloped Triangular dithering", + "wannamaker3", + "Wannamaker 3 dithering", + "shaped5", + "Lipshitz 5 dithering" + ] + }, + { + "name": "debug.wav-path", + "description": "Path to WAV file", + "type": "", + "params": true + }, + { + "name": "channelmix.lock-volumes", + "description": "Disable volume updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph.disable", + "description": "Disable Filter graph updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph", + "description": "A filter graph to load", + "type": "", + "params": true + }, + { + "id": "device", + "name": "api.alsa.path", + "description": "The ALSA device", + "type": "hw:Generic_1" + }, + { + "id": "deviceName", + "description": "The ALSA device name", + "type": "" + }, + { + "id": "cardName", + "description": "The ALSA card name", + "type": "" + }, + { + "id": "latencyOffsetNsec", + "description": "Latency offset (ns)", + "type": { "default": 0, "min": 0, "max": 2000000000 } + }, + { + "name": "audio.channels", + "description": "Audio Channels", + "type": 2, + "params": true + }, + { + "name": "audio.rate", + "description": "Audio Rate", + "type": 0, + "params": true + }, + { + "name": "audio.format", + "description": "Audio Format", + "type": "UNKNOWN", + "params": true + }, + { + "name": "audio.position", + "description": "Audio Position", + "type": "[ FL, FR ]", + "params": true + }, + { + "name": "audio.allowed-rates", + "description": "Audio Allowed Rates", + "type": "[ ]", + "params": true + }, + { + "name": "api.alsa.period-size", + "description": "Period Size", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.period-num", + "description": "Number of Periods", + "type": { "default": 0, "min": 0, "max": 1024 }, + "params": true + }, + { + "name": "api.alsa.headroom", + "description": "Headroom", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.start-delay", + "description": "Start Delay", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.disable-mmap", + "description": "Disable MMAP", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.disable-batch", + "description": "Disable Batch", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.disable-tsched", + "description": "Disable timer based scheduling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.use-chmap", + "description": "Use the driver channelmap", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "api.alsa.multi-rate", + "description": "Support multiple rates", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "api.alsa.htimestamp", + "description": "Use hires timestamps", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "latency.internal.rate", + "description": "Internal latency in samples", + "type": { "default": 0, "min": 0, "max": 65536 }, + "params": true + }, + { + "name": "latency.internal.ns", + "description": "Internal latency in nanoseconds", + "type": { "default": 0, "min": 0, "max": 2000000000 }, + "params": true + }, + { + "name": "clock.name", + "description": "The name of the clock", + "type": "api.alsa.p-1", + "params": true + }, + { + "name": "api.alsa.htimestamp.max-errors", + "description": "Max errors before disabling htimestamp", + "type": { "default": 64, "min": 0, "max": 2147483647 }, + "params": true + } + ], + "Props": [ + { + "volume": 1.000000, + "mute": true, + "channelVolumes": [ 0.386722, 0.386722 ], + "channelMap": [ "FL", "FR" ], + "softMute": true, + "softVolumes": [ 1.000000, 1.000000 ], + "monitorMute": false, + "monitorVolumes": [ 1.000000, 1.000000 ], + "params": [ + "monitor.channel-volumes", + false, + "channelmix.disable", + false, + "channelmix.min-volume", + 0.000000, + "channelmix.max-volume", + 10.000000, + "channelmix.normalize", + false, + "channelmix.mix-lfe", + true, + "channelmix.upmix", + true, + "channelmix.lfe-cutoff", + 0.000000, + "channelmix.fc-cutoff", + 0.000000, + "channelmix.rear-delay", + 0.000000, + "channelmix.stereo-widen", + 0.000000, + "channelmix.hilbert-taps", + 0, + "channelmix.upmix-method", + "none", + "resample.quality", + 4, + "resample.disable", + false, + "dither.noise", + 0, + "dither.method", + "none", + "debug.wav-path", + "", + "channelmix.lock-volumes", + false, + "audioconvert.filter-graph.disable", + false, + "audioconvert.filter-graph", + "" + ] + }, + { + "device": "hw:Generic_1", + "deviceName": "", + "cardName": "", + "latencyOffsetNsec": 0, + "params": [ + "audio.channels", + 2, + "audio.rate", + 0, + "audio.format", + "UNKNOWN", + "audio.position", + "[ FL, FR ]", + "audio.allowed-rates", + "[ ]", + "api.alsa.period-size", + 0, + "api.alsa.period-num", + 0, + "api.alsa.headroom", + 0, + "api.alsa.start-delay", + 0, + "api.alsa.disable-mmap", + false, + "api.alsa.disable-batch", + false, + "api.alsa.disable-tsched", + false, + "api.alsa.use-chmap", + true, + "api.alsa.multi-rate", + true, + "api.alsa.htimestamp", + false, + "api.alsa.htimestamp.max-errors", + 64, + "latency.internal.rate", + 0, + "latency.internal.ns", + 0, + "clock.name", + "api.alsa.p-1" + ] + } + ], + "Format": [ ], + "EnumPortConfig": [ + { + "direction": "Input", + "mode": { + "default": "none", + "alt1": "none", + "alt2": "dsp", + "alt3": "convert" + }, + "monitor": { + "default": false, + "alt1": false, + "alt2": true + }, + "control": { + "default": false, + "alt1": false, + "alt2": true + } + } + ], + "PortConfig": [ + { + "direction": "Input", + "mode": "dsp", + "monitor": true, + "control": false, + "format": { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": "F32P", + "channels": 2, + "position": [ "FL", "FR" ] + } + } + ], + "Latency": [ + { + "direction": "Input", + "minQuantum": 1.000000, + "maxQuantum": 1.000000, + "minRate": 0, + "maxRate": 0, + "minNs": 0, + "maxNs": 0 + }, + { + "direction": "Output", + "minQuantum": 0.000000, + "maxQuantum": 0.000000, + "minRate": 0, + "maxRate": 0, + "minNs": 0, + "maxNs": 0 + } + ], + "ProcessLatency": [ + { + "quantum": 0.000000, + "rate": 0, + "ns": 0 + } + ], + "Tag": [ + { + "direction": "Output", + "info": [ + 2, + "media.name", + "playback", + "media.class", + "Stream/Output/Audio" + ] + } + ] + } + } + }, + { + "id": 53, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 0, + "max-output-ports": 65, + "change-mask": [ "input-ports", "output-ports", "state", "props", "params" ], + "n-input-ports": 0, + "n-output-ports": 2, + "state": "suspended", + "error": null, + "props": { + "alsa.card": 1, + "alsa.card_name": "HD-Audio Generic", + "alsa.class": "generic", + "alsa.components": "HDA:10ec0245,103c8d08,00100001", + "alsa.device": 0, + "alsa.driver_name": "snd_hda_intel", + "alsa.id": "ALC245 Analog", + "alsa.long_card_name": "HD-Audio Generic at 0xb45c0000 irq 143", + "alsa.mixer_device": "_ucm0003.hw:Generic_1", + "alsa.mixer_name": "Realtek ALC245", + "alsa.name": "ALC245 Analog", + "alsa.resolution_bits": 16, + "alsa.subclass": "generic-mix", + "alsa.subdevice": 0, + "alsa.subdevice_name": "subdevice #0", + "alsa.sync.id": "00000000:00000000:00000000:00000000", + "api.alsa.card.longname": "HD-Audio Generic at 0xb45c0000 irq 143", + "api.alsa.card.name": "HD-Audio Generic", + "api.alsa.open.ucm": true, + "api.alsa.path": "hw:Generic_1", + "api.alsa.pcm.card": 1, + "api.alsa.pcm.stream": "capture", + "audio.channels": 2, + "audio.position": "FL,FR", + "card.profile.device": 1, + "client.id": 42, + "clock.quantum-limit": 8192, + "device.api": "alsa", + "device.class": "sound", + "device.icon-name": "audio-card-analog", + "device.icon_name": "audio-input-microphone", + "device.id": 45, + "device.profile.description": "Headphones Stereo Microphone", + "device.profile.name": "HiFi: Mic2: source", + "device.routes": 1, + "factory.id": 19, + "factory.name": "api.alsa.pcm.source", + "library.name": "audioconvert/libspa-audioconvert", + "media.class": "Audio/Source", + "node.description": "Family 17h/19h/1ah HD Audio Controller Headphones Stereo Microphone", + "node.driver": true, + "node.loop.name": "data-loop.0", + "node.name": "alsa_input.pci-0000_c3_00.6.HiFi__Mic2__source", + "node.nick": "ALC245 Analog", + "node.pause-on-idle": false, + "object.id": 53, + "object.path": "alsa:acp:Generic_1:1:capture", + "object.serial": 53, + "port.group": "capture", + "priority.driver": 2000, + "priority.session": 2000 + }, + "params": { + "EnumFormat": [ + { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": { + "default": "S32LE", + "alt1": "S32LE", + "alt2": "S16LE" + }, + "rate": { "default": 48000, "min": 44100, "max": 192000 }, + "channels": 2, + "position": [ "FL", "FR" ] + } + ], + "PropInfo": [ + { + "id": "volume", + "description": "Volume", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "mute", + "description": "Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "channelVolumes", + "description": "Channel Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "channelMap", + "description": "Channel Map", + "type": "", + "container": "Array" + }, + { + "id": "monitorMute", + "description": "Monitor Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "monitorVolumes", + "description": "Monitor Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "softMute", + "description": "Soft Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "softVolumes", + "description": "Soft Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "name": "monitor.channel-volumes", + "description": "Monitor channel volume", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.disable", + "description": "Disable Channel mixing", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.min-volume", + "description": "Minimum volume level", + "type": { "default": 0.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.max-volume", + "description": "Maximum volume level", + "type": { "default": 10.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.normalize", + "description": "Normalize Volumes", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.mix-lfe", + "description": "Mix LFE into channels", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.upmix", + "description": "Enable upmixing", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.lfe-cutoff", + "description": "LFE cutoff frequency", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.fc-cutoff", + "description": "FC cutoff frequency (Hz)", + "type": { "default": 0.000000, "min": 0.000000, "max": 48000.000000 }, + "params": true + }, + { + "name": "channelmix.rear-delay", + "description": "Rear channels delay (ms)", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.stereo-widen", + "description": "Stereo widen", + "type": { "default": 0.000000, "min": 0.000000, "max": 1.000000 }, + "params": true + }, + { + "name": "channelmix.hilbert-taps", + "description": "Taps for phase shift of rear", + "type": { "default": 0, "min": 0, "max": 255 }, + "params": true + }, + { + "name": "channelmix.upmix-method", + "description": "Upmix method to use", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "simple", + "Simple upmixing", + "psd", + "Passive Surround Decoding" + ] + }, + { + "id": "rate", + "description": "Rate scaler", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "quality", + "name": "resample.quality", + "description": "Resample Quality", + "type": { "default": 4, "min": 0, "max": 14 }, + "params": true + }, + { + "name": "resample.disable", + "description": "Disable Resampling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "dither.noise", + "description": "Add noise bits", + "type": { "default": 0, "min": 0, "max": 16 }, + "params": true + }, + { + "name": "dither.method", + "description": "The dithering method", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "rectangular", + "Rectangular dithering", + "triangular", + "Triangular dithering", + "triangular-hf", + "Sloped Triangular dithering", + "wannamaker3", + "Wannamaker 3 dithering", + "shaped5", + "Lipshitz 5 dithering" + ] + }, + { + "name": "debug.wav-path", + "description": "Path to WAV file", + "type": "", + "params": true + }, + { + "name": "channelmix.lock-volumes", + "description": "Disable volume updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph.disable", + "description": "Disable Filter graph updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph", + "description": "A filter graph to load", + "type": "", + "params": true + }, + { + "id": "device", + "name": "api.alsa.path", + "description": "The ALSA device", + "type": "hw:Generic_1" + }, + { + "id": "deviceName", + "description": "The ALSA device name", + "type": "" + }, + { + "id": "cardName", + "description": "The ALSA card name", + "type": "" + }, + { + "id": "latencyOffsetNsec", + "description": "Latency offset (ns)", + "type": { "default": 0, "min": 0, "max": 2000000000 } + }, + { + "name": "audio.channels", + "description": "Audio Channels", + "type": 2, + "params": true + }, + { + "name": "audio.rate", + "description": "Audio Rate", + "type": 0, + "params": true + }, + { + "name": "audio.format", + "description": "Audio Format", + "type": "UNKNOWN", + "params": true + }, + { + "name": "audio.position", + "description": "Audio Position", + "type": "[ FL, FR ]", + "params": true + }, + { + "name": "audio.allowed-rates", + "description": "Audio Allowed Rates", + "type": "[ ]", + "params": true + }, + { + "name": "api.alsa.period-size", + "description": "Period Size", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.period-num", + "description": "Number of Periods", + "type": { "default": 0, "min": 0, "max": 1024 }, + "params": true + }, + { + "name": "api.alsa.headroom", + "description": "Headroom", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.start-delay", + "description": "Start Delay", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.disable-mmap", + "description": "Disable MMAP", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.disable-batch", + "description": "Disable Batch", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.disable-tsched", + "description": "Disable timer based scheduling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.use-chmap", + "description": "Use the driver channelmap", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "api.alsa.multi-rate", + "description": "Support multiple rates", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "api.alsa.htimestamp", + "description": "Use hires timestamps", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "latency.internal.rate", + "description": "Internal latency in samples", + "type": { "default": 0, "min": 0, "max": 65536 }, + "params": true + }, + { + "name": "latency.internal.ns", + "description": "Internal latency in nanoseconds", + "type": { "default": 0, "min": 0, "max": 2000000000 }, + "params": true + }, + { + "name": "clock.name", + "description": "The name of the clock", + "type": "api.alsa.c-1", + "params": true + }, + { + "name": "api.alsa.htimestamp.max-errors", + "description": "Max errors before disabling htimestamp", + "type": { "default": 64, "min": 0, "max": 2147483647 }, + "params": true + } + ], + "Props": [ + { + "volume": 1.000000, + "mute": false, + "channelVolumes": [ 1.000000, 1.000000 ], + "channelMap": [ "FL", "FR" ], + "softMute": false, + "softVolumes": [ 1.000000, 1.000000 ], + "monitorMute": false, + "monitorVolumes": [ 1.000000, 1.000000 ], + "params": [ + "monitor.channel-volumes", + false, + "channelmix.disable", + false, + "channelmix.min-volume", + 0.000000, + "channelmix.max-volume", + 10.000000, + "channelmix.normalize", + false, + "channelmix.mix-lfe", + true, + "channelmix.upmix", + true, + "channelmix.lfe-cutoff", + 0.000000, + "channelmix.fc-cutoff", + 0.000000, + "channelmix.rear-delay", + 0.000000, + "channelmix.stereo-widen", + 0.000000, + "channelmix.hilbert-taps", + 0, + "channelmix.upmix-method", + "none", + "resample.quality", + 4, + "resample.disable", + false, + "dither.noise", + 0, + "dither.method", + "none", + "debug.wav-path", + "", + "channelmix.lock-volumes", + false, + "audioconvert.filter-graph.disable", + false, + "audioconvert.filter-graph", + "" + ] + }, + { + "device": "hw:Generic_1", + "deviceName": "", + "cardName": "", + "latencyOffsetNsec": 0, + "params": [ + "audio.channels", + 2, + "audio.rate", + 0, + "audio.format", + "UNKNOWN", + "audio.position", + "[ FL, FR ]", + "audio.allowed-rates", + "[ ]", + "api.alsa.period-size", + 0, + "api.alsa.period-num", + 0, + "api.alsa.headroom", + 0, + "api.alsa.start-delay", + 0, + "api.alsa.disable-mmap", + false, + "api.alsa.disable-batch", + false, + "api.alsa.disable-tsched", + false, + "api.alsa.use-chmap", + true, + "api.alsa.multi-rate", + true, + "api.alsa.htimestamp", + false, + "api.alsa.htimestamp.max-errors", + 64, + "latency.internal.rate", + 0, + "latency.internal.ns", + 0, + "clock.name", + "api.alsa.c-1" + ] + } + ], + "Format": [ ], + "EnumPortConfig": [ + { + "direction": "Output", + "mode": { + "default": "none", + "alt1": "none", + "alt2": "dsp", + "alt3": "convert" + }, + "monitor": { + "default": false, + "alt1": false, + "alt2": true + }, + "control": { + "default": false, + "alt1": false, + "alt2": true + } + } + ], + "PortConfig": [ + { + "direction": "Output", + "mode": "dsp", + "monitor": true, + "control": false, + "format": { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": "F32P", + "channels": 2, + "position": [ "FL", "FR" ] + } + } + ], + "Latency": [ + { + "direction": "Input", + "minQuantum": 0.000000, + "maxQuantum": 0.000000, + "minRate": 0, + "maxRate": 0, + "minNs": 0, + "maxNs": 0 + }, + { + "direction": "Output", + "minQuantum": 1.000000, + "maxQuantum": 1.000000, + "minRate": 0, + "maxRate": 0, + "minNs": 0, + "maxNs": 0 + } + ], + "ProcessLatency": [ + { + "quantum": 0.000000, + "rate": 0, + "ns": 0 + } + ], + "Tag": [ + ] + } + } + }, + { + "id": 54, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 0, + "max-output-ports": 65, + "change-mask": [ "input-ports", "output-ports", "state", "props", "params" ], + "n-input-ports": 0, + "n-output-ports": 2, + "state": "suspended", + "error": null, + "props": { + "alsa.card": 2, + "alsa.card_name": "acp-pdm-mach", + "alsa.class": "generic", + "alsa.device": 0, + "alsa.driver_name": "snd_acp_legacy_mach", + "alsa.id": "DMIC capture dmic-hifi-0", + "alsa.long_card_name": "HP-HPEliteBookXG1a14inchNotebookNextGenAIPC-SBKPFSBKPFV2-8D08", + "alsa.mixer_device": "_ucm0003.hw:Generic_1", + "alsa.name": "", + "alsa.resolution_bits": 32, + "alsa.subclass": "generic-mix", + "alsa.subdevice": 0, + "alsa.subdevice_name": "subdevice #0", + "alsa.sync.id": "00000000:00000000:00000000:00000000", + "api.alsa.card.longname": "HD-Audio Generic at 0xb45c0000 irq 143", + "api.alsa.card.name": "HD-Audio Generic", + "api.alsa.open.ucm": true, + "api.alsa.path": "hw:acppdmmach", + "api.alsa.pcm.card": 1, + "api.alsa.pcm.stream": "capture", + "audio.channels": 2, + "audio.position": "FL,FR", + "card.profile.device": 2, + "client.id": 42, + "clock.quantum-limit": 8192, + "device.api": "alsa", + "device.class": "sound", + "device.icon-name": "audio-card-analog", + "device.icon_name": "audio-input-microphone", + "device.id": 45, + "device.profile.description": "Digital Microphone", + "device.profile.name": "HiFi: Mic1: source", + "device.routes": 1, + "factory.id": 19, + "factory.name": "api.alsa.pcm.source", + "library.name": "audioconvert/libspa-audioconvert", + "media.class": "Audio/Source", + "node.description": "Family 17h/19h/1ah HD Audio Controller Digital Microphone", + "node.driver": true, + "node.loop.name": "data-loop.0", + "node.name": "alsa_input.pci-0000_c3_00.6.HiFi__Mic1__source", + "node.nick": "Digital Microphone", + "node.pause-on-idle": false, + "object.id": 54, + "object.path": "alsa:acp:Generic_1:2:capture", + "object.serial": 54, + "port.group": "capture", + "priority.driver": 2000, + "priority.session": 2000 + }, + "params": { + "EnumFormat": [ + { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": "S32LE", + "rate": 48000, + "channels": 2, + "position": [ "FL", "FR" ] + } + ], + "PropInfo": [ + { + "id": "volume", + "description": "Volume", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "mute", + "description": "Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "channelVolumes", + "description": "Channel Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "channelMap", + "description": "Channel Map", + "type": "", + "container": "Array" + }, + { + "id": "monitorMute", + "description": "Monitor Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "monitorVolumes", + "description": "Monitor Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "softMute", + "description": "Soft Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "softVolumes", + "description": "Soft Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "name": "monitor.channel-volumes", + "description": "Monitor channel volume", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.disable", + "description": "Disable Channel mixing", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.min-volume", + "description": "Minimum volume level", + "type": { "default": 0.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.max-volume", + "description": "Maximum volume level", + "type": { "default": 10.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.normalize", + "description": "Normalize Volumes", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.mix-lfe", + "description": "Mix LFE into channels", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.upmix", + "description": "Enable upmixing", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.lfe-cutoff", + "description": "LFE cutoff frequency", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.fc-cutoff", + "description": "FC cutoff frequency (Hz)", + "type": { "default": 0.000000, "min": 0.000000, "max": 48000.000000 }, + "params": true + }, + { + "name": "channelmix.rear-delay", + "description": "Rear channels delay (ms)", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.stereo-widen", + "description": "Stereo widen", + "type": { "default": 0.000000, "min": 0.000000, "max": 1.000000 }, + "params": true + }, + { + "name": "channelmix.hilbert-taps", + "description": "Taps for phase shift of rear", + "type": { "default": 0, "min": 0, "max": 255 }, + "params": true + }, + { + "name": "channelmix.upmix-method", + "description": "Upmix method to use", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "simple", + "Simple upmixing", + "psd", + "Passive Surround Decoding" + ] + }, + { + "id": "rate", + "description": "Rate scaler", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "quality", + "name": "resample.quality", + "description": "Resample Quality", + "type": { "default": 4, "min": 0, "max": 14 }, + "params": true + }, + { + "name": "resample.disable", + "description": "Disable Resampling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "dither.noise", + "description": "Add noise bits", + "type": { "default": 0, "min": 0, "max": 16 }, + "params": true + }, + { + "name": "dither.method", + "description": "The dithering method", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "rectangular", + "Rectangular dithering", + "triangular", + "Triangular dithering", + "triangular-hf", + "Sloped Triangular dithering", + "wannamaker3", + "Wannamaker 3 dithering", + "shaped5", + "Lipshitz 5 dithering" + ] + }, + { + "name": "debug.wav-path", + "description": "Path to WAV file", + "type": "", + "params": true + }, + { + "name": "channelmix.lock-volumes", + "description": "Disable volume updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph.disable", + "description": "Disable Filter graph updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph", + "description": "A filter graph to load", + "type": "", + "params": true + }, + { + "id": "device", + "name": "api.alsa.path", + "description": "The ALSA device", + "type": "hw:acppdmmach" + }, + { + "id": "deviceName", + "description": "The ALSA device name", + "type": "" + }, + { + "id": "cardName", + "description": "The ALSA card name", + "type": "" + }, + { + "id": "latencyOffsetNsec", + "description": "Latency offset (ns)", + "type": { "default": 0, "min": 0, "max": 2000000000 } + }, + { + "name": "audio.channels", + "description": "Audio Channels", + "type": 2, + "params": true + }, + { + "name": "audio.rate", + "description": "Audio Rate", + "type": 0, + "params": true + }, + { + "name": "audio.format", + "description": "Audio Format", + "type": "UNKNOWN", + "params": true + }, + { + "name": "audio.position", + "description": "Audio Position", + "type": "[ FL, FR ]", + "params": true + }, + { + "name": "audio.allowed-rates", + "description": "Audio Allowed Rates", + "type": "[ ]", + "params": true + }, + { + "name": "api.alsa.period-size", + "description": "Period Size", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.period-num", + "description": "Number of Periods", + "type": { "default": 0, "min": 0, "max": 1024 }, + "params": true + }, + { + "name": "api.alsa.headroom", + "description": "Headroom", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.start-delay", + "description": "Start Delay", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.disable-mmap", + "description": "Disable MMAP", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.disable-batch", + "description": "Disable Batch", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.disable-tsched", + "description": "Disable timer based scheduling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.use-chmap", + "description": "Use the driver channelmap", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "api.alsa.multi-rate", + "description": "Support multiple rates", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "api.alsa.htimestamp", + "description": "Use hires timestamps", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "latency.internal.rate", + "description": "Internal latency in samples", + "type": { "default": 0, "min": 0, "max": 65536 }, + "params": true + }, + { + "name": "latency.internal.ns", + "description": "Internal latency in nanoseconds", + "type": { "default": 0, "min": 0, "max": 2000000000 }, + "params": true + }, + { + "name": "clock.name", + "description": "The name of the clock", + "type": "api.alsa.c-1", + "params": true + }, + { + "name": "api.alsa.htimestamp.max-errors", + "description": "Max errors before disabling htimestamp", + "type": { "default": 64, "min": 0, "max": 2147483647 }, + "params": true + } + ], + "Props": [ + { + "volume": 1.000000, + "mute": false, + "channelVolumes": [ 1.000000, 1.000000 ], + "channelMap": [ "FL", "FR" ], + "softMute": false, + "softVolumes": [ 1.000000, 1.000000 ], + "monitorMute": false, + "monitorVolumes": [ 1.000000, 1.000000 ], + "params": [ + "monitor.channel-volumes", + false, + "channelmix.disable", + false, + "channelmix.min-volume", + 0.000000, + "channelmix.max-volume", + 10.000000, + "channelmix.normalize", + false, + "channelmix.mix-lfe", + true, + "channelmix.upmix", + true, + "channelmix.lfe-cutoff", + 0.000000, + "channelmix.fc-cutoff", + 0.000000, + "channelmix.rear-delay", + 0.000000, + "channelmix.stereo-widen", + 0.000000, + "channelmix.hilbert-taps", + 0, + "channelmix.upmix-method", + "none", + "resample.quality", + 4, + "resample.disable", + false, + "dither.noise", + 0, + "dither.method", + "none", + "debug.wav-path", + "", + "channelmix.lock-volumes", + false, + "audioconvert.filter-graph.disable", + false, + "audioconvert.filter-graph", + "" + ] + }, + { + "device": "hw:acppdmmach", + "deviceName": "", + "cardName": "", + "latencyOffsetNsec": 0, + "params": [ + "audio.channels", + 2, + "audio.rate", + 0, + "audio.format", + "UNKNOWN", + "audio.position", + "[ FL, FR ]", + "audio.allowed-rates", + "[ ]", + "api.alsa.period-size", + 0, + "api.alsa.period-num", + 0, + "api.alsa.headroom", + 0, + "api.alsa.start-delay", + 0, + "api.alsa.disable-mmap", + false, + "api.alsa.disable-batch", + false, + "api.alsa.disable-tsched", + false, + "api.alsa.use-chmap", + true, + "api.alsa.multi-rate", + true, + "api.alsa.htimestamp", + false, + "api.alsa.htimestamp.max-errors", + 64, + "latency.internal.rate", + 0, + "latency.internal.ns", + 0, + "clock.name", + "api.alsa.c-1" + ] + } + ], + "Format": [ ], + "EnumPortConfig": [ + { + "direction": "Output", + "mode": { + "default": "none", + "alt1": "none", + "alt2": "dsp", + "alt3": "convert" + }, + "monitor": { + "default": false, + "alt1": false, + "alt2": true + }, + "control": { + "default": false, + "alt1": false, + "alt2": true + } + } + ], + "PortConfig": [ + { + "direction": "Output", + "mode": "dsp", + "monitor": true, + "control": false, + "format": { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": "F32P", + "channels": 2, + "position": [ "FL", "FR" ] + } + } + ], + "Latency": [ + { + "direction": "Input", + "minQuantum": 0.000000, + "maxQuantum": 0.000000, + "minRate": 0, + "maxRate": 0, + "minNs": 0, + "maxNs": 0 + }, + { + "direction": "Output", + "minQuantum": 1.000000, + "maxQuantum": 1.000000, + "minRate": 32, + "maxRate": 32, + "minNs": 0, + "maxNs": 0 + } + ], + "ProcessLatency": [ + { + "quantum": 0.000000, + "rate": 0, + "ns": 0 + } + ], + "Tag": [ + ] + } + } + }, + { + "id": 71, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 0, + "max-output-ports": 1, + "change-mask": [ "input-ports", "output-ports", "state", "props", "params" ], + "n-input-ports": 0, + "n-output-ports": 1, + "state": "suspended", + "error": null, + "props": { + "api.v4l2.cap.bus_info": "usb-0000:c3:00.4-1", + "api.v4l2.cap.capabilities": "84a00001", + "api.v4l2.cap.card": "HP 5MP Camera: HP 5MP Camera", + "api.v4l2.cap.device-caps": 4200001, + "api.v4l2.cap.driver": "uvcvideo", + "api.v4l2.cap.version": "6.17.13", + "api.v4l2.path": "/dev/video0", + "client.id": 42, + "clock.quantum-limit": 8192, + "device.api": "v4l2", + "device.devids": "[ 20736 ]", + "device.id": 55, + "device.product.id": "0x00e4", + "device.vendor.id": "0x30c9", + "factory.id": 11, + "factory.name": "api.v4l2.source", + "media.class": "Video/Source", + "media.role": "Camera", + "node.description": "HP 5MP Camera (V4L2)", + "node.driver": true, + "node.loop.name": "data-loop.0", + "node.name": "v4l2_input.pci-0000_c3_00.4-usb-0_1_1.0", + "node.nick": "HP 5MP Camera", + "node.pause-on-idle": false, + "object.id": 71, + "object.path": "v4l2:/dev/video0", + "object.serial": 71, + "priority.session": 1000 + }, + "params": { + "PropInfo": [ + { + "id": "device", + "description": "The V4L2 device", + "type": "/dev/video0" + }, + { + "id": "deviceName", + "description": "The V4L2 device name", + "type": "" + }, + { + "id": "deviceFd", + "description": "The V4L2 fd", + "type": 0 + }, + { + "id": "brightness", + "type": { "default": 0, "min": -64, "max": 64, "step": 1 }, + "description": "Brightness" + }, + { + "id": "contrast", + "type": { "default": 32, "min": 0, "max": 64, "step": 1 }, + "description": "Contrast" + }, + { + "id": "saturation", + "type": { "default": 64, "min": 0, "max": 128, "step": 1 }, + "description": "Saturation" + }, + { + "id": "hue", + "type": { "default": 0, "min": -40, "max": 40, "step": 1 }, + "description": "Hue" + }, + { + "id": "id-0198090c", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "description": "White Balance, Automatic" + }, + { + "id": "gamma", + "type": { "default": 100, "min": 72, "max": 500, "step": 1 }, + "description": "Gamma" + }, + { + "id": "gain", + "type": { "default": 0, "min": 0, "max": 4, "step": 1 }, + "description": "Gain" + }, + { + "id": "id-01980918", + "type": { + "default": 2 + }, + "description": "Power Line Frequency", + "labels": [ + 0, + "Disabled", + 1, + "50 Hz", + 2, + "60 Hz" + ] + }, + { + "id": "id-0198091a", + "type": { "default": 4000, "min": 2800, "max": 6500, "step": 1 }, + "description": "White Balance Temperature" + }, + { + "id": "sharpness", + "type": { "default": 0, "min": 0, "max": 5, "step": 1 }, + "description": "Sharpness" + }, + { + "id": "id-0198091c", + "type": { "default": 0, "min": 0, "max": 1, "step": 1 }, + "description": "Backlight Compensation" + }, + { + "id": "id-019a0901", + "type": { + "default": 3 + }, + "description": "Auto Exposure", + "labels": [ + 1, + "Manual Mode", + 3, + "Aperture Priority Mode" + ] + }, + { + "id": "id-019a0902", + "type": { "default": 300, "min": 50, "max": 10000, "step": 1 }, + "description": "Exposure Time, Absolute" + }, + { + "id": "id-019a0903", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "description": "Exposure, Dynamic Framerate" + }, + { + "id": "id-019a0910", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "description": "Privacy" + } + ], + "Props": [ + { + "device": "/dev/video0", + "deviceName": "", + "deviceFd": 0, + "brightness": 0, + "contrast": 32, + "saturation": 64, + "hue": 0, + "id-0198090c": true, + "gamma": 100, + "gain": 0, + "id-01980918": 2, + "id-0198091a": 4000, + "sharpness": 0, + "id-0198091c": 0, + "id-019a0901": 3, + "id-019a0902": 300, + "id-019a0903": true, + "id-019a0910": false + } + ], + "EnumFormat": [ + { + "mediaType": "video", + "mediaSubtype": "mjpg", + "size": { "width": 640, "height": 480 }, + "framerate": { + "default": { "num": 30, "denom": 1 }, + "alt1": { "num": 30, "denom": 1 }, + "alt2": { "num": 15, "denom": 1 } + } + }, + { + "mediaType": "video", + "mediaSubtype": "mjpg", + "size": { "width": 640, "height": 360 }, + "framerate": { + "default": { "num": 30, "denom": 1 }, + "alt1": { "num": 30, "denom": 1 }, + "alt2": { "num": 15, "denom": 1 } + } + }, + { + "mediaType": "video", + "mediaSubtype": "mjpg", + "size": { "width": 1280, "height": 720 }, + "framerate": { + "default": { "num": 30, "denom": 1 }, + "alt1": { "num": 30, "denom": 1 }, + "alt2": { "num": 15, "denom": 1 } + } + }, + { + "mediaType": "video", + "mediaSubtype": "mjpg", + "size": { "width": 1920, "height": 1080 }, + "framerate": { + "default": { "num": 30, "denom": 1 }, + "alt1": { "num": 30, "denom": 1 }, + "alt2": { "num": 15, "denom": 1 } + } + }, + { + "mediaType": "video", + "mediaSubtype": "mjpg", + "size": { "width": 2560, "height": 1440 }, + "framerate": { + "default": { "num": 30, "denom": 1 }, + "alt1": { "num": 30, "denom": 1 }, + "alt2": { "num": 15, "denom": 1 } + } + }, + { + "mediaType": "video", + "mediaSubtype": "mjpg", + "size": { "width": 2880, "height": 1800 }, + "framerate": { + "default": { "num": 30, "denom": 1 }, + "alt1": { "num": 30, "denom": 1 }, + "alt2": { "num": 15, "denom": 1 } + } + }, + { + "mediaType": "video", + "mediaSubtype": "raw", + "format": "YUY2", + "size": { "width": 640, "height": 480 }, + "framerate": { + "default": { "num": 30, "denom": 1 }, + "alt1": { "num": 30, "denom": 1 }, + "alt2": { "num": 15, "denom": 1 } + } + }, + { + "mediaType": "video", + "mediaSubtype": "raw", + "format": "YUY2", + "size": { "width": 640, "height": 360 }, + "framerate": { + "default": { "num": 30, "denom": 1 }, + "alt1": { "num": 30, "denom": 1 }, + "alt2": { "num": 15, "denom": 1 } + } + } + ], + "Format": [ ] + } + } + }, + { + "id": 73, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 0, + "max-output-ports": 1, + "change-mask": [ "input-ports", "output-ports", "state", "props", "params" ], + "n-input-ports": 0, + "n-output-ports": 1, + "state": "suspended", + "error": null, + "props": { + "api.v4l2.cap.bus_info": "usb-0000:c3:00.4-1", + "api.v4l2.cap.capabilities": "84a00001", + "api.v4l2.cap.card": "HP 5MP Camera: HP IR Camera", + "api.v4l2.cap.device-caps": 4200001, + "api.v4l2.cap.driver": "uvcvideo", + "api.v4l2.cap.version": "6.17.13", + "api.v4l2.path": "/dev/video2", + "client.id": 42, + "clock.quantum-limit": 8192, + "device.api": "v4l2", + "device.devids": "[ 20738 ]", + "device.id": 57, + "device.product.id": "0x00e4", + "device.vendor.id": "0x30c9", + "factory.id": 11, + "factory.name": "api.v4l2.source", + "media.class": "Video/Source", + "media.role": "Camera", + "node.description": "HP 5MP Camera (V4L2)", + "node.driver": true, + "node.loop.name": "data-loop.0", + "node.name": "v4l2_input.pci-0000_c3_00.4-usb-0_1_1.2", + "node.nick": "HP 5MP Camera", + "node.pause-on-idle": false, + "object.id": 73, + "object.path": "v4l2:/dev/video2", + "object.serial": 73, + "priority.session": 980 + }, + "params": { + "PropInfo": [ + { + "id": "device", + "description": "The V4L2 device", + "type": "/dev/video2" + }, + { + "id": "deviceName", + "description": "The V4L2 device name", + "type": "" + }, + { + "id": "deviceFd", + "description": "The V4L2 fd", + "type": 0 + }, + { + "id": "id-019a0910", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "description": "Privacy" + } + ], + "Props": [ + { + "device": "/dev/video2", + "deviceName": "", + "deviceFd": 0, + "id-019a0910": false + } + ], + "EnumFormat": [ + { + "mediaType": "video", + "mediaSubtype": "raw", + "format": "GRAY8", + "size": { "width": 640, "height": 360 }, + "framerate": { "num": 30, "denom": 1 } + } + ], + "Format": [ ] + } + } + }, + { + "id": 83, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 0, + "max-output-ports": 65, + "change-mask": [ "input-ports", "output-ports", "state", "props", "params" ], + "n-input-ports": 0, + "n-output-ports": 2, + "state": "idle", + "error": null, + "props": { + "adapt.follower.spa-node": "", + "application.language": "C", + "application.name": "speech-dispatcher-dummy", + "application.process.binary": "sd_dummy", + "application.process.host": "ubuntu-g1a", + "application.process.id": 40152, + "application.process.machine-id": "8ceb7e284d8a4d54a7b9a40080511fd9", + "application.process.user": "zhongning.li@canonical.com", + "client.api": "pipewire-pulse", + "client.id": 87, + "clock.quantum-limit": 8192, + "factory.id": 7, + "library.name": "audioconvert/libspa-audioconvert", + "media.class": "Stream/Output/Audio", + "media.name": "playback", + "node.autoconnect": true, + "node.latency": "471/44100", + "node.loop.name": "data-loop.0", + "node.name": "speech-dispatcher-dummy", + "node.rate": "1/44100", + "node.want-driver": true, + "object.id": 83, + "object.register": false, + "object.serial": 174, + "port.group": "stream.0", + "pulse.attr.maxlength": 4194304, + "pulse.attr.minreq": 942, + "pulse.attr.prebuf": 1886, + "pulse.attr.tlength": 2826, + "pulse.corked": false, + "pulse.idle.timeout": 5, + "pulse.min.quantum": "512/48000", + "pulse.min.req": "512/48000", + "pulse.server.type": "unix", + "stream.is-live": true, + "window.x11.display": ":0" + }, + "params": { + "EnumFormat": [ + { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": "S16LE", + "rate": 44100, + "channels": 1, + "position": [ "MONO" ] + } + ], + "PropInfo": [ + { + "id": "volume", + "description": "Volume", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "mute", + "description": "Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "channelVolumes", + "description": "Channel Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "channelMap", + "description": "Channel Map", + "type": "", + "container": "Array" + }, + { + "id": "monitorMute", + "description": "Monitor Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "monitorVolumes", + "description": "Monitor Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "softMute", + "description": "Soft Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "softVolumes", + "description": "Soft Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "name": "monitor.channel-volumes", + "description": "Monitor channel volume", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.disable", + "description": "Disable Channel mixing", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.min-volume", + "description": "Minimum volume level", + "type": { "default": 0.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.max-volume", + "description": "Maximum volume level", + "type": { "default": 10.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.normalize", + "description": "Normalize Volumes", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.mix-lfe", + "description": "Mix LFE into channels", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.upmix", + "description": "Enable upmixing", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.lfe-cutoff", + "description": "LFE cutoff frequency", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.fc-cutoff", + "description": "FC cutoff frequency (Hz)", + "type": { "default": 0.000000, "min": 0.000000, "max": 48000.000000 }, + "params": true + }, + { + "name": "channelmix.rear-delay", + "description": "Rear channels delay (ms)", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.stereo-widen", + "description": "Stereo widen", + "type": { "default": 0.000000, "min": 0.000000, "max": 1.000000 }, + "params": true + }, + { + "name": "channelmix.hilbert-taps", + "description": "Taps for phase shift of rear", + "type": { "default": 0, "min": 0, "max": 255 }, + "params": true + }, + { + "name": "channelmix.upmix-method", + "description": "Upmix method to use", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "simple", + "Simple upmixing", + "psd", + "Passive Surround Decoding" + ] + }, + { + "id": "rate", + "description": "Rate scaler", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "quality", + "name": "resample.quality", + "description": "Resample Quality", + "type": { "default": 4, "min": 0, "max": 14 }, + "params": true + }, + { + "name": "resample.disable", + "description": "Disable Resampling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "dither.noise", + "description": "Add noise bits", + "type": { "default": 0, "min": 0, "max": 16 }, + "params": true + }, + { + "name": "dither.method", + "description": "The dithering method", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "rectangular", + "Rectangular dithering", + "triangular", + "Triangular dithering", + "triangular-hf", + "Sloped Triangular dithering", + "wannamaker3", + "Wannamaker 3 dithering", + "shaped5", + "Lipshitz 5 dithering" + ] + }, + { + "name": "debug.wav-path", + "description": "Path to WAV file", + "type": "", + "params": true + }, + { + "name": "channelmix.lock-volumes", + "description": "Disable volume updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph.disable", + "description": "Disable Filter graph updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph", + "description": "A filter graph to load", + "type": "", + "params": true + } + ], + "Props": [ + { + "volume": 1.000000, + "mute": false, + "channelVolumes": [ 1.000000 ], + "channelMap": [ "MONO" ], + "softMute": false, + "softVolumes": [ 1.000000 ], + "monitorMute": false, + "monitorVolumes": [ 1.000000 ], + "params": [ + "monitor.channel-volumes", + false, + "channelmix.disable", + false, + "channelmix.min-volume", + 0.000000, + "channelmix.max-volume", + 10.000000, + "channelmix.normalize", + false, + "channelmix.mix-lfe", + true, + "channelmix.upmix", + true, + "channelmix.lfe-cutoff", + 0.000000, + "channelmix.fc-cutoff", + 0.000000, + "channelmix.rear-delay", + 0.000000, + "channelmix.stereo-widen", + 0.000000, + "channelmix.hilbert-taps", + 0, + "channelmix.upmix-method", + "none", + "resample.quality", + 4, + "resample.disable", + false, + "dither.noise", + 0, + "dither.method", + "none", + "debug.wav-path", + "", + "channelmix.lock-volumes", + false, + "audioconvert.filter-graph.disable", + false, + "audioconvert.filter-graph", + "" + ] + } + ], + "Format": [ + { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": "S16LE", + "rate": 44100, + "channels": 1, + "position": [ "MONO" ] + } + ], + "EnumPortConfig": [ + { + "direction": "Output", + "mode": { + "default": "none", + "alt1": "none", + "alt2": "dsp", + "alt3": "convert" + }, + "monitor": { + "default": false, + "alt1": false, + "alt2": true + }, + "control": { + "default": false, + "alt1": false, + "alt2": true + } + } + ], + "PortConfig": [ + { + "direction": "Output", + "mode": "dsp", + "monitor": true, + "control": false, + "format": { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": "F32P", + "channels": 2, + "position": [ "FL", "FR" ] + } + } + ], + "Latency": [ + { + "direction": "Input", + "minQuantum": 1.000000, + "maxQuantum": 1.000000, + "minRate": 0, + "maxRate": 0, + "minNs": 0, + "maxNs": 0 + } + ], + "ProcessLatency": [ + ], + "Tag": [ ] + } + } + }, + { + "id": 80, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 65, + "max-output-ports": 0, + "change-mask": [ "input-ports", "output-ports", "state", "props", "params" ], + "n-input-ports": 2, + "n-output-ports": 2, + "state": "suspended", + "error": null, + "props": { + "alsa.card": 0, + "alsa.card_name": "HD-Audio Generic", + "alsa.class": "generic", + "alsa.components": "HDA:1002aa01,00aa0100,00100900", + "alsa.device": 9, + "alsa.driver_name": "snd_hda_intel", + "alsa.id": "HDMI 3", + "alsa.long_card_name": "HD-Audio Generic at 0xb45c8000 irq 142", + "alsa.mixer_device": "_ucm0001.hw:Generic", + "alsa.mixer_name": "ATI R6xx HDMI", + "alsa.name": "HDMI 3", + "alsa.resolution_bits": 16, + "alsa.subclass": "generic-mix", + "alsa.subdevice": 0, + "alsa.subdevice_name": "subdevice #0", + "alsa.sync.id": "00000000:00000000:00000000:00000000", + "api.alsa.card.longname": "HD-Audio Generic at 0xb45c8000 irq 142", + "api.alsa.card.name": "HD-Audio Generic", + "api.alsa.open.ucm": true, + "api.alsa.path": "hw:Generic,9", + "api.alsa.pcm.card": 0, + "api.alsa.pcm.stream": "playback", + "audio.channels": 2, + "audio.position": "FL,FR", + "card.profile.device": 0, + "client.id": 42, + "clock.quantum-limit": 8192, + "device.api": "alsa", + "device.class": "sound", + "device.icon-name": "audio-card-analog", + "device.icon_name": "video-display", + "device.id": 44, + "device.profile.description": "HDMI / DisplayPort 4 Output", + "device.profile.name": "HiFi: HDMI4: sink", + "device.routes": 1, + "factory.id": 19, + "factory.name": "api.alsa.pcm.sink", + "library.name": "audioconvert/libspa-audioconvert", + "media.class": "Audio/Sink", + "node.description": "Radeon High Definition Audio Controller [Rembrandt/Strix] HDMI / DisplayPort 4 Output", + "node.driver": true, + "node.loop.name": "data-loop.0", + "node.name": "alsa_output.pci-0000_c3_00.1.HiFi__HDMI4__sink", + "node.nick": "HDMI 3", + "node.pause-on-idle": false, + "object.id": 80, + "object.path": "alsa:acp:Generic:0:playback", + "object.serial": 227, + "port.group": "playback", + "priority.driver": 600, + "priority.session": 600 + }, + "params": { + "EnumFormat": [ + { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": { + "default": "S32LE", + "alt1": "S32LE", + "alt2": "S16LE" + }, + "rate": { "default": 48000, "min": 32000, "max": 192000 }, + "channels": 2, + "position": [ "FL", "FR" ] + } + ], + "PropInfo": [ + { + "id": "volume", + "description": "Volume", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "mute", + "description": "Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "channelVolumes", + "description": "Channel Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "channelMap", + "description": "Channel Map", + "type": "", + "container": "Array" + }, + { + "id": "monitorMute", + "description": "Monitor Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "monitorVolumes", + "description": "Monitor Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "softMute", + "description": "Soft Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "softVolumes", + "description": "Soft Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "name": "monitor.channel-volumes", + "description": "Monitor channel volume", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.disable", + "description": "Disable Channel mixing", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.min-volume", + "description": "Minimum volume level", + "type": { "default": 0.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.max-volume", + "description": "Maximum volume level", + "type": { "default": 10.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.normalize", + "description": "Normalize Volumes", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.mix-lfe", + "description": "Mix LFE into channels", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.upmix", + "description": "Enable upmixing", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.lfe-cutoff", + "description": "LFE cutoff frequency", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.fc-cutoff", + "description": "FC cutoff frequency (Hz)", + "type": { "default": 0.000000, "min": 0.000000, "max": 48000.000000 }, + "params": true + }, + { + "name": "channelmix.rear-delay", + "description": "Rear channels delay (ms)", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.stereo-widen", + "description": "Stereo widen", + "type": { "default": 0.000000, "min": 0.000000, "max": 1.000000 }, + "params": true + }, + { + "name": "channelmix.hilbert-taps", + "description": "Taps for phase shift of rear", + "type": { "default": 0, "min": 0, "max": 255 }, + "params": true + }, + { + "name": "channelmix.upmix-method", + "description": "Upmix method to use", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "simple", + "Simple upmixing", + "psd", + "Passive Surround Decoding" + ] + }, + { + "id": "rate", + "description": "Rate scaler", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "quality", + "name": "resample.quality", + "description": "Resample Quality", + "type": { "default": 4, "min": 0, "max": 14 }, + "params": true + }, + { + "name": "resample.disable", + "description": "Disable Resampling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "dither.noise", + "description": "Add noise bits", + "type": { "default": 0, "min": 0, "max": 16 }, + "params": true + }, + { + "name": "dither.method", + "description": "The dithering method", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "rectangular", + "Rectangular dithering", + "triangular", + "Triangular dithering", + "triangular-hf", + "Sloped Triangular dithering", + "wannamaker3", + "Wannamaker 3 dithering", + "shaped5", + "Lipshitz 5 dithering" + ] + }, + { + "name": "debug.wav-path", + "description": "Path to WAV file", + "type": "", + "params": true + }, + { + "name": "channelmix.lock-volumes", + "description": "Disable volume updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph.disable", + "description": "Disable Filter graph updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph", + "description": "A filter graph to load", + "type": "", + "params": true + }, + { + "id": "device", + "name": "api.alsa.path", + "description": "The ALSA device", + "type": "hw:Generic,9" + }, + { + "id": "deviceName", + "description": "The ALSA device name", + "type": "" + }, + { + "id": "cardName", + "description": "The ALSA card name", + "type": "" + }, + { + "id": "latencyOffsetNsec", + "description": "Latency offset (ns)", + "type": { "default": 0, "min": 0, "max": 2000000000 } + }, + { + "name": "audio.channels", + "description": "Audio Channels", + "type": 2, + "params": true + }, + { + "name": "audio.rate", + "description": "Audio Rate", + "type": 0, + "params": true + }, + { + "name": "audio.format", + "description": "Audio Format", + "type": "UNKNOWN", + "params": true + }, + { + "name": "audio.position", + "description": "Audio Position", + "type": "[ FL, FR ]", + "params": true + }, + { + "name": "audio.allowed-rates", + "description": "Audio Allowed Rates", + "type": "[ ]", + "params": true + }, + { + "name": "api.alsa.period-size", + "description": "Period Size", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.period-num", + "description": "Number of Periods", + "type": { "default": 0, "min": 0, "max": 1024 }, + "params": true + }, + { + "name": "api.alsa.headroom", + "description": "Headroom", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.start-delay", + "description": "Start Delay", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.disable-mmap", + "description": "Disable MMAP", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.disable-batch", + "description": "Disable Batch", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.disable-tsched", + "description": "Disable timer based scheduling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.use-chmap", + "description": "Use the driver channelmap", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "api.alsa.multi-rate", + "description": "Support multiple rates", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "api.alsa.htimestamp", + "description": "Use hires timestamps", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "latency.internal.rate", + "description": "Internal latency in samples", + "type": { "default": 0, "min": 0, "max": 65536 }, + "params": true + }, + { + "name": "latency.internal.ns", + "description": "Internal latency in nanoseconds", + "type": { "default": 0, "min": 0, "max": 2000000000 }, + "params": true + }, + { + "name": "clock.name", + "description": "The name of the clock", + "type": "api.alsa.p-0", + "params": true + }, + { + "name": "api.alsa.htimestamp.max-errors", + "description": "Max errors before disabling htimestamp", + "type": { "default": 64, "min": 0, "max": 2147483647 }, + "params": true + } + ], + "Props": [ + { + "volume": 1.000000, + "mute": false, + "channelVolumes": [ 1.000000, 1.000000 ], + "channelMap": [ "FL", "FR" ], + "softMute": false, + "softVolumes": [ 1.000000, 1.000000 ], + "monitorMute": false, + "monitorVolumes": [ 1.000000, 1.000000 ], + "params": [ + "monitor.channel-volumes", + false, + "channelmix.disable", + false, + "channelmix.min-volume", + 0.000000, + "channelmix.max-volume", + 10.000000, + "channelmix.normalize", + false, + "channelmix.mix-lfe", + true, + "channelmix.upmix", + true, + "channelmix.lfe-cutoff", + 0.000000, + "channelmix.fc-cutoff", + 0.000000, + "channelmix.rear-delay", + 0.000000, + "channelmix.stereo-widen", + 0.000000, + "channelmix.hilbert-taps", + 0, + "channelmix.upmix-method", + "none", + "resample.quality", + 4, + "resample.disable", + false, + "dither.noise", + 0, + "dither.method", + "none", + "debug.wav-path", + "", + "channelmix.lock-volumes", + false, + "audioconvert.filter-graph.disable", + false, + "audioconvert.filter-graph", + "" + ] + }, + { + "device": "hw:Generic,9", + "deviceName": "", + "cardName": "", + "latencyOffsetNsec": 0, + "params": [ + "audio.channels", + 2, + "audio.rate", + 0, + "audio.format", + "UNKNOWN", + "audio.position", + "[ FL, FR ]", + "audio.allowed-rates", + "[ ]", + "api.alsa.period-size", + 0, + "api.alsa.period-num", + 0, + "api.alsa.headroom", + 0, + "api.alsa.start-delay", + 0, + "api.alsa.disable-mmap", + false, + "api.alsa.disable-batch", + false, + "api.alsa.disable-tsched", + false, + "api.alsa.use-chmap", + true, + "api.alsa.multi-rate", + true, + "api.alsa.htimestamp", + false, + "api.alsa.htimestamp.max-errors", + 64, + "latency.internal.rate", + 0, + "latency.internal.ns", + 0, + "clock.name", + "api.alsa.p-0" + ] + } + ], + "Format": [ ], + "EnumPortConfig": [ + { + "direction": "Input", + "mode": { + "default": "none", + "alt1": "none", + "alt2": "dsp", + "alt3": "convert" + }, + "monitor": { + "default": false, + "alt1": false, + "alt2": true + }, + "control": { + "default": false, + "alt1": false, + "alt2": true + } + } + ], + "PortConfig": [ + { + "direction": "Input", + "mode": "dsp", + "monitor": true, + "control": false, + "format": { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": "F32P", + "channels": 2, + "position": [ "FL", "FR" ] + } + } + ], + "Latency": [ + { + "direction": "Input", + "minQuantum": 1.000000, + "maxQuantum": 1.000000, + "minRate": 0, + "maxRate": 0, + "minNs": 0, + "maxNs": 0 + }, + { + "direction": "Output", + "minQuantum": 0.000000, + "maxQuantum": 0.000000, + "minRate": 0, + "maxRate": 0, + "minNs": 0, + "maxNs": 0 + } + ], + "ProcessLatency": [ + { + "quantum": 0.000000, + "rate": 0, + "ns": 0 + } + ], + "Tag": [ + ] + } + } + }, + { + "id": 81, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 65, + "max-output-ports": 0, + "change-mask": [ "input-ports", "output-ports", "state", "props", "params" ], + "n-input-ports": 2, + "n-output-ports": 2, + "state": "suspended", + "error": null, + "props": { + "alsa.card": 0, + "alsa.card_name": "HD-Audio Generic", + "alsa.class": "generic", + "alsa.components": "HDA:1002aa01,00aa0100,00100900", + "alsa.device": 8, + "alsa.driver_name": "snd_hda_intel", + "alsa.id": "HDMI 2", + "alsa.long_card_name": "HD-Audio Generic at 0xb45c8000 irq 142", + "alsa.mixer_device": "_ucm0001.hw:Generic", + "alsa.mixer_name": "ATI R6xx HDMI", + "alsa.name": "HDMI 2", + "alsa.resolution_bits": 16, + "alsa.subclass": "generic-mix", + "alsa.subdevice": 0, + "alsa.subdevice_name": "subdevice #0", + "alsa.sync.id": "00000000:00000000:00000000:00000000", + "api.alsa.card.longname": "HD-Audio Generic at 0xb45c8000 irq 142", + "api.alsa.card.name": "HD-Audio Generic", + "api.alsa.open.ucm": true, + "api.alsa.path": "hw:Generic,8", + "api.alsa.pcm.card": 0, + "api.alsa.pcm.stream": "playback", + "audio.channels": 2, + "audio.position": "FL,FR", + "card.profile.device": 1, + "client.id": 42, + "clock.quantum-limit": 8192, + "device.api": "alsa", + "device.class": "sound", + "device.icon-name": "audio-card-analog", + "device.icon_name": "video-display", + "device.id": 44, + "device.profile.description": "HDMI / DisplayPort 3 Output", + "device.profile.name": "HiFi: HDMI3: sink", + "device.routes": 1, + "factory.id": 19, + "factory.name": "api.alsa.pcm.sink", + "library.name": "audioconvert/libspa-audioconvert", + "media.class": "Audio/Sink", + "node.description": "Radeon High Definition Audio Controller [Rembrandt/Strix] HDMI / DisplayPort 3 Output", + "node.driver": true, + "node.loop.name": "data-loop.0", + "node.name": "alsa_output.pci-0000_c3_00.1.HiFi__HDMI3__sink", + "node.nick": "HDMI 2", + "node.pause-on-idle": false, + "object.id": 81, + "object.path": "alsa:acp:Generic:1:playback", + "object.serial": 228, + "port.group": "playback", + "priority.driver": 616, + "priority.session": 616 + }, + "params": { + "EnumFormat": [ + { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": { + "default": "S32LE", + "alt1": "S32LE", + "alt2": "S16LE" + }, + "rate": { "default": 48000, "min": 32000, "max": 192000 }, + "channels": 2, + "position": [ "FL", "FR" ] + } + ], + "PropInfo": [ + { + "id": "volume", + "description": "Volume", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "mute", + "description": "Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "channelVolumes", + "description": "Channel Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "channelMap", + "description": "Channel Map", + "type": "", + "container": "Array" + }, + { + "id": "monitorMute", + "description": "Monitor Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "monitorVolumes", + "description": "Monitor Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "softMute", + "description": "Soft Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "softVolumes", + "description": "Soft Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "name": "monitor.channel-volumes", + "description": "Monitor channel volume", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.disable", + "description": "Disable Channel mixing", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.min-volume", + "description": "Minimum volume level", + "type": { "default": 0.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.max-volume", + "description": "Maximum volume level", + "type": { "default": 10.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.normalize", + "description": "Normalize Volumes", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.mix-lfe", + "description": "Mix LFE into channels", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.upmix", + "description": "Enable upmixing", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.lfe-cutoff", + "description": "LFE cutoff frequency", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.fc-cutoff", + "description": "FC cutoff frequency (Hz)", + "type": { "default": 0.000000, "min": 0.000000, "max": 48000.000000 }, + "params": true + }, + { + "name": "channelmix.rear-delay", + "description": "Rear channels delay (ms)", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.stereo-widen", + "description": "Stereo widen", + "type": { "default": 0.000000, "min": 0.000000, "max": 1.000000 }, + "params": true + }, + { + "name": "channelmix.hilbert-taps", + "description": "Taps for phase shift of rear", + "type": { "default": 0, "min": 0, "max": 255 }, + "params": true + }, + { + "name": "channelmix.upmix-method", + "description": "Upmix method to use", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "simple", + "Simple upmixing", + "psd", + "Passive Surround Decoding" + ] + }, + { + "id": "rate", + "description": "Rate scaler", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "quality", + "name": "resample.quality", + "description": "Resample Quality", + "type": { "default": 4, "min": 0, "max": 14 }, + "params": true + }, + { + "name": "resample.disable", + "description": "Disable Resampling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "dither.noise", + "description": "Add noise bits", + "type": { "default": 0, "min": 0, "max": 16 }, + "params": true + }, + { + "name": "dither.method", + "description": "The dithering method", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "rectangular", + "Rectangular dithering", + "triangular", + "Triangular dithering", + "triangular-hf", + "Sloped Triangular dithering", + "wannamaker3", + "Wannamaker 3 dithering", + "shaped5", + "Lipshitz 5 dithering" + ] + }, + { + "name": "debug.wav-path", + "description": "Path to WAV file", + "type": "", + "params": true + }, + { + "name": "channelmix.lock-volumes", + "description": "Disable volume updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph.disable", + "description": "Disable Filter graph updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph", + "description": "A filter graph to load", + "type": "", + "params": true + }, + { + "id": "device", + "name": "api.alsa.path", + "description": "The ALSA device", + "type": "hw:Generic,8" + }, + { + "id": "deviceName", + "description": "The ALSA device name", + "type": "" + }, + { + "id": "cardName", + "description": "The ALSA card name", + "type": "" + }, + { + "id": "latencyOffsetNsec", + "description": "Latency offset (ns)", + "type": { "default": 0, "min": 0, "max": 2000000000 } + }, + { + "name": "audio.channels", + "description": "Audio Channels", + "type": 2, + "params": true + }, + { + "name": "audio.rate", + "description": "Audio Rate", + "type": 0, + "params": true + }, + { + "name": "audio.format", + "description": "Audio Format", + "type": "UNKNOWN", + "params": true + }, + { + "name": "audio.position", + "description": "Audio Position", + "type": "[ FL, FR ]", + "params": true + }, + { + "name": "audio.allowed-rates", + "description": "Audio Allowed Rates", + "type": "[ ]", + "params": true + }, + { + "name": "api.alsa.period-size", + "description": "Period Size", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.period-num", + "description": "Number of Periods", + "type": { "default": 0, "min": 0, "max": 1024 }, + "params": true + }, + { + "name": "api.alsa.headroom", + "description": "Headroom", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.start-delay", + "description": "Start Delay", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.disable-mmap", + "description": "Disable MMAP", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.disable-batch", + "description": "Disable Batch", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.disable-tsched", + "description": "Disable timer based scheduling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.use-chmap", + "description": "Use the driver channelmap", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "api.alsa.multi-rate", + "description": "Support multiple rates", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "api.alsa.htimestamp", + "description": "Use hires timestamps", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "latency.internal.rate", + "description": "Internal latency in samples", + "type": { "default": 0, "min": 0, "max": 65536 }, + "params": true + }, + { + "name": "latency.internal.ns", + "description": "Internal latency in nanoseconds", + "type": { "default": 0, "min": 0, "max": 2000000000 }, + "params": true + }, + { + "name": "clock.name", + "description": "The name of the clock", + "type": "api.alsa.p-0", + "params": true + }, + { + "name": "api.alsa.htimestamp.max-errors", + "description": "Max errors before disabling htimestamp", + "type": { "default": 64, "min": 0, "max": 2147483647 }, + "params": true + } + ], + "Props": [ + { + "volume": 1.000000, + "mute": false, + "channelVolumes": [ 1.000000, 1.000000 ], + "channelMap": [ "FL", "FR" ], + "softMute": false, + "softVolumes": [ 1.000000, 1.000000 ], + "monitorMute": false, + "monitorVolumes": [ 1.000000, 1.000000 ], + "params": [ + "monitor.channel-volumes", + false, + "channelmix.disable", + false, + "channelmix.min-volume", + 0.000000, + "channelmix.max-volume", + 10.000000, + "channelmix.normalize", + false, + "channelmix.mix-lfe", + true, + "channelmix.upmix", + true, + "channelmix.lfe-cutoff", + 0.000000, + "channelmix.fc-cutoff", + 0.000000, + "channelmix.rear-delay", + 0.000000, + "channelmix.stereo-widen", + 0.000000, + "channelmix.hilbert-taps", + 0, + "channelmix.upmix-method", + "none", + "resample.quality", + 4, + "resample.disable", + false, + "dither.noise", + 0, + "dither.method", + "none", + "debug.wav-path", + "", + "channelmix.lock-volumes", + false, + "audioconvert.filter-graph.disable", + false, + "audioconvert.filter-graph", + "" + ] + }, + { + "device": "hw:Generic,8", + "deviceName": "", + "cardName": "", + "latencyOffsetNsec": 0, + "params": [ + "audio.channels", + 2, + "audio.rate", + 0, + "audio.format", + "UNKNOWN", + "audio.position", + "[ FL, FR ]", + "audio.allowed-rates", + "[ ]", + "api.alsa.period-size", + 0, + "api.alsa.period-num", + 0, + "api.alsa.headroom", + 0, + "api.alsa.start-delay", + 0, + "api.alsa.disable-mmap", + false, + "api.alsa.disable-batch", + false, + "api.alsa.disable-tsched", + false, + "api.alsa.use-chmap", + true, + "api.alsa.multi-rate", + true, + "api.alsa.htimestamp", + false, + "api.alsa.htimestamp.max-errors", + 64, + "latency.internal.rate", + 0, + "latency.internal.ns", + 0, + "clock.name", + "api.alsa.p-0" + ] + } + ], + "Format": [ ], + "EnumPortConfig": [ + { + "direction": "Input", + "mode": { + "default": "none", + "alt1": "none", + "alt2": "dsp", + "alt3": "convert" + }, + "monitor": { + "default": false, + "alt1": false, + "alt2": true + }, + "control": { + "default": false, + "alt1": false, + "alt2": true + } + } + ], + "PortConfig": [ + { + "direction": "Input", + "mode": "dsp", + "monitor": true, + "control": false, + "format": { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": "F32P", + "channels": 2, + "position": [ "FL", "FR" ] + } + } + ], + "Latency": [ + { + "direction": "Input", + "minQuantum": 1.000000, + "maxQuantum": 1.000000, + "minRate": 0, + "maxRate": 0, + "minNs": 0, + "maxNs": 0 + }, + { + "direction": "Output", + "minQuantum": 0.000000, + "maxQuantum": 0.000000, + "minRate": 0, + "maxRate": 0, + "minNs": 0, + "maxNs": 0 + } + ], + "ProcessLatency": [ + { + "quantum": 0.000000, + "rate": 0, + "ns": 0 + } + ], + "Tag": [ + ] + } + } + }, + { + "id": 96, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 65, + "max-output-ports": 0, + "change-mask": [ "input-ports", "output-ports", "state", "props", "params" ], + "n-input-ports": 2, + "n-output-ports": 2, + "state": "suspended", + "error": null, + "props": { + "alsa.card": 0, + "alsa.card_name": "HD-Audio Generic", + "alsa.class": "generic", + "alsa.components": "HDA:1002aa01,00aa0100,00100900", + "alsa.device": 7, + "alsa.driver_name": "snd_hda_intel", + "alsa.id": "HDMI 1", + "alsa.long_card_name": "HD-Audio Generic at 0xb45c8000 irq 142", + "alsa.mixer_device": "_ucm0001.hw:Generic", + "alsa.mixer_name": "ATI R6xx HDMI", + "alsa.name": "HDMI 1", + "alsa.resolution_bits": 16, + "alsa.subclass": "generic-mix", + "alsa.subdevice": 0, + "alsa.subdevice_name": "subdevice #0", + "alsa.sync.id": "00000000:00000000:00000000:00000000", + "api.alsa.card.longname": "HD-Audio Generic at 0xb45c8000 irq 142", + "api.alsa.card.name": "HD-Audio Generic", + "api.alsa.open.ucm": true, + "api.alsa.path": "hw:Generic,7", + "api.alsa.pcm.card": 0, + "api.alsa.pcm.stream": "playback", + "audio.channels": 2, + "audio.position": "FL,FR", + "card.profile.device": 2, + "client.id": 42, + "clock.quantum-limit": 8192, + "device.api": "alsa", + "device.class": "sound", + "device.icon-name": "audio-card-analog", + "device.icon_name": "video-display", + "device.id": 44, + "device.profile.description": "HDMI / DisplayPort 2 Output", + "device.profile.name": "HiFi: HDMI2: sink", + "device.routes": 1, + "factory.id": 19, + "factory.name": "api.alsa.pcm.sink", + "iec958.codecs": "[\"PCM\"]", + "library.name": "audioconvert/libspa-audioconvert", + "media.class": "Audio/Sink", + "node.description": "Radeon High Definition Audio Controller [Rembrandt/Strix] HDMI / DisplayPort 2 Output", + "node.driver": true, + "node.loop.name": "data-loop.0", + "node.name": "alsa_output.pci-0000_c3_00.1.HiFi__HDMI2__sink", + "node.nick": "HDMI 1", + "node.pause-on-idle": false, + "object.id": 96, + "object.path": "alsa:acp:Generic:2:playback", + "object.serial": 229, + "port.group": "playback", + "priority.driver": 632, + "priority.session": 632 + }, + "params": { + "EnumFormat": [ + { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": { + "default": "S32LE", + "alt1": "S32LE", + "alt2": "S16LE" + }, + "rate": { "default": 48000, "min": 32000, "max": 48000 }, + "channels": 2, + "position": [ "FL", "FR" ] + } + ], + "PropInfo": [ + { + "id": "volume", + "description": "Volume", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "mute", + "description": "Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "channelVolumes", + "description": "Channel Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "channelMap", + "description": "Channel Map", + "type": "", + "container": "Array" + }, + { + "id": "monitorMute", + "description": "Monitor Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "monitorVolumes", + "description": "Monitor Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "softMute", + "description": "Soft Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "softVolumes", + "description": "Soft Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "name": "monitor.channel-volumes", + "description": "Monitor channel volume", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.disable", + "description": "Disable Channel mixing", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.min-volume", + "description": "Minimum volume level", + "type": { "default": 0.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.max-volume", + "description": "Maximum volume level", + "type": { "default": 10.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.normalize", + "description": "Normalize Volumes", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.mix-lfe", + "description": "Mix LFE into channels", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.upmix", + "description": "Enable upmixing", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.lfe-cutoff", + "description": "LFE cutoff frequency", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.fc-cutoff", + "description": "FC cutoff frequency (Hz)", + "type": { "default": 0.000000, "min": 0.000000, "max": 48000.000000 }, + "params": true + }, + { + "name": "channelmix.rear-delay", + "description": "Rear channels delay (ms)", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.stereo-widen", + "description": "Stereo widen", + "type": { "default": 0.000000, "min": 0.000000, "max": 1.000000 }, + "params": true + }, + { + "name": "channelmix.hilbert-taps", + "description": "Taps for phase shift of rear", + "type": { "default": 0, "min": 0, "max": 255 }, + "params": true + }, + { + "name": "channelmix.upmix-method", + "description": "Upmix method to use", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "simple", + "Simple upmixing", + "psd", + "Passive Surround Decoding" + ] + }, + { + "id": "rate", + "description": "Rate scaler", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "quality", + "name": "resample.quality", + "description": "Resample Quality", + "type": { "default": 4, "min": 0, "max": 14 }, + "params": true + }, + { + "name": "resample.disable", + "description": "Disable Resampling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "dither.noise", + "description": "Add noise bits", + "type": { "default": 0, "min": 0, "max": 16 }, + "params": true + }, + { + "name": "dither.method", + "description": "The dithering method", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "rectangular", + "Rectangular dithering", + "triangular", + "Triangular dithering", + "triangular-hf", + "Sloped Triangular dithering", + "wannamaker3", + "Wannamaker 3 dithering", + "shaped5", + "Lipshitz 5 dithering" + ] + }, + { + "name": "debug.wav-path", + "description": "Path to WAV file", + "type": "", + "params": true + }, + { + "name": "channelmix.lock-volumes", + "description": "Disable volume updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph.disable", + "description": "Disable Filter graph updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph", + "description": "A filter graph to load", + "type": "", + "params": true + }, + { + "id": "device", + "name": "api.alsa.path", + "description": "The ALSA device", + "type": "hw:Generic,7" + }, + { + "id": "deviceName", + "description": "The ALSA device name", + "type": "" + }, + { + "id": "cardName", + "description": "The ALSA card name", + "type": "" + }, + { + "id": "latencyOffsetNsec", + "description": "Latency offset (ns)", + "type": { "default": 0, "min": 0, "max": 2000000000 } + }, + { + "name": "audio.channels", + "description": "Audio Channels", + "type": 2, + "params": true + }, + { + "name": "audio.rate", + "description": "Audio Rate", + "type": 0, + "params": true + }, + { + "name": "audio.format", + "description": "Audio Format", + "type": "UNKNOWN", + "params": true + }, + { + "name": "audio.position", + "description": "Audio Position", + "type": "[ FL, FR ]", + "params": true + }, + { + "name": "audio.allowed-rates", + "description": "Audio Allowed Rates", + "type": "[ ]", + "params": true + }, + { + "name": "api.alsa.period-size", + "description": "Period Size", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.period-num", + "description": "Number of Periods", + "type": { "default": 0, "min": 0, "max": 1024 }, + "params": true + }, + { + "name": "api.alsa.headroom", + "description": "Headroom", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.start-delay", + "description": "Start Delay", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.disable-mmap", + "description": "Disable MMAP", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.disable-batch", + "description": "Disable Batch", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.disable-tsched", + "description": "Disable timer based scheduling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.use-chmap", + "description": "Use the driver channelmap", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "api.alsa.multi-rate", + "description": "Support multiple rates", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "api.alsa.htimestamp", + "description": "Use hires timestamps", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "latency.internal.rate", + "description": "Internal latency in samples", + "type": { "default": 0, "min": 0, "max": 65536 }, + "params": true + }, + { + "name": "latency.internal.ns", + "description": "Internal latency in nanoseconds", + "type": { "default": 0, "min": 0, "max": 2000000000 }, + "params": true + }, + { + "name": "clock.name", + "description": "The name of the clock", + "type": "api.alsa.p-0", + "params": true + }, + { + "name": "api.alsa.htimestamp.max-errors", + "description": "Max errors before disabling htimestamp", + "type": { "default": 64, "min": 0, "max": 2147483647 }, + "params": true + } + ], + "Props": [ + { + "volume": 1.000000, + "mute": false, + "channelVolumes": [ 1.000000, 1.000000 ], + "channelMap": [ "FL", "FR" ], + "softMute": false, + "softVolumes": [ 1.000000, 1.000000 ], + "monitorMute": false, + "monitorVolumes": [ 1.000000, 1.000000 ], + "params": [ + "monitor.channel-volumes", + false, + "channelmix.disable", + false, + "channelmix.min-volume", + 0.000000, + "channelmix.max-volume", + 10.000000, + "channelmix.normalize", + false, + "channelmix.mix-lfe", + true, + "channelmix.upmix", + true, + "channelmix.lfe-cutoff", + 0.000000, + "channelmix.fc-cutoff", + 0.000000, + "channelmix.rear-delay", + 0.000000, + "channelmix.stereo-widen", + 0.000000, + "channelmix.hilbert-taps", + 0, + "channelmix.upmix-method", + "none", + "resample.quality", + 4, + "resample.disable", + false, + "dither.noise", + 0, + "dither.method", + "none", + "debug.wav-path", + "", + "channelmix.lock-volumes", + false, + "audioconvert.filter-graph.disable", + false, + "audioconvert.filter-graph", + "" + ] + }, + { + "device": "hw:Generic,7", + "deviceName": "", + "cardName": "", + "latencyOffsetNsec": 0, + "params": [ + "audio.channels", + 2, + "audio.rate", + 0, + "audio.format", + "UNKNOWN", + "audio.position", + "[ FL, FR ]", + "audio.allowed-rates", + "[ ]", + "api.alsa.period-size", + 0, + "api.alsa.period-num", + 0, + "api.alsa.headroom", + 0, + "api.alsa.start-delay", + 0, + "api.alsa.disable-mmap", + false, + "api.alsa.disable-batch", + false, + "api.alsa.disable-tsched", + false, + "api.alsa.use-chmap", + true, + "api.alsa.multi-rate", + true, + "api.alsa.htimestamp", + false, + "api.alsa.htimestamp.max-errors", + 64, + "latency.internal.rate", + 0, + "latency.internal.ns", + 0, + "clock.name", + "api.alsa.p-0" + ] + } + ], + "Format": [ ], + "EnumPortConfig": [ + { + "direction": "Input", + "mode": { + "default": "none", + "alt1": "none", + "alt2": "dsp", + "alt3": "convert" + }, + "monitor": { + "default": false, + "alt1": false, + "alt2": true + }, + "control": { + "default": false, + "alt1": false, + "alt2": true + } + } + ], + "PortConfig": [ + { + "direction": "Input", + "mode": "dsp", + "monitor": true, + "control": false, + "format": { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": "F32P", + "channels": 2, + "position": [ "FL", "FR" ] + } + } + ], + "Latency": [ + { + "direction": "Input", + "minQuantum": 1.000000, + "maxQuantum": 1.000000, + "minRate": 0, + "maxRate": 0, + "minNs": 0, + "maxNs": 0 + }, + { + "direction": "Output", + "minQuantum": 0.000000, + "maxQuantum": 0.000000, + "minRate": 0, + "maxRate": 0, + "minNs": 0, + "maxNs": 0 + } + ], + "ProcessLatency": [ + { + "quantum": 0.000000, + "rate": 0, + "ns": 0 + } + ], + "Tag": [ + ] + } + } + }, + { + "id": 91, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 65, + "max-output-ports": 0, + "change-mask": [ "input-ports", "output-ports", "state", "props", "params" ], + "n-input-ports": 2, + "n-output-ports": 2, + "state": "suspended", + "error": null, + "props": { + "alsa.card": 0, + "alsa.card_name": "HD-Audio Generic", + "alsa.class": "generic", + "alsa.components": "HDA:1002aa01,00aa0100,00100900", + "alsa.device": 3, + "alsa.driver_name": "snd_hda_intel", + "alsa.id": "HDMI 0", + "alsa.long_card_name": "HD-Audio Generic at 0xb45c8000 irq 142", + "alsa.mixer_device": "_ucm0001.hw:Generic", + "alsa.mixer_name": "ATI R6xx HDMI", + "alsa.name": "HDMI 0", + "alsa.resolution_bits": 16, + "alsa.subclass": "generic-mix", + "alsa.subdevice": 0, + "alsa.subdevice_name": "subdevice #0", + "alsa.sync.id": "00000000:00000000:00000000:00000000", + "api.alsa.card.longname": "HD-Audio Generic at 0xb45c8000 irq 142", + "api.alsa.card.name": "HD-Audio Generic", + "api.alsa.open.ucm": true, + "api.alsa.path": "hw:Generic,3", + "api.alsa.pcm.card": 0, + "api.alsa.pcm.stream": "playback", + "audio.channels": 2, + "audio.position": "FL,FR", + "card.profile.device": 3, + "client.id": 42, + "clock.quantum-limit": 8192, + "device.api": "alsa", + "device.class": "sound", + "device.icon-name": "audio-card-analog", + "device.icon_name": "video-display", + "device.id": 44, + "device.profile.description": "HDMI / DisplayPort 1 Output", + "device.profile.name": "HiFi: HDMI1: sink", + "device.routes": 1, + "factory.id": 19, + "factory.name": "api.alsa.pcm.sink", + "library.name": "audioconvert/libspa-audioconvert", + "media.class": "Audio/Sink", + "node.description": "Radeon High Definition Audio Controller [Rembrandt/Strix] HDMI / DisplayPort 1 Output", + "node.driver": true, + "node.loop.name": "data-loop.0", + "node.name": "alsa_output.pci-0000_c3_00.1.HiFi__HDMI1__sink", + "node.nick": "HDMI 0", + "node.pause-on-idle": false, + "object.id": 91, + "object.path": "alsa:acp:Generic:3:playback", + "object.serial": 230, + "port.group": "playback", + "priority.driver": 696, + "priority.session": 696 + }, + "params": { + "EnumFormat": [ + { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": { + "default": "S32LE", + "alt1": "S32LE", + "alt2": "S16LE" + }, + "rate": { "default": 48000, "min": 32000, "max": 192000 }, + "channels": 2, + "position": [ "FL", "FR" ] + } + ], + "PropInfo": [ + { + "id": "volume", + "description": "Volume", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "mute", + "description": "Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "channelVolumes", + "description": "Channel Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "channelMap", + "description": "Channel Map", + "type": "", + "container": "Array" + }, + { + "id": "monitorMute", + "description": "Monitor Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "monitorVolumes", + "description": "Monitor Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "id": "softMute", + "description": "Soft Mute", + "type": { + "default": false, + "alt1": false, + "alt2": true + } + }, + { + "id": "softVolumes", + "description": "Soft Volumes", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 }, + "container": "Array" + }, + { + "name": "monitor.channel-volumes", + "description": "Monitor channel volume", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.disable", + "description": "Disable Channel mixing", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.min-volume", + "description": "Minimum volume level", + "type": { "default": 0.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.max-volume", + "description": "Maximum volume level", + "type": { "default": 10.000000, "min": 0.000000, "max": 10.000000 }, + "params": true + }, + { + "name": "channelmix.normalize", + "description": "Normalize Volumes", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "channelmix.mix-lfe", + "description": "Mix LFE into channels", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.upmix", + "description": "Enable upmixing", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "channelmix.lfe-cutoff", + "description": "LFE cutoff frequency", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.fc-cutoff", + "description": "FC cutoff frequency (Hz)", + "type": { "default": 0.000000, "min": 0.000000, "max": 48000.000000 }, + "params": true + }, + { + "name": "channelmix.rear-delay", + "description": "Rear channels delay (ms)", + "type": { "default": 0.000000, "min": 0.000000, "max": 1000.000000 }, + "params": true + }, + { + "name": "channelmix.stereo-widen", + "description": "Stereo widen", + "type": { "default": 0.000000, "min": 0.000000, "max": 1.000000 }, + "params": true + }, + { + "name": "channelmix.hilbert-taps", + "description": "Taps for phase shift of rear", + "type": { "default": 0, "min": 0, "max": 255 }, + "params": true + }, + { + "name": "channelmix.upmix-method", + "description": "Upmix method to use", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "simple", + "Simple upmixing", + "psd", + "Passive Surround Decoding" + ] + }, + { + "id": "rate", + "description": "Rate scaler", + "type": { "default": 1.000000, "min": 0.000000, "max": 10.000000 } + }, + { + "id": "quality", + "name": "resample.quality", + "description": "Resample Quality", + "type": { "default": 4, "min": 0, "max": 14 }, + "params": true + }, + { + "name": "resample.disable", + "description": "Disable Resampling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "dither.noise", + "description": "Add noise bits", + "type": { "default": 0, "min": 0, "max": 16 }, + "params": true + }, + { + "name": "dither.method", + "description": "The dithering method", + "type": "none", + "params": true, + "labels": [ + "none", + "Disabled", + "rectangular", + "Rectangular dithering", + "triangular", + "Triangular dithering", + "triangular-hf", + "Sloped Triangular dithering", + "wannamaker3", + "Wannamaker 3 dithering", + "shaped5", + "Lipshitz 5 dithering" + ] + }, + { + "name": "debug.wav-path", + "description": "Path to WAV file", + "type": "", + "params": true + }, + { + "name": "channelmix.lock-volumes", + "description": "Disable volume updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph.disable", + "description": "Disable Filter graph updates", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "audioconvert.filter-graph", + "description": "A filter graph to load", + "type": "", + "params": true + }, + { + "id": "device", + "name": "api.alsa.path", + "description": "The ALSA device", + "type": "hw:Generic,3" + }, + { + "id": "deviceName", + "description": "The ALSA device name", + "type": "" + }, + { + "id": "cardName", + "description": "The ALSA card name", + "type": "" + }, + { + "id": "latencyOffsetNsec", + "description": "Latency offset (ns)", + "type": { "default": 0, "min": 0, "max": 2000000000 } + }, + { + "name": "audio.channels", + "description": "Audio Channels", + "type": 2, + "params": true + }, + { + "name": "audio.rate", + "description": "Audio Rate", + "type": 0, + "params": true + }, + { + "name": "audio.format", + "description": "Audio Format", + "type": "UNKNOWN", + "params": true + }, + { + "name": "audio.position", + "description": "Audio Position", + "type": "[ FL, FR ]", + "params": true + }, + { + "name": "audio.allowed-rates", + "description": "Audio Allowed Rates", + "type": "[ ]", + "params": true + }, + { + "name": "api.alsa.period-size", + "description": "Period Size", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.period-num", + "description": "Number of Periods", + "type": { "default": 0, "min": 0, "max": 1024 }, + "params": true + }, + { + "name": "api.alsa.headroom", + "description": "Headroom", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.start-delay", + "description": "Start Delay", + "type": { "default": 0, "min": 0, "max": 8192 }, + "params": true + }, + { + "name": "api.alsa.disable-mmap", + "description": "Disable MMAP", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.disable-batch", + "description": "Disable Batch", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.disable-tsched", + "description": "Disable timer based scheduling", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "api.alsa.use-chmap", + "description": "Use the driver channelmap", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "api.alsa.multi-rate", + "description": "Support multiple rates", + "type": { + "default": true, + "alt1": true, + "alt2": false + }, + "params": true + }, + { + "name": "api.alsa.htimestamp", + "description": "Use hires timestamps", + "type": { + "default": false, + "alt1": false, + "alt2": true + }, + "params": true + }, + { + "name": "latency.internal.rate", + "description": "Internal latency in samples", + "type": { "default": 0, "min": 0, "max": 65536 }, + "params": true + }, + { + "name": "latency.internal.ns", + "description": "Internal latency in nanoseconds", + "type": { "default": 0, "min": 0, "max": 2000000000 }, + "params": true + }, + { + "name": "clock.name", + "description": "The name of the clock", + "type": "api.alsa.p-0", + "params": true + }, + { + "name": "api.alsa.htimestamp.max-errors", + "description": "Max errors before disabling htimestamp", + "type": { "default": 64, "min": 0, "max": 2147483647 }, + "params": true + } + ], + "Props": [ + { + "volume": 1.000000, + "mute": false, + "channelVolumes": [ 1.000000, 1.000000 ], + "channelMap": [ "FL", "FR" ], + "softMute": false, + "softVolumes": [ 1.000000, 1.000000 ], + "monitorMute": false, + "monitorVolumes": [ 1.000000, 1.000000 ], + "params": [ + "monitor.channel-volumes", + false, + "channelmix.disable", + false, + "channelmix.min-volume", + 0.000000, + "channelmix.max-volume", + 10.000000, + "channelmix.normalize", + false, + "channelmix.mix-lfe", + true, + "channelmix.upmix", + true, + "channelmix.lfe-cutoff", + 0.000000, + "channelmix.fc-cutoff", + 0.000000, + "channelmix.rear-delay", + 0.000000, + "channelmix.stereo-widen", + 0.000000, + "channelmix.hilbert-taps", + 0, + "channelmix.upmix-method", + "none", + "resample.quality", + 4, + "resample.disable", + false, + "dither.noise", + 0, + "dither.method", + "none", + "debug.wav-path", + "", + "channelmix.lock-volumes", + false, + "audioconvert.filter-graph.disable", + false, + "audioconvert.filter-graph", + "" + ] + }, + { + "device": "hw:Generic,3", + "deviceName": "", + "cardName": "", + "latencyOffsetNsec": 0, + "params": [ + "audio.channels", + 2, + "audio.rate", + 0, + "audio.format", + "UNKNOWN", + "audio.position", + "[ FL, FR ]", + "audio.allowed-rates", + "[ ]", + "api.alsa.period-size", + 0, + "api.alsa.period-num", + 0, + "api.alsa.headroom", + 0, + "api.alsa.start-delay", + 0, + "api.alsa.disable-mmap", + false, + "api.alsa.disable-batch", + false, + "api.alsa.disable-tsched", + false, + "api.alsa.use-chmap", + true, + "api.alsa.multi-rate", + true, + "api.alsa.htimestamp", + false, + "api.alsa.htimestamp.max-errors", + 64, + "latency.internal.rate", + 0, + "latency.internal.ns", + 0, + "clock.name", + "api.alsa.p-0" + ] + } + ], + "Format": [ ], + "EnumPortConfig": [ + { + "direction": "Input", + "mode": { + "default": "none", + "alt1": "none", + "alt2": "dsp", + "alt3": "convert" + }, + "monitor": { + "default": false, + "alt1": false, + "alt2": true + }, + "control": { + "default": false, + "alt1": false, + "alt2": true + } + } + ], + "PortConfig": [ + { + "direction": "Input", + "mode": "dsp", + "monitor": true, + "control": false, + "format": { + "mediaType": "audio", + "mediaSubtype": "raw", + "format": "F32P", + "channels": 2, + "position": [ "FL", "FR" ] + } + } + ], + "Latency": [ + { + "direction": "Input", + "minQuantum": 1.000000, + "maxQuantum": 1.000000, + "minRate": 0, + "maxRate": 0, + "minNs": 0, + "maxNs": 0 + }, + { + "direction": "Output", + "minQuantum": 0.000000, + "maxQuantum": 0.000000, + "minRate": 0, + "maxRate": 0, + "minNs": 0, + "maxNs": 0 + } + ], + "ProcessLatency": [ + { + "quantum": 0.000000, + "rate": 0, + "ns": 0 + } + ], + "Tag": [ + ] + } + } + } +] diff --git a/checkbox-support/checkbox_support/scripts/tests/test_pipewire_utils.py b/checkbox-support/checkbox_support/scripts/tests/test_pipewire_utils.py index ee29858bb9..074c67b3f0 100644 --- a/checkbox-support/checkbox_support/scripts/tests/test_pipewire_utils.py +++ b/checkbox-support/checkbox_support/scripts/tests/test_pipewire_utils.py @@ -18,11 +18,14 @@ # https://github.com/python/cpython/commit/6fdfcec5b11f44f27aae3d53ddeb004150ae1f61 # Therefore, please don't add new test cases of assertLog. +import shlex +import subprocess import sys import unittest -from unittest.mock import MagicMock, patch +from unittest.mock import MagicMock, call, patch from pathlib import Path import json +import typing as t sys.modules["gi"] = MagicMock() sys.modules["gi.repository"] = MagicMock() @@ -603,6 +606,261 @@ def test_though(self, mock_checkout, mock_input): self.assertEqual(None, pt.go_through_ports("echo test", "sink")) +class IterAudioSinksTests(unittest.TestCase): + + def _fake_sp_check_output(self, *args, **_) -> str: + if args[0] == "pw-dump Device": + with (TEST_DATA_DIR / "pw_dump_device_happy_path.txt").open() as f: + return f.read() + elif args[0] == "pw-dump Node": + with (TEST_DATA_DIR / "pw_dump_node_happy_path.txt").open() as f: + return f.read() + else: + raise RuntimeError("Unexpected use of this mock") + + @patch("builtins.input") + @patch("subprocess.check_call") + @patch("subprocess.check_output") + @patch("subprocess.run") + def test_happy_path( + self, + mock_run: MagicMock, + mock_check_output: MagicMock, + mock_check_call: MagicMock, + mock_input: MagicMock, + ): + pt = PipewireTest() + + mock_check_output.side_effect = self._fake_sp_check_output + + input_seq = ("0", "0", "1", "2", "1", "q") + mock_input.side_effect = input_seq + mock_check_call.return_value = 0 # only used by wpctl set-default + + # actual cmd here doesn't matter, it just needs to be called + cmd = shlex.split("speaker-test -c 2 -l 1 -t wav") + pt.iter_audio_sinks(cmd) + mock_run.assert_has_calls( + [ + call(cmd, timeout=60, check=True), + ] + * (len(input_seq) - 2) # remove the q and invalid '2' + ) + + @patch("builtins.input") + @patch("subprocess.check_call") + @patch("subprocess.check_output") + @patch("subprocess.run") + def test_pressing_q_too_early( + self, + _: MagicMock, + mock_check_output: MagicMock, + mock_check_call: MagicMock, + mock_input: MagicMock, + ): + pt = PipewireTest() + + mock_check_output.side_effect = self._fake_sp_check_output + + # the test data has 2 devices + # quitting after just 1 should return non-zero + input_seq = ("0", "q") + mock_input.side_effect = input_seq + mock_check_call.return_value = 0 # only used by wpctl set-default + + with self.assertRaises(SystemExit) as cm: + pt.iter_audio_sinks(shlex.split("speaker-test -c 2 -l 1 -t wav")) + + self.assertEqual( + cm.exception.args[0], + "[ ERR ] Only 1 audio sinks were tested, but expected 2", + ) + + @patch("builtins.input") + @patch("subprocess.check_call") + @patch("subprocess.check_output") + @patch("subprocess.run") + def test_no_device( + self, + _: MagicMock, + mock_check_output: MagicMock, + mock_check_call: MagicMock, + mock_input: MagicMock, + ): + pw_dump_node_dummy = """ +[ + { + "id": 28, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 0, + "max-output-ports": 0, + "change-mask": [ "input-ports", "output-ports", + "state", "props", "params" ], + "n-input-ports": 0, + "n-output-ports": 0, + "state": "suspended", + "error": null, + "props": { + "factory.name": "support.node.driver", + "node.name": "Dummy-Driver", + "node.group": "pipewire.dummy", + "priority.driver": 20000, + "factory.id": 10, + "clock.quantum-limit": 8192, + "node.driver": true, + "object.id": 28, + "object.serial": 28 + }, + "params": { + } + } + }, + { + "id": 29, + "type": "PipeWire:Interface:Node", + "version": 3, + "permissions": [ "r", "w", "x", "m" ], + "info": { + "max-input-ports": 0, + "max-output-ports": 0, + "change-mask": [ "input-ports", "output-ports", + "state", "props", "params" ], + "n-input-ports": 0, + "n-output-ports": 0, + "state": "suspended", + "error": null, + "props": { + "factory.name": "support.node.driver", + "node.name": "Freewheel-Driver", + "priority.driver": 19000, + "node.group": "pipewire.freewheel", + "node.freewheel": true, + "factory.id": 10, + "clock.quantum-limit": 8192, + "node.driver": true, + "object.id": 29, + "object.serial": 29 + }, + "params": { + } + } + } +] + """ + + def fake_sp_check_output(*args, **_) -> str: + if args[0] == "pw-dump Device": + return "" + elif args[0] == "pw-dump Node": + return pw_dump_node_dummy + else: + raise RuntimeError("Unexpected use of this mock") + + pt = PipewireTest() + mock_check_output.side_effect = fake_sp_check_output + + input_seq = ("0", "q") + mock_input.side_effect = input_seq + mock_check_call.return_value = 0 + with self.assertRaises(SystemExit) as cm: + pt.iter_audio_sinks(shlex.split("speaker-test -c 2 -l 1 -t wav")) + + self.assertEqual( + cm.exception.args[0], "No audio sinks are available for this test" + ) + + @patch("checkbox_support.scripts.pipewire_utils.print") + @patch("builtins.input") + @patch("subprocess.check_call") + @patch("subprocess.check_output") + @patch("subprocess.run") + def test_no_matching_device( + self, + _: MagicMock, + mock_check_output: MagicMock, + mock_check_call: MagicMock, + mock_input: MagicMock, + mock_print: MagicMock, + ): + pt = PipewireTest() + + mock_check_output.side_effect = self._fake_sp_check_output + + # the test data has 2 devices + # quitting after just 1 should return non-zero + input_seq = ("0", "1", "q") + mock_input.side_effect = input_seq + mock_check_call.return_value = 0 + + original = pt._get_pw_dump + + def fake_pw_dump_rv(p_type: 't.Literal["Device", "Node"]'): + if p_type == "Device": + return [] + else: + return original(p_type) + + pt._get_pw_dump = fake_pw_dump_rv + with self.assertRaises(SystemExit) as cm: + pt.iter_audio_sinks(shlex.split("speaker-test -c 2 -l 1 -t wav")) + + self.assertEqual( + cm.exception.args[0], "No audio sinks are available for this test" + ) + + count = 0 + for mock_call in mock_print.call_args_list: + # mock_call[0] is args + # mock_call[1] is kwargs + if ( + mock_call[0][0] == "Could not find device" + and mock_call[1]["file"] == sys.stderr + ): + count += 1 + self.assertNotEqual(count, 0) + + @patch("checkbox_support.scripts.pipewire_utils.input") + @patch("subprocess.check_call") + @patch("subprocess.check_output") + @patch("subprocess.run") + def test_speaker_test_cmd_crash_handlers( + self, + mock_run: MagicMock, + mock_check_output: MagicMock, + mock_check_call: MagicMock, + mock_input: MagicMock, + ): + pt = PipewireTest() + + mock_check_output.side_effect = self._fake_sp_check_output + mock_check_call.return_value = 0 + + mock_run.side_effect = subprocess.TimeoutExpired( + ["slow-cmd"], 60, "", "too slow" + ) + mock_input.side_effect = ("0", "1", "q") + with self.assertRaises(SystemExit) as cm: + pt.iter_audio_sinks(shlex.split("speaker-test -c 2 -l 1 -t wav")) + self.assertEqual( + cm.exception.args[0], + "[ ERR ] Some of the speakers failed the test", + ) + + mock_run.side_effect = subprocess.CalledProcessError( + 1, ["bad-cmd"], "", "crashed" + ) + mock_input.side_effect = ("0", "1", "q") + with self.assertRaises(SystemExit) as cm: + pt.iter_audio_sinks(shlex.split("speaker-test -c 2 -l 1 -t wav")) + self.assertEqual( + cm.exception.args[0], + "[ ERR ] Some of the speakers failed the test", + ) + + class ShowDefaultDeviceTests(unittest.TestCase): def test_device_type_error(self): pt = PipewireTest() diff --git a/providers/base/units/dock/jobs.pxu b/providers/base/units/dock/jobs.pxu index c6aedd5c0b..0ef37fdcc2 100644 --- a/providers/base/units/dock/jobs.pxu +++ b/providers/base/units/dock/jobs.pxu @@ -2598,7 +2598,7 @@ plugin: user-interact-verify estimated_duration: 60.0 command: if check_audio_daemon.sh ; then - checkbox-support-pipewire-utils through -m sink -c "speaker-test -c 2 -l 1 -t wav" + checkbox-support-pipewire-utils iter-audio-sinks -c "speaker-test -c 2 -l 1 -t wav" else indexes=$(pacmd list-sinks | grep -e 'index' -e 'available' | grep -B 1 -e 'available: unknown' -e 'available: yes' | grep index | awk '{print $NF}') for index in $indexes