winappaudiorouter is a Python library for changing output and input audio devices per app on Windows, without requiring external tools. It follows the same Windows routing path used by EarTrumpet/SoundVolumeView:
Windows.Media.Internal.AudioPolicyConfig::SetPersistedDefaultAudioEndpoint.
Full documentation lives at https://winappaudiorouter.readthedocs.io/.
- Enumerate active output and input devices.
- Enumerate active app audio sessions for output or input flows.
- Read persisted app output or input devices by PID or process name.
- Route one app PID (or all active sessions by process name) to a target output or input device.
- Clear persisted app routing (return to system default).
- CLI + Python API.
pip install winappaudiorouterFor local development:
pip install -e .[dev]winappaudiorouter list-devices
winappaudiorouter list-devices --flow input
winappaudiorouter list-sessions
winappaudiorouter list-sessions --flow input
winappaudiorouter route --process-name chrome.exe --device "Headphones"
winappaudiorouter route --flow input --process-name obs64.exe --device "USB Mic"
winappaudiorouter route --pid 1234 --device "{0.0.0.00000000}.{GUID}"
winappaudiorouter clear --process-name chrome.exe
winappaudiorouter clear --flow input --pid 4567
winappaudiorouter get --pid 1234
winappaudiorouter get --flow input --process-name obs64.exe
winappaudiorouter get --process-name chrome.exe # Get the current device for all chrome.exe processes--flow accepts output (default) or input.
import winappaudiorouter as war
output_devices = war.list_output_devices()
input_devices = war.list_input_devices()
output_sessions = war.list_app_sessions()
input_sessions = war.list_input_sessions()
war.set_app_output_device(process_name="chrome.exe", device="Headphones")
war.clear_app_output_device(process_name="chrome.exe")
war.get_app_output_device(process_name="chrome.exe") # {} means <system default>
war.set_app_input_device(process_name="obs64.exe", device="USB Mic")
war.clear_app_input_device(process_name="obs64.exe")
war.get_app_input_device(process_name="obs64.exe") # {} means <system default>python -m pytest -q
python -m pytest --cov=winappaudiorouter --cov-report=term-missing --cov-report=xml
python -m sphinx -W --keep-going -b html docs docs/_build/html- CI tests/build run on push and pull requests.
- Coverage is uploaded to Codecov from the
mainbranch CI workflow. - Documentation is published on Read the Docs.
- PyPI publish workflow runs on tag pushes like
v1.0.1. - GitHub repo secrets required:
PYPI_API_TOKEN,RTD_API_KEY, andCODECOV_TOKEN.
Please read CONTRIBUTING.md before opening a pull request.
This project is licensed under the MIT License. See LICENSE.
- Windows 10 1803+ only.
process_namerouting requires at least one active audio session for that app in the selected flow.- Session re-binding can be asynchronous; some apps require playback or recording restart.