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
An almost fully customizable language made in python!

Whython is a project language, the idea of it is that anyone can download and edit the language to make it suitable to what they want.

Julian 47 Nov 05, 2022
A python package template that can be adapted for RAP projects

Warning - this repository is a snapshot of a repository internal to NHS Digital. This means that links to videos and some URLs may not work. Repositor

NHS Digital 3 Nov 08, 2022
Web interface for browsing, search and filtering recent arxiv submissions

Web interface for browsing, search and filtering recent arxiv submissions

Andrej 4.8k Jan 08, 2023
A software dedicated to automaticaly select the agent of your desire in Valorant

AUTOPICKER A software dedicated to automaticaly select the agent of your desire in Valorant GUIDE Before stariting to use this program check if you ha

p1n00 0 Sep 24, 2022
Vehicle Identification Speed Detection (VISD) extracts vehicle information like License Plate number, Manufacturer and colour from a video and provides this data in the form of a CSV file

Vehicle Identification Speed Detection (VISD) extracts vehicle information like License Plate number, Manufacturer and colour from a video and provides this data in the form of a CSV file. VISD can a

6 Feb 22, 2022
Black-Scholes library implemented as a Cairo smart contract

Cairo Black-Scholes Library Black-Scholes library implemented as a Cairo smart contract. All inputs, outputs, and internal calculations use 27-digit f

Aditya Raghavan 47 Dec 19, 2022
Ellipitical Curve Table Generator

Ellipitical-Curve-Table-Generator This script generates a table of elliptical po

Nishaant Goswamy 1 Jan 02, 2022
Retrieve bank transactions and categorize for budgeting use

Budgeting After trying out some budgeting software, I decided to make my own. selenium_scraper Using the selenium package, this script runs an instanc

Marc 1 Nov 10, 2021
YourCity is a platform to match people to their prefect city.

YourCity YourCity is a city matching App that matches users to their ideal city. It is a fullstack React App made with a Redux state manager and a bac

Nico G Pierson 6 Sep 25, 2021
Code and data for learning to search in local branching

Code and data for learning to search in local branching

Defeng Liu 7 Dec 06, 2022
Paprika is a python library that reduces boilerplate. Heavily inspired by Project Lombok.

Image courtesy of Anna Quaglia (Photographer) Paprika Paprika is a python library that reduces boilerplate. It is heavily inspired by Project Lombok.

Rayan Hatout 55 Dec 26, 2022
The best way to learn Python is by practicing examples. The repository contains examples of basic concepts of Python. You are advised to take the references from these examples and try them on your own.

90_Python_Exercises_and_Challenges The best way to learn Python is by practicing examples. This repository contains the examples on basic and advance

Milaan Parmar / Милан пармар / _米兰 帕尔马 205 Jan 06, 2023
A Linux webcam plugin for BGMv2 as used in our demos.

The goal of this repository is to supplement the main Real-Time High Resolution Background Matting repo with a working demo of a videoconferencing plu

Andrey Ryabtsev 144 Dec 27, 2022
Use a real time weather API to apply wind to your mouse cursor.

wind-cursor Use a real time weather API to apply wind to your mouse cursor. Requirements PyAutoGUI pyowm Usage This program uses the OpenWeatherMap AP

Andreas Schmid 1 Feb 07, 2022
A basic ticketing software.

Ticketer A basic ticketing software. Screenshots Program Launched Issuing Ticket Show your Ticket Entry Done Program Exited Code Features to implement

Samyak Jain 2 Feb 10, 2022
An Embedded Linux Project Build and Compile Tool -- An Bitbake UI Extension

Dianshao - An Embedded Linux Project Build and Compile Tool

0 Mar 27, 2022
Platform Tree for Xiaomi Redmi Note 7/7S (lavender)

The Xiaomi Redmi Note 7 (codenamed "lavender") is a mid-range smartphone from Xiaomi announced in January 2019. Device specifications Device Xiaomi Re

MUHAMAD KHOIRON 2 Dec 20, 2021
Social reading and reviewing, decentralized with ActivityPub

BookWyrm Social reading and reviewing, decentralized with ActivityPub Contents Joining BookWyrm Contributing About BookWyrm What it is and isn't The r

BookWyrm 1.4k Jan 08, 2023
NeurIPS'19: Meta-Weight-Net: Learning an Explicit Mapping For Sample Weighting (Pytorch implementation for noisy labels).

Meta-Weight-Net NeurIPS'19: Meta-Weight-Net: Learning an Explicit Mapping For Sample Weighting (Official Pytorch implementation for noisy labels). The

243 Jan 03, 2023
Check COVID locations of interest against Google location history

Location of Interest Checker Script to compare COVID locations of interest to Google location history. The script produces a map plot (as shown below)

9 Mar 30, 2022