feat(audio-mixer): wiremix added

This audio-mixer works as a TUI instead of Pavucontrol which is a GUI
This commit is contained in:
Sergio Laín 2025-08-31 18:02:50 +02:00
parent 4eb8a9b7b8
commit 0742419fd6
No known key found for this signature in database
GPG key ID: 51BB28D8B42FB438
3 changed files with 482 additions and 0 deletions

3
.config/wiremix/.github/README.md vendored Normal file
View file

@ -0,0 +1,3 @@
<div align="center">
<a href=""><img src="./title.png"></a>
</div>

BIN
.config/wiremix/.github/title.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View file

@ -0,0 +1,479 @@
# This file documents wiremix's configuration file. It is also itself a wiremix
# configuration file in which wiremix's default configuration is specified.
#
# It is recommended to start with an empty configuration file and to use this
# file only as a reference. Anything specified in the configuration file will
# be merged with wiremix's defaults.
# Main Options
# PipeWire remote to connect to
#remote = "pipewire-0"
# Limit rendering frames per second (unlimited if unset)
#fps = 60.0 #
# Enable mouse support
mouse = true
# Peak meter mode
# "off" - not meters
# "mono" - all mono meters
# "auto" - left/right meters for stereo streams, otherwise mono
peaks = "auto"
# Character set to use (see Character Sets section)
char_set = "default"
# Theme to use (see Themes section)
theme = "default"
# Initial tab
tab = "playback"
# Maximum percentage for volume sliders
max_volume_percent = 150.0
# Whether to prevent increasing volume past max_volume
enforce_max_volume = false
# Keybindings
#
# A keybinding consists of a key, modifiers, and a UI action to be performed.
#
# Keybindings you define in your configuration will be merged with the default
# keybindings (listed below for reference). You can effectively delete a
# default keybinding by setting its action to "Nothing".
#
# A keybinding key can be one of:
# 1. A character: { Char = "x" } # for the 'x' key
# 2. An F-key: { F = 1 } # for F1
# 3. A media key: { Media = "MediaKeyCode" }
# where MediaKeyCode is one of:
# Play Pause PlayPause Reverse Stop FastForward Rewind TrackNext
# TrackPrevious Record LowerVolume RaiseVolume MuteVolume
# 4. A special key: "SpecialKey"
# where SpecialKey is one of:
# Backspace Enter Left Right Up Down Home End PageUp PageDown Tab BackTab
# Delete Insert Null Esc CapsLock ScrollLock NumLock PrintScreen Pause
# Menu KeypadBegin
#
# A keybinding modifier can be one or more of SHIFT CONTROL ALT SUPER HYPER
# META NONE combined with |. It defaults to NONE if omitted.
#
# For example:
#
# keybindings = [
# # Demonstrate modifiers
# { key = "End", modifier = "CTRL | ALT", action = "Exit" },
# ]
#
# Each of the available keybinding actions are documented below.
keybindings = [
# Exit the program
{ key = { Char = "q" }, action = "Exit" },
# Toggle mute for the selected item
{ key = { Char = "m" }, action = "ToggleMute" },
# Make the selected item in Input/Output Devices the default endpoint
{ key = { Char = "d" }, action = "SetDefault" },
# Increase the volume of the selected item by 1%
{ key = { Char = "l" }, action = { SetRelativeVolume = 0.01 } },
{ key = "Right", action = { SetRelativeVolume = 0.01 } },
# Decrease the volume of the selected item by 1%
{ key = { Char = "h" }, action = { SetRelativeVolume = -0.01 } },
{ key = "Left", action = { SetRelativeVolume = -0.01 } },
# Open a dropdown for the selected item or chose an item in the dropdown
{ key = { Char = "c" }, action = "ActivateDropdown" },
{ key = "Enter", action = "ActivateDropdown" },
# Close an open dropdown
{ key = "Esc", action = "CloseDropdown" },
# Select the next item
{ key = { Char = "j" }, action = "MoveDown" },
{ key = "Down", action = "MoveDown" },
# Select the previous item
{ key = { Char = "k" }, action = "MoveUp" },
{ key = "Up", action = "MoveUp" },
# Select the next tab
{ key = { Char = "L" }, action = "TabRight" },
{ key = "Tab", action = "TabRight" },
# Select the previous tab
{ key = { Char = "H" }, action = "TabLeft" },
{ key = "BackTab", modifiers = "SHIFT", action = "TabLeft" },
# Set the volume of the selected item in 10% increments from 0% to 100%
{ key = { Char = "`" }, action = { SetAbsoluteVolume = 0.00 } },
{ key = { Char = "1" }, action = { SetAbsoluteVolume = 0.10 } },
{ key = { Char = "2" }, action = { SetAbsoluteVolume = 0.20 } },
{ key = { Char = "3" }, action = { SetAbsoluteVolume = 0.30 } },
{ key = { Char = "4" }, action = { SetAbsoluteVolume = 0.40 } },
{ key = { Char = "5" }, action = { SetAbsoluteVolume = 0.50 } },
{ key = { Char = "6" }, action = { SetAbsoluteVolume = 0.60 } },
{ key = { Char = "7" }, action = { SetAbsoluteVolume = 0.70 } },
{ key = { Char = "8" }, action = { SetAbsoluteVolume = 0.80 } },
{ key = { Char = "9" }, action = { SetAbsoluteVolume = 0.90 } },
{ key = { Char = "0" }, action = { SetAbsoluteVolume = 1.00 } },
# Open the help menu
{ key = { Char = "?" }, action = "Help" },
# There are two actions which don't have default bindings:
# 1. "Nothing": Do nothing - can effectively delete a default keybinding
# 2. { SelectTab = N }: Open the Nth tab
]
# Names
#
# You can customize how streams, endpoints, and devices are named in the user
# interface using a template system to generate names based on PipeWire
# properties.
#
# Name templates are composed of property tags enclosed in { } and literal
# text. For example:
#
# "Application {client:application.name} playing {node:media.name}"
#
# wiremix will replace the property tags with the properties from the PipeWire
# object being displayed.
#
# The first part of a tag specifies the object type - device, node, or client,
# and the second part specifies the property.
#
# You can use pw-dump(1) to inspect the available properties.
#
# Literal curly braces can be escaped by doubling them: {{ become { and }}
# becomes }.
#
# Streams can have linked clients, so node and client properties are valid for
# stream. Similarly, endpoint can use either node or device properties. Only
# device properties are valid for device.
#
# Each option in names is an array - if a tempalte can't be resolved because it
# uses a property which doesn't exit on a given object, wiremix tries the next
# template in the sequence. If none of them can be resolved, it falls back on
# node.name for nodes or device.name for devices.
#
# The overall order of precedence for name resolution is:
# 1. Matching override templates, if any (see the Name Overrides section)
# 2. Configured templates for the object type
# 3. Fall back to the object's name property
[names]
# Streams in the Playback/Recording tabs
stream = ["{node:node.name}: {node:media.name}"]
# Endpoints in the Input/Output Devices tabs
endpoint = ["{device:device.nick}", "{node:node.description}"]
# Devices in the Configuration tab
device = ["{device:device.nick}", "{device:device.description}"]
# Name Overrides
#
# Name overrides define alternate templates that will be used for objects
# matching a given criterion.
#
# An override is matched by type, which contains a list of one or more of
# stream, endpoint, or device (see the Name section for more details), and a
# property value. Any node or device property that can be used in the names
# section can be used to match an override.
#
# There are no default overrides, but here is an example. This causes all
# streams whose node.name is "spotify" to use just "{node:node.name}" as its
# name.
#
# [[names.overrides]]
# # Which object types this override applies to
# types = [ "stream" ]
# # The property to match
# property = "node:node.name"
# # The value to match
# value = "spotify"
# # Templates to use when the property value matches
# templates = [ "{node:node.name}" ]
#
# You can have multiple name overrides, each in its own [[names.overrides]]
# section.
# Themes
#
# Themes determine the styling of user interface elements.
#
# Theme styles are based on ratatui's Style struct.
# https://docs.rs/ratatui/latest/ratatui/style/struct.Style.html
#
# Each style can have an fg color, a bg color, and modifiers. Any property not
# specified will inherit from the default style for your terminal.
#
# fg and bg can be an RGB hex value in the form "#RRGGBB" or named ANSI colors:
# Black Red Green Yellow Blue Magenta Cyan Gray DarkGray LightRed LightGreen
# LightYellow LightBlue LightMagenta LightCyan White
#
# add_modifier can be one or more of BOLD DIM ITALIC UNDERLINED SLOW_BLINK
# RAPID_BLINK REVERSED HIDDEN CROSSED_OUT combined with |.
#
# For example:
#
# # Red foreground on a black background with bold, underlined text
# { fg = "#FF0000", bg = "Black", add_modifier = "BOLD | UNDERLINE" }
#
# An empty style with no properties ({ }) corresponds to the default style.
#
# You can modify built-in themes. Anything you don't specify will remain
# unchanged. For example:
#
# # Modify the "default" theme to make the selection indicator blink.
# [themes.default]
# selector = { fg = "LightCyan", add_modifier = "SLOW_BLINK" }
#
# And you can create a new theme that inherits unspecified styles from a
# built-in theme. For example:
#
# # Create a new theme called "my_custom_theme" based on "nocolor"
# [themes.my_custom_theme]
# inherit = "nocolor"
# tab_selected = { fg = "LightCyan", add_modifier = "SLOW_BLINK" }
#
# The "inherit" option is optional. If not present, the new theme will inherit
# from the "default" theme.
#
# The following is the default theme with each themeable property described.
[themes.default]
# The symbol marking the default device on the Input/Output Devices tabs
default_device = {}
# The symbol marking the default endpoint on the Playback/Recording tabs
default_stream = {}
# The selection indicator in a tab
selector = { fg = "#b7bdf8" }
# The name of a tab in the tab menu
tab = {}
# The name of the selected tab in the tab menu
tab_selected = { fg = "#8aadf4" }
# The symbols surrounding the selected tab in the tab menu
tab_marker = { fg = "#8aadf4" }
# The symbol at the top/bottom of a tab indicating that there are more items
list_more = { fg = "DarkGray" }
# The name of a PipeWire node
node_title = {}
# The name of the selected target for a node
node_target = {}
# The volume percentage label
volume = {}
# Volume bar
volume_empty = { fg = "DarkGray" }
volume_filled = { fg = "#8aadf4" }
# Peak meter. Inactive = unlit, active = lit, overload = greater than 0.0 dB
meter_inactive = { fg = "DarkGray" }
meter_active = { fg = "#a6da95" }
meter_overload = { fg = "#ed8796" }
# The "live" indicator in the center of the meter
meter_center_inactive = { fg = "DarkGray" }
meter_center_active = { fg = "#a6da95" }
# The name of a device in the Configuration tab
config_device = {}
# The name of the selected profile in the Configuration tab
config_profile = {}
# Dropdown marker next to the profiles in the Conifguration tab
dropdown_icon = {}
# Border around dropdowns
dropdown_border = {}
# The name of an item in a dropdown
dropdown_item = {}
# The name of the currently-selected item in a dropdown
dropdown_selected = { fg = "#8aadf4", add_modifier = "REVERSED" }
# The symbol at the top/bottom of a dropdown indicating that there are more items
dropdown_more = { fg = "DarkGray" }
# Border around help menu
help_border = {}
# The name of an item in a the help menu
help_item = {}
# The symbol at the top/bottom of the help menu indicating that there are more items
help_more = { fg = "DarkGray" }
# Character Sets
#
# Character sets define the symbols used in the user interface.
#
# You can modify built-in characters sets. Anything you don't specify will
# remain unchanged. For example:
#
# # Modify the "default" character set to use parentheses around the selected
# # tab name
# [char_sets.default]
# tab_marker_left = "("
# tab_marker_right = ")"
#
# And you can create a new character set that inherits unspecified symbols from
# a built-in character set. For example:
#
# # Create a new character set called "my_custom_char_set" based on "compat"
# [char_sets.my_custom_char_set]
# inherit = "compat" # Inherit from "compat" (omit to inherit from "default")
# tab_marker_left = "("
# tab_marker_right = ")"
#
# The following is the default character set which the options described.
[char_sets.default]
# Marks the default device on the Input/Output Devices tabs
default_device = "◇"
# Marks the default endpoint on the Playback/Recording tabs
default_stream = "◇"
# The selection indicator in a tab
selector_top = "░"
selector_middle = "▒"
selector_bottom = "░"
# Surround the selected tab in the tab menu
tab_marker_left = "["
tab_marker_right = "]"
# Displayed at the top/bottom of a tab when there are more items
list_more = "•••"
# Volume bar
volume_empty = "╌"
volume_filled = "━"
# Peak meter. Inactive = unlit, active = lit, overload = greater than 0.0 dB
# Mono meters use only the right side characters
meter_left_inactive = "▮"
meter_left_active = "▮"
meter_left_overload = "▮"
meter_right_inactive = "▮"
meter_right_active = "▮"
meter_right_overload = "▮"
# The "live" indicator in the center of the meter
# Mono meters use only the right side
meter_center_left_inactive = "▮"
meter_center_left_active = "▮"
meter_center_right_inactive = "▮"
meter_center_right_active = "▮"
# Dropdown marker next to the profiles in the Configuration tab
dropdown_icon = "▼"
# Indicates the selected item in a dropdown
dropdown_selector = ">"
# Displayed at the top/bottom of a dropdown when there are more items
dropdown_more = "•••"
# Border around dropdowns
# One of "Plain", "Rounded", "Double", "Thick", "QuadrantInside", "QuadrantOutside"
dropdown_border = "Rounded"
# Displayed at the top/bottom of the help menu when there are more items
help_more = "•••"
# Border around help menu
# One of "Plain", "Rounded", "Double", "Thick", "QuadrantInside", "QuadrantOutside"
help_border = "Rounded"
# Appendix A
#
# The other built-in themes and character sets are defined for reference here.
[themes.nocolor]
default_device = {}
default_stream = {}
selector = { add_modifier = "BOLD" }
tab = {}
tab_selected = { add_modifier = "BOLD" }
tab_marker = { add_modifier = "BOLD" }
list_more = {}
node_title = {}
node_target = {}
volume = {}
volume_empty = { add_modifier = "DIM" }
volume_filled = { add_modifier = "BOLD" }
meter_inactive = { add_modifier = "DIM" }
meter_active = { add_modifier = "BOLD" }
meter_overload = { add_modifier = "BOLD" }
meter_center_inactive = { add_modifier = "DIM" }
meter_center_active = { add_modifier = "BOLD" }
config_device = {}
config_profile = {}
dropdown_icon = {}
dropdown_border = {}
dropdown_item = {}
dropdown_selected = { add_modifier = "BOLD | REVERSED" }
dropdown_more = {}
help_border = {}
help_item = {}
help_more = {}
[themes.plain]
default_device = {}
default_stream = {}
selector = {}
tab = {}
tab_selected = {}
tab_marker = {}
list_more = {}
node_title = {}
node_target = {}
volume = {}
volume_empty = {}
volume_filled = {}
meter_inactive = {}
meter_active = {}
meter_overload = {}
meter_center_inactive = {}
meter_center_active = {}
config_device = {}
config_profile = {}
dropdown_icon = {}
dropdown_border = {}
dropdown_item = {}
dropdown_selected = {}
dropdown_more = {}
help_border = {}
help_item = {}
help_more = {}
[char_sets.compat]
default_device = "◊"
default_stream = "◊"
selector_top = "░"
selector_middle = "▒"
selector_bottom = "░"
tab_marker_left = "["
tab_marker_right = "]"
list_more = "•••"
volume_empty = "─"
volume_filled = "━"
meter_left_inactive = "┃"
meter_left_active = "┃"
meter_left_overload = "┃"
meter_right_inactive = "┃"
meter_right_active = "┃"
meter_right_overload = "┃"
meter_center_left_inactive = "█"
meter_center_left_active = "█"
meter_center_right_inactive = "█"
meter_center_right_active = "█"
dropdown_icon = "▼"
dropdown_selector = ">"
dropdown_more = "•••"
dropdown_border = "Plain"
help_more = "•••"
help_border = "Plain"
[char_sets.extracompat]
default_device = "*"
default_stream = "*"
selector_top = "-"
selector_middle = "="
selector_bottom = "-"
tab_marker_left = "["
tab_marker_right = "]"
list_more = "~~~"
volume_empty = "-"
volume_filled = "="
meter_left_inactive = "="
meter_left_active = "#"
meter_left_overload = "!"
meter_right_inactive = "="
meter_right_active = "#"
meter_right_overload = "!"
meter_center_left_inactive = "["
meter_center_left_active = "["
meter_center_right_inactive = "]"
meter_center_right_active = "]"
dropdown_icon = "\\"
dropdown_selector = ">"
dropdown_more = "~~~"
dropdown_border = "Plain"
help_more = "~~~"
help_border = "Plain"