A frontend to ease the use of pulseaudio's routing capabilities, mimicking voicemeeter's workflow

Overview

Pulsemeeter

A frontend to ease the use of pulseaudio's routing capabilities, mimicking voicemeeter's workflow

Features

  • Create virtual inputs and outputs
  • Route audio from one device to another
  • Volume controll

Dependencies

  • python-gobject

Installation

Arch/Manjaro

A package is available in the AUR pulsemeeter-git. If you use an AUR helper:

paru -S pulsemeeter-git

Any distro

Clone the repo and run the makefile:

git clone https://github.com/theRealCarneiro/pulsemeeter.git
cd pulsemeeter
sudo make install

Uninstall

sudo make uninstall
Comments
  • Can't find config.json

    Can't find config.json

    on attempting to run pulsemeeter I get an error and traceback:

    Traceback (most recent call last):
      File "/usr/local/bin/pulsemeeter", line 8, in <module>
        sys.exit(main())
      File "/usr/local/lib/python3.9/dist-packages/pulsemeeter/__main__.py", line 33, in main
        with open(config_file, 'w') as outfile:
    FileNotFoundError: [Errno 2] No such file or directory: '/home/hugeblank/.config/pulsemeeter/config.json'
    

    Also - instructions on how to install dependencies would be nice, as I'm pretty sure I don't even have them properly set up.

    bug 
    opened by hugeblank 10
  • [BUG] ValueError: Namespace AppIndicator3 not available

    [BUG] ValueError: Namespace AppIndicator3 not available

    when I try to run pulsemeeter (installed with: sudo pip install pulsmeeter on Pop!_OS 22.04, with python 3.10.4, it doesn't open. When I run it in the terminal it says: Traceback (most recent call last): File "/usr/local/bin/pulsemeeter", line 5, in from pulsemeeter.main import main File "/usr/local/lib/python3.10/dist-packages/pulsemeeter/init.py", line 1, in from .interface import MainWindow File "/usr/local/lib/python3.10/dist-packages/pulsemeeter/interface/init.py", line 2, in from .main_window import MainWindow File "/usr/local/lib/python3.10/dist-packages/pulsemeeter/interface/main_window.py", line 26, in gi_require_version('AppIndicator3', '0.1') File "/usr/lib/python3/dist-packages/gi/init.py", line 126, in require_version raise ValueError('Namespace %s not available' % namespace) ValueError: Namespace AppIndicator3 not available

    opened by timocarnill 6
  • Command Line?

    Command Line?

    Any chance for command line arguments to toggle things to be able to keybind or macro certain things? ie: toggle A2 on Virtual Input 1, things like that.

    Thanks for making this!

    opened by Doxmiatoo 6
  • AUR packages don't build anymore

    AUR packages don't build anymore

    AUR packages don't build anymore citing ERROR: pulsectl not installed, please run 'pip install requirements.txt' inside source directory. Please let me know if you need more details.

    good first issue 
    opened by ayush123460 6
  • Pulsemeeter started and running no GUI/errors

    Pulsemeeter started and running no GUI/errors

    Describe the bug Pulsemeeter GUI does not appear, not located in the systray and if I try to open the application I see a pulsemeeter icon show as a blank document and it says its a text editor. Unable to find any GUI, and the terminal will say its already running which is verified when looking at my audio outputs as I have virtual ones appear.

    To Reproduce Steps to reproduce the behavior:

    1. Type pulsemeeter daemon or pulsemeeter init

    Expected behavior Pulsemeeter GUI appears

    Screenshots image image image image image

    Desktop (please complete the following information):

    • Distro: Linux-5.18.0-kali2-amd64-x86_64-with-glibc2.33
    • Python Version: 3.10.5 (main, Jun 8 2022, 09:26:22) [GCC 11.3.0]
    • Desktop ENV: KDE plasmashell 5.24.5

    Additional context Nothing additional for now.

    duplicate 
    opened by ZerkerEOD 4
  • No audio routed to/from any virtual inputs/outputs using pipewire

    No audio routed to/from any virtual inputs/outputs using pipewire

    As soon as I launch pulsemeeter, all audio gets routed there. However, there are two problems: The applications' audio doesn't seem to get connected to the meters, and the audio doesn't seem to get routed properly from the "Virtual Inputs" to the hardware outputs. (It doesn't look like any of the "Virtual Inputs" or "Virtual Outputs" are working at all, actually. The only working pathway through the application, tested using a patchbay to connect things where they probably weren't intended, is from a "Hardware Input" to a "Hardware Output"). I'd be happy to provide more info or otherwise help resolve this, as Pulsemeeter looks like it would be ideal for me, if only it worked with the rest of my setup.

    (I'm on version 1.2.6, other possibly relevant info: pipewire, pipewire-alsa, pipewire-pulse, pipewire-jack, and pulseaudio-alsa are all installed. I'm running Arch Linux (pulsemeeter installed from the AUR) and Cinnamon.)

    Thanks!

    bug 
    opened by dacid44 4
  • Daemon doesn't start properly when using pipewire-pulse

    Daemon doesn't start properly when using pipewire-pulse

    Describe the bug When pulsemeeter is started using the daemon option after starting pipewire-pulse, it gives me the following error and doesn't work:

    Error setting sink Virtual_Input_1 as primary
    Error setting source Virtual_Output_B1 as primary
    

    Error on the pipewire-pulse side (using systemctl --user status pipewire-pulse.service):

    Aug 29 11:12:59 ZephyrusLeon pipewire-pulse[48052]: mod.loopback: error id:0 seq:91 res:-32 (Broken pipe): connection error
    Aug 29 11:12:59 ZephyrusLeon pipewire-pulse[48052]: mod.loopback: error id:0 seq:80 res:-32 (Broken pipe): connection error
    Aug 29 11:12:59 ZephyrusLeon pipewire-pulse[48052]: mod.null-sink: error id:0 seq:51 res:-32 (Broken pipe): connection error
    Aug 29 11:12:59 ZephyrusLeon pipewire-pulse[48052]: mod.loopback: error id:0 seq:101 res:-32 (Broken pipe): connection error
    Aug 29 11:12:59 ZephyrusLeon pipewire-pulse[48052]: mod.null-sink: error id:0 seq:72 res:-32 (Broken pipe): connection error
    Aug 29 11:12:59 ZephyrusLeon pipewire-pulse[48052]: mod.loopback: error id:0 seq:140 res:-32 (Broken pipe): connection error
    Aug 29 11:12:59 ZephyrusLeon pipewire-pulse[48052]: mod.null-sink: error id:0 seq:93 res:-32 (Broken pipe): connection error
    Aug 29 11:12:59 ZephyrusLeon pipewire-pulse[48052]: mod.null-sink: error id:0 seq:102 res:-32 (Broken pipe): connection error
    Aug 29 11:12:59 ZephyrusLeon pipewire-pulse[48052]: mod.null-sink: error id:0 seq:111 res:-32 (Broken pipe): connection error
    Aug 29 11:12:59 ZephyrusLeon pipewire-pulse[48052]: mod.null-sink: error id:0 seq:121 res:-32 (Broken pipe): connection error
    

    To Reproduce Steps to reproduce the behavior:

    1. Stop pipewire-pulse.socket and pipewire-pulse.service.
    2. Start pipe-wirepulse again.
    3. execute pulsemeeter daemon. The -d option doesn't print any further errors.

    Workaround? There are two ways of running pulsemeeter properly:

    Method 1:

    1. Stop pipewire-pulse.socket and pipewire-pulse.service.
    2. Start pipe-wirepulse again.
    3. execute pulsemeeter (without daemon).

    Method 2:

    1. Stop pipewire-pulse.socket and pipewire-pulse.service.
    2. Start pipe-wirepulse again.
    3. Start PulseAudio Volume Control.
    4. Execute pulsemeeter daemon.
    5. You may now quit PAVU.

    Expected behavior Pulsemeeter should, as a daemon, also launch properly and not cause errors.

    Desktop (please complete the following information):

    • Distro: EndeavourOS Linux x86_64
    • Kernel: 5.18.16-arch1-g14-2
    • Python 3.10.6
    opened by M3gaFr3ak 3
  • Don't rename device, just update description

    Don't rename device, just update description

    Why

    This change restructures how devices are renamed and updated. This is done to help be able to easily identify which devices were created by Pulsemeeter and which ones may be user created.

    I actually discovered this limitation when trying to make my own sink that uses a null module, but I was unable to load the null module as a sink in Pulsemeeter. This doesn't fixing not being able to load external null modules, but it's a step that helps make it easier to maintain and I think allows for easier managing of devices.

    How it works

    Previously, the config file had one name field that was used for the name and the description of the device. Now, each device has both a name and a desc field. When a user does any type of renaming, the device is referenced by the name (which now never changes) and the description property is updated.

    For backwards compatibility, if a user is using an old config that doesn't have a desc field for the device, it will default to the name field, and then also create the the desc field as necessary.

    I didn't see a contributing guideline, so please let me know if there's anything else I should include.

    enhancement 
    opened by ImDevinC 3
  • Clarification of how virtual outputs are presented

    Clarification of how virtual outputs are presented

    I have a question regarding virtual outputs (B1-3). What are they and how are they presented? I can't find how they're represented in pulseaudio. I assumed they were Mic/Mic_Aux/Mic_Aux_2 but that doesn't make much sense given the naming scheme for the virtual inputs (Virtual_Sink/_Aux/_Aux_2). What I'd expect to see are 3 sources named in the same way (Virtual_Source/_Aux/_Aux_2), but they don't seem to exist.

    image For less savvy users, I'm asking about the right side box labelled Virtual Outputs.

    Loving the consistent addition of features to pulsemeeter, it's really impressive!

    opened by hugeblank 3
  • Problem when start pulsemeeter

    Problem when start pulsemeeter

    I installed pulsemeeter, when I open it, it shows the error below.

    [[email protected] ~]$ pulsemeeter ERROR: invalid json grep: warning: stray \ before # grep: warning: stray \ before # grep: warning: stray \ before #

    invalid json from server App sinks returned an error, audio backend probably crashed. Server will be closed. Could not join subscribe_thread (maybe there is none) closing client handler threads... closing socket sending exit signal to listener thread, it should exit within 2 seconds...

    Pulseaudio is installed.

    Distro: Archlinux

    opened by kureshio 2
  • High memory usage when application is in the background.

    High memory usage when application is in the background.

    Describe the bug Over time, the application slowly grows in memory usage despite not doing anything. It starts at about 80 MB when opening, but over time can grow up to 5 or 6 GB of memory. Terminating the application and reopening it solves this issue without any apparent change.

    To Reproduce Steps to reproduce the behavior:

    1. Open application
    2. Leave it running for some time
    3. Check memory usage

    Expected behavior I expect the memory usage to remain the same over time, which is around 80 MB on my system at startup.

    Desktop (please complete the following information):

    • Distro: Arch
    • Python Version: 3.10.5
    opened by sharifhsn 2
  • Ctrl+C or quitting via GUI sometimes doesn't kill pulsemeeter-nightly started from CLI

    Ctrl+C or quitting via GUI sometimes doesn't kill pulsemeeter-nightly started from CLI

    Describe the bug If you start pulsemeeter with just pulsemeeter in the CLI and close it in your DE, sometimes it says "writing config" and doesn't properly exit and return you to your shell. Only kill -9 actually helps in that situation, kill -15 or Ctrl+C doesn't. Most of the time it works.

    To Reproduce

    1. Download current nightly – at the time of writing: https://github.com/theRealCarneiro/pulsemeeter/commit/6a7d8162aacb64fae01e6448f99fa154de12f04e
    2. Start in Terminal
    3. let it run for a while, play some audio, do other things
    4. quit in GUI, check if you get returned to your shell
    5. check if you get returned if you hit Ctrl+C

    Expected behavior Pulsemeeter actually exits 100% of the time when you hit Ctrl+C or quit the app.

    Logs

    Closed via GUI:

    [DEBUG] in [[email protected]_log]: started logger instance <Logger generic (DEBUG)> at thread 18840
    [DEBUG] in [[email protected]_sinks]: pmctl init sink GPU+AUX "2"
    
    [DEBUG] in [[email protected]_sources]: 
    [DEBUG] in [[email protected]_primarys]: 
    [DEBUG] in [[email protected]_clients]: new client 0
    [DEBUG] in [[email protected]_to_client]: message from client #0, size 10: b'get-config'
    [DEBUG] in [[email protected]_command]: get-config
    [DEBUG] in [[email protected]_to_client]: message from client #0, size 4: b'exit'
    [DEBUG] in [[email protected]_to_client]: message from client #0, size 4: b'quit'
    [INFO] in [[email protected]]: closing connection to socket
    [DEBUG] in [[email protected]_to_client]: client 0 disconnect
    [INFO] in [[email protected]]: closing socket
    [INFO] in [[email protected]_loop]: sending exit signal to listener threads, they should exit within a few seconds...
    [DEBUG] in [[email protected]_config]: writing config
    

    Desktop (please complete the following information):

    • Distro: Arch
    • Python Version 3.10

    Additional information:

    Sometimes it just works, then it looks like (closed via Ctrl+C):

    [DEBUG] in [[email protected]_log]: started logger instance <Logger generic (DEBUG)> at thread 19188
    [DEBUG] in [[email protected]_sinks]: pmctl init sink GPU+AUX "2"
    
    [DEBUG] in [[email protected]_sources]: 
    [DEBUG] in [[email protected]_primarys]: 
    [DEBUG] in [[email protected]_clients]: new client 0
    [DEBUG] in [[email protected]_to_client]: message from client #0, size 10: b'get-config'
    [DEBUG] in [[email protected]_command]: get-config
    ^C[INFO] in [[email protected]_loop]: sending exit signal to listener threads, they should exit within a few seconds...
    [DEBUG] in [[email protected]_config]: writing config
    [INFO] in [[email protected]]: closing connection to socket
    [DEBUG] in [[email protected]_to_client]: message from client #0, size 4: b'quit'
    [DEBUG] in [[email protected]_to_client]: client 0 disconnect
    [INFO] in [[email protected]]: closing socket
    

    Especially after Pulsemeeter has been open for a while it seems to hang upon exit/quit.

    opened by heylix 1
  • Nightly

    Nightly

    Description

    • Complete overall of how the GUI works under the hood
    • Pipewire support
    • Dynamically create devices
    • Editing devices (Fix #61)

    Fixes # (issue) Fix #101 Fix #99 Fix #55 Fix #59

    Whats left to do

    • [ ] Rnnoise in hi settings
    • [ ] Eq in a and b settings
    • [ ] Latency in rnnoise and virtual devices settings

    Checklist :

    • [x] My code follows the style guidelines of this project
    • [ ] I have made corresponding changes to the documentation
    • [x] My changes generate no new warnings
    • [ ] Any dependent changes have been merged and published in downstream modules

    WARNING: OLD CONFIG FILES WILL BREAK IN THIS BUILD

    opened by theRealCarneiro 0
  • Unable to start pulsemeeter - JSON stray \ before #

    Unable to start pulsemeeter - JSON stray \ before #

    Describe the bug Pulsemeeter fails to start when exited once.

    To Reproduce Steps to reproduce the behavior: Start pulsemeeter - shows no applications at all, ever playback on firefox close pulsemeeter try to run it again Errors: ERROR: invalid json grep: warning: stray \ before # invalid json from server App sinks returned an error, audio backend probably crashed. Server will be closed.

    Expected behavior the thing to start up again and show me applications

    Screenshots

    image

    Desktop (please complete the following information): OS: Linux-5.15.76-1-MANJARO-x86_64-with-glibc2.36 Python version: 3.10.8 (main, Oct 13 2022, 21:13:48) [GCC 12.2.0]

    Additional context could be relevant to the "#" in json from pulseaudio issue? What is that "%" at the end of pmctl list sinks?

    opened by Corfiot 1
  • Mono input

    Mono input

    Hello,

    Voicemeeter has a feature to make a certain input (in my case, a microphone) mono. The problem I'm having is that my audio interface (Steinberg UR22Mk2) produces stereo input from a mono device, so the microphone outputs to only one channel.

    Alternative solutions are also welcome.

    opened by Shaddox 0
  • AttributeError: 'NoneType' object has no attribute 'connect'

    AttributeError: 'NoneType' object has no attribute 'connect'

    Describe the bug Pulsemeeter does not launch and instead brings up an error

    To Reproduce Steps to reproduce the behavior:

    1. Run Pulsemeeter command
    2. See the following error: [WARNING] in [vumeter_widget]: Could not start vumeter for Virtual_Input_3 Traceback (most recent call last): File "/usr/bin/pulsemeeter", line 8, in <module> sys.exit(main()) File "/usr/lib/python3.10/site-packages/pulsemeeter/__main__.py", line 554, in main start_app(isserver, trayonly) File "/usr/lib/python3.10/site-packages/pulsemeeter/__main__.py", line 483, in start_app MainWindow(isserver=isserver, trayonly=trayonly) File "/usr/lib/python3.10/site-packages/pulsemeeter/interface/main_window.py", line 50, in __init__ self.windowinstance = self.start_window(isserver) File "/usr/lib/python3.10/site-packages/pulsemeeter/interface/main_window.py", line 131, in start_window event_label.connect('button_press_event', self.port_select_popover, device_type, device_id) AttributeError: 'NoneType' object has no attribute 'connect'

    Expected behavior Pulsemeeter will open up with a GUI and not bring up an error

    Desktop (please complete the following information):

    • Distro: Arch Linux
    • Python 3.10.7

    Additional context I am on the nightly build because I am using pipewire. When I use stable, it brings me this error: invalid json from server App sinks returned an error, audio backend probably crashed. Server will be closed. Could not join subscribe_thread (maybe there is none) closing client handler threads... closing socket sending exit signal to listener thread, it should exit within 2 seconds... It used to work fine for about 30 seconds before I changed the settings layout to "tabbed" which froze at first, then crashed, and then wouldn't launch again. I deleted the config, reinstalled a bunch of times, and I am still met with this error. Any help would be greatly appreciated.

    bug 
    opened by auvio323 3
Releases(v1.2.14)
  • v1.2.14(Mar 15, 2022)

  • v1.2.13(Mar 13, 2022)

  • v1.2.12(Mar 12, 2022)

  • v1.2.11(Mar 11, 2022)

    Things that we improved/changed in the new update:

    • Socket (server and client)
      • This allows to open multiple ui's (clients) that sync between each other.
      • Also this opens up just starting the server and controlling pulsemeeter completely over the command line.
    • api support
    • complete command line
      • run pulsemeeter -h to see all commands
    • tray usage
    • fixing config issue
    • fixing ui not showing error message on rename

    Thanks to all the contributors in this version:

    • @theRealCarneiro
    • @Fl1tzi
    • @dacid44

    As always we tried our best to fix all bugs but if you find a new one, please open an issue. For any question you have just ask in our discord.

    Source code(tar.gz)
    Source code(zip)
  • v1.2.6(Nov 17, 2021)

    Fixes

    • Fixed crash when application widget updated too quickly
    • Fixed a ton of bugs that happened only on pipewire

    New

    • Volume meters
    • Application list
    Source code(tar.gz)
    Source code(zip)
  • v1.2.3(Oct 28, 2021)

Owner
Gabriel Carneiro
Computer Science student at UFSJ
Gabriel Carneiro
Dashboard to view a stock's basic information, RSI, Bollinger bands, EMA, SMA, sentiment analysis via Python

Your One And Only Trading Bot No seriously, we mean it! Contributors Jihad Al-Hussain John Gaffney Shanel Kuchera Kazuki Takehashi Patrick Thornquist

5 May 21, 2022
The goal of this program was to find the most common color in my living room.

The goal of this program was to find the most common color in my living room. I found a dataset online with colors names and their corr

1 Nov 09, 2021
A program to generate random numbers b/w 0 to 10 using time

random-num-using-time A program to generate random numbers b/w 0 to 10 using time it uses python's in-built module datetime and an equation which retu

Atul Kushwaha 1 Oct 01, 2022
This is a pretty basic but relatively nice looking Python Pomodoro Timer.

Python Pomodoro-Timer This is a pretty basic but relatively nice looking Pomodoro Timer. Currently its set to a very basic mode, but the funcationalit

EmmHarris 2 Oct 18, 2021
A system for assigning and grading notebooks

nbgrader Linux: Windows: Forum: Coverage: Cite: A system for assigning and grading Jupyter notebooks. Documentation can be found on Read the Docs. Hig

Project Jupyter 1.2k Dec 26, 2022
Simple Wayland HotKey Daemon

swhkd Simple Wayland HotKey Daemon This project is still very new and I'm making new decisions everyday as to where I should drive this project. I'm u

Aakash Sen Sharma 407 Dec 30, 2022
A framework that let's you compose websites in Python with ease!

Perry Perry = A framework that let's you compose websites in Python with ease! Perry works similar to Qt and Flutter, allowing you to create componen

Linkus 13 Oct 09, 2022
Binary++ is an esoteric programming language based on* binary

Binary++ is an esoteric programming language based on* binary. * It's meant to be based on binary, but you can write Binary++ code using different mea

Supercolbat 3 Feb 18, 2022
Module-based cryptographic tool

Cryptosploit A decryption/decoding/cracking tool using various modules. To use it, you need to have basic knowledge of cryptography. Table of Contents

/SNESE_AR\ 33 Nov 27, 2022
MeerKAT radio telescope simulation package. Built to simulate multibeam antenna data.

MeerKATgen MeerKAT radio telescope simulation package. Designed with performance in mind and utilizes Just in time compile (JIT) and XLA backed vectro

Peter Ma 6 Jan 23, 2022
Our Ping Pong Project of numerical analysis, 2nd year IC B2 INSA Toulouse

Ping Pong Project The objective of this project was to determine the moment of impact of the ball with the ground. To do this, we used different model

0 Jan 02, 2022
Viewflow is an Airflow-based framework that allows data scientists to create data models without writing Airflow code.

Viewflow Viewflow is a framework built on the top of Airflow that enables data scientists to create materialized views. It allows data scientists to f

DataCamp 114 Oct 12, 2022
E-Paper display loop with plugins

PaperPi V3 NOTE This version of PaperPi is under heavy development and is not ready for the average user. We are working on adding more screen compati

Aaron Ciuffo 34 Dec 30, 2022
「📖」Tool created to extract metadata from a domain

Metafind is an OSINT tool created with the aim of automating the search for metadata of a particular domain from the search engine known as Google.

9 Dec 28, 2022
A competition for forecasting electricity demand at the country-level using a standard backtesting framework

A competition for forecasting electricity demand at the country-level using a standard backtesting framework

5 Jul 12, 2022
A test repository to build a python package and publish the package to Artifact Registry using GCB

A test repository to build a python package and publish the package to Artifact Registry using GCB. Then have the package be a dependency in a GCF function.

1 Feb 09, 2022
Aggressor script that gets the latest commands from CobaltStrikes web site and creates an aggressor script based on tool options.

opsec-aggressor Aggressor script that gets the latest commands from CobaltStrikes opsec page and creates an aggressor script based on tool options. Gr

JP 10 Nov 26, 2022
A pomodoro app written in Python

Pomodoro It's a pomodoro app written in Python. You can minimize it while you're working if you want to, it'll pop up on your screen when the timer is

Yiğit 1 Dec 20, 2021
An app that mirrors your phone to your compute and maps controller input to the screen

What is 'Dragalia Control'? An app that mirrors your phone to your compute and maps controller input to the screen. Inputs are mapped specifically for

1 May 03, 2022