# VoiceMeeter for Audio Routing on Windows

This blog post will cover my audio setup on Windows. It's core component is called VoiceMeeter which is a virtual audio mixer for Windows developed by Vincent Burel under the company label "VB-Audio". This blog post will focus on the fact that it makes virtual microphones and virtual speakers available which in turn can be used by all program running on your computer. # Motivation Before diving in configurations and problems and their solutions, let's consider a few pros and cons of using VoiceMeeter: * **Pro:** control which microphone and which speaker (or headphone) is enable in a central location as opposed to different locations in all the different applications * **Pro:** easily share system sound by pretending that it comes out of microphone (this is the "soundboard"-use case) * **Pro:** ability to use two microphones or speakers at the same time (this is the "two people participating at the same video call on one system using headsets"-use case) * **Pro:** tight integration with Elgato Stream Deck * **Pro:** ability to flexibly adjust volume levels (this is the "fuck that game is LOUD"-use case) * **Con:** introduces complexity during configuration and new sources of problems * **Con:** mystical sound problems caused by VoiceMeeter (if the system is under load?) For me, the pros far outweigh the cons. And if you show me a single person who didn't have audio problems during the course of the pandemic, please introduce us. I want to meet that legend! # Introduction VoiceMeeter comes in three flavors with slightly different features and price points: | Name | Hardware Inputs/Outputs | Virtual Inputs/Outputs | Cost | | -------- | ----------------------- | ---------------------- | ----------- | | Standard | 2 | 1 | - | | Banana | 3 | 2 | - | | Potato | 5 | 3 | min. 8.33 € | There are a few other differences but the numbers of inputs/outputs is the only important one in the context of this blag post. Before we dive into the more complex "Potato" UI, let's look at the Standard edition first: **Hardware Inputs/Outputs:** The two columns on the very left show the two hardware inputs and the two buttons A1 and A2 at the top right show the two hardware outputs. As the names suggest, that's where you can select hardware like microphones (inputs) and headphones/speakers (outputs). What initially confused me a lot was the naming: the hardware inputs don't have internal names in VoiceMeeter, they are completely visualized by the columns. The hardware outputs do have names though: the capital letter A followed by a digit. **Virtual Inputs/Outputs:** The one virtual input is shown as a column in the middle (with the headline "Virtual Input"). Adding to the confusion, these virtual _inputs_ actually represent headphones/speakers from the operating system perspective: it makes sense if you think about it of course, a program/app running on the system can generate sound and that must flow into a speaker, which is an _input_ from VoiceMeeter's perspective. Similarly, virtual _outputs_ of VoiceMeeter are exposed as microphones to programs running on your system. Speaking of virtual outputs: those also have internal names in VoiceMeeter. It's the capital letter B followed by a digit. Just to quickly re-iterate: It's confusing sometimes that VoiceMeeter _outputs_ are _inputs_ (microphones) for your Windows applications and VoiceMeeter _inputs_ are _outputs_ (speakers) of your Windows applications. Just get used to it please. Names for _hardware outputs_ are prefixed with A and _virtual outputs_ are prefixed with B. And only inputs - both hardware and virtual - have columns representing them. The following table might help remember these facts a bit better. | | Hardware | Virtual | | ---------- | ------------------------------------------ | ------------------------- | | **Input** | microphones; first few columns | column(s) in the middle | | **Output** | speakers/headphone; name prefixed with A | name(s) prefixed with B | Let's now understand a few buttons on the interface a bit better. If sound is coming in from a hardware input, you can select the hardware output by clicking the button labeled "A". This will route the sound from your microphone to your speaker so you can have the uncanny experience of listening to yourself while speaking. Even without someone else on the video call having an abysmal audio setup. Additionally, you can also select a virtual output by clicking the B button, this will route the microphone sound to one of the virtual outputs of VoiceMeeter. This brings us one step closer to configuring VoiceMeeter in a way that we have "default behavior" again. **Establishing the default behavior baseline**: With "default behavior" I mean that you can hear all sound of programs running on your system and that other can hear you when you speak. To establish the first, select your headphones as hardware output A1 at the top right. Then make sure to select this A1 output in the virtual input column. The only thing left is to make sure all programs on the system are using this virtual input as their "speakers". I just configured "VB-Audio VoiceMeeter VAIO" as my default output device on Windows. For establishing default microphone behavior, select your microphone as the first hardware input in the column on the very left. Then direct it to the virtual output B1 by clicking the "B" button. Lastly, make sure all programs on your system are configured to use the "first" VoiceMeeter virtual output device as their microphone ("VB-Audio VoiceMeeter VAIO"). Again, I recommend just configuring it as the default input device in Windows. # VoiceMeeter Potato Now that we roughly understood the slighly simpler VoiceMeeter Standard UI, let's take a look at the Potato version. The most important difference for us is that there are not two hardware inputs/outputs but five and that there is not one virtual input/ouput but three. Very similar to the above-described Standard edition, Voice Meeter Potato has hardware inputs and outputs as well as virtual inputs and outputs. Outputs – both hardware as well as virtual – have internal VoiceMeeter names: hardware outputs are called A1 to A5 and virtual outputs B1 to B3. Exactly like in the Standard edition, you can configured hardware inputs by selecting the desired microphone in the title of five left-most columns. Hardware outputs are configured at the top right by clicking on the different buttons with labels starting with a capital "A". **Example:** Imagine you have a public address (PA) system at a school configured as hardware output A5 and you have one of those desk microphones at the principles office or something configured as the second hardware input. Then you could enable the "A5" button in the second column to make an announcement. The three virtual inputs and outputs are present in your system as Sound devices: VB-Audio VoiceMeeter VAIO, VB-Audio VoiceMeeter AUX VAIO, VB-AudioVoiceMeeter VAIO3. The virtual outputs correspond to B1 to B3 accordingly and the virtual inputs to the three columns in the middle of the UI: If you select VB-Audio VoiceMeeter AUX VAIO as the "Speaker" in a windows application, the application will appear in the "Voicemeeter AUX" column in the UI. As a bonus, you can also individually control the volume for application there. Pro tip: right click that column to hide the equalizer and only show running applications. Exactly like for the hardware inputs, you can control where the sound is routed: if you toggle A3, sound of all applications in that virtual input column will be routed to the third hardware output. Or if you select B3, it'll be routed to the third virtual output (called VB-AudioVoiceMeeter VAIO3). The following table can serve as a reference for the different device names: | Windows Device Name | VoiceMeeter Name | Type | In/Out | UI | | ----------------------------- | ---------------- | -------- | ------ | --------------------------- | | - | - | Hardware | In | left-most columns | | - | A1 - A5 | Hardware | Out | top right **and** A-buttons | | VB-Audio VoiceMeeter VAIO | - | Virtual | In | columns in the middle | | VB-Audio VoiceMeeter AUX VAIO | - | Virtual | In | columns in the middle | | VB-AudioVoiceMeeter VAIO3 | - | Virtual | In | columns in the middle | | VB-Audio VoiceMeeter VAIO | B1 | Virtual | Out | B-buttons | | VB-Audio VoiceMeeter AUX VAIO | B2 | Virtual | Out | B-buttons | | VB-AudioVoiceMeeter VAIO3 | B3 | Virtual | Out | B-buttons | # My Setup This section can serve as a sanity check in order for you to confirm that all confusion is gone: * I enable A1 - A5 in all three virtual input columns. And all of these are disable for all hardware inputs (otherwise I would hear myself speaking). * The "Voicemeeter VAIO" column under "Virtual Inputs" is my default speaker configured in windows. * Enabling/disabling a microphone is simply a matter of muting/unmuting the correct hardware input (button in the very bottom row of the "Hardware Input" columns). * I use the B1 (VAIO) virtual output as my default microphone under windows. So when I toggle B1 to "On" anywhere, the corresponding sound will be routed as if I spoke into a microphone. B1 is enable for all the hardware inputs for example because I control the "enabled-ness" of a microphone by muting/unmuting it. * I use "VAIO3" (the third virtual input column) for the things I want the "other side" to hear as well. So the soundboard is configured to use that as a speaker. * I can also easily share sound by switching a programs output device from Default to VAIO3. Side note: The Elgato Stream Deck is a customizable keyboard with the ability to load plugins that instead of sending keystrokes to the operating system can toggle buttons in the VoiceMeeter UI. You can, for example, configure mute/unmute buttons for the different microphones (last row under hardware inputs) or speakers ("Mute" buttons in the "Master Section"). # Problems and Solutions A lot of people on the internet™ have the problem that sound routed through VoiceMeeter is "scratchy" or that they sounds like "a robot". There are also a lot of mysterious cargo cult solutions and I'd like to add my own here. Because _I_ believe that this is caused by a windows service with name audiodg.exe switching between CPU cores! So if you have these problems, fire up your Task Manager with admin privileges and find the audiodg.exe process under the "Details" tab. Right-click it and select "Set affinity", then select only one CPU core. Your problems will go away, I promise! If they don't you are either part of The Big Anti-VoiceMeetere Conspiracy or just a heretic and hence clearly not worthy of experiencing the joys of VoiceMeeter (for real though: if this doesn't solve your problem please comment on this post). The problem with this "solution" is that it doesn't persist across reboots. So you might consider creating a task scheduled on reboot executing the following command:
Powershell.exe -Command "& {$Process = Get-Process audiodg;$Process.ProcessorAffinity=16}"