Skip to content

Instantly share code, notes, and snippets.

@Axel-Erfurt
Created August 23, 2023 17:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Axel-Erfurt/11e7f6b9a5f9ac7a398b63c25a53cd11 to your computer and use it in GitHub Desktop.
Save Axel-Erfurt/11e7f6b9a5f9ac7a398b63c25a53cd11 to your computer and use it in GitHub Desktop.
set pipewire buffer and sample rate from systray icon
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import gi
gi.require_versions({'Gtk': '3.0', 'AyatanaAppIndicator3': '0.1', 'GLib': '2.0'})
from gi.repository import Gtk, GLib
from gi.repository import AyatanaAppIndicator3 as appindicator
from subprocess import check_output
buffer_sizes = [32, 64, 128, 256, 512, 1024, 2048, 4096]
allowed_sample_rates = []
setting = check_output("pw-metadata -n settings 0 clock.allowed-rates", shell=True)
values = setting.decode("UTF-8").split("value:'")[1].split("' type:")[0]
allowed_sample_rates.append(values.split("[ ")[1].split(",")[0])
allowed_sample_rates.append(values.split(", ")[1].split(" ]")[0])
current_samplerate = check_output("pw-metadata -n settings 0 clock.force-rate", shell=True)
current_samplerate = current_samplerate.decode("UTF-8").split("value:'")[1].split("' type:")[0]
current_buffer = check_output("pw-metadata -n settings 0 clock.force-quantum", shell=True)
current_buffer = current_buffer.decode("UTF-8").split("value:'")[1].split("' type:")[0]
print(f"current Samplerate: {current_samplerate}\ncurrent Buffer Size: {current_buffer}")
def main():
indicator = appindicator.Indicator.new("customtray", "audio-card", appindicator.IndicatorCategory.APPLICATION_STATUS)
indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
indicator.set_title("Pipewire Buffer")
indicator.set_menu(menu())
indicator.set_title(f"current Samplerate: {current_samplerate}\ncurrent Buffer Size: {current_buffer}")
Gtk.main()
def menu():
iconsize = 20
menu = Gtk.Menu()
####menu 1 buffer ##########################################
img = Gtk.Image()
img.set_from_icon_name("audio-card", iconsize)
sub_menu_item = Gtk.ImageMenuItem(label='Buffer Size', image=img)
menu.append(sub_menu_item)
sub_menu = Gtk.Menu()
for x in range(len(buffer_sizes)):
img = Gtk.Image()
img.set_from_icon_name("audio-card", iconsize)
command_buffer = Gtk.ImageMenuItem(label=str(buffer_sizes[x]), image=img)
command_buffer.connect('activate', buffer_activated, x)
sub_menu.append(command_buffer)
sub_menu_item.set_submenu(sub_menu)
####menu 2 clock rate ##########################################
img = Gtk.Image()
img.set_from_icon_name("audio-card", iconsize)
sub_menu_item = Gtk.ImageMenuItem(label='Sample Rate', image=img)
menu.append(sub_menu_item)
sub_menu = Gtk.Menu()
for x in range(len(allowed_sample_rates)):
img = Gtk.Image()
img.set_from_icon_name("audio-card", iconsize)
command_rate = Gtk.ImageMenuItem(label=str(allowed_sample_rates[x]), image=img)
command_rate.connect('activate', sample_rate_activated, x)
sub_menu.append(command_rate)
sub_menu_item.set_submenu(sub_menu)
sep = Gtk.SeparatorMenuItem()
menu.append(sep)
img = Gtk.Image()
img.set_from_icon_name("application-exit", iconsize)
exittray = Gtk.ImageMenuItem(label='Exit', image=img)
exittray.connect('activate', quit)
menu.append(exittray)
menu.show_all()
return menu
def buffer_activated(wdg, i):
buffer = buffer_sizes[i]
print(buffer)
GLib.spawn_command_line_async(f"pw-metadata -n settings 0 clock.force-quantum {buffer}")
def sample_rate_activated(wdg, i):
sample_rate = allowed_sample_rates[i]
print(sample_rate)
GLib.spawn_command_line_async(f"pw-metadata -n settings 0 clock.force-rate {sample_rate}")
def quit(_):
Gtk.main_quit()
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment