BlackHole is a modern macOS virtual audio loopback driver that allows applications to pass audio to other applications with zero additional latency.
brew install blackhole-2ch
brew install blackhole-16ch
brew install blackhole-64ch
Delete the BlackHole driver with the terminal command:
rm -R /Library/Audio/Plug-Ins/HAL/BlackHoleXch.driver
Be sure to replace
X with either
Note that the directory is the root
Restart CoreAudio with the terminal command:
sudo launchctl kickstart -kp system/com.apple.audio.coreaudiod
For more specific details visit the Wiki.
Audio Midi Setup→
Audio Devicesright-click on the newly created Multi-Output and select "Use This Device For Sound Output"
Please support our hard work and continued development. To request a license contact Existential Audio.
To install BlackHole copy the
BlackHoleXch.driver folder to
/Library/Audio/Plug-Ins/HAL and restart CoreAudio using
sudo launchctl kickstart -kp system/com.apple.audio.coreaudiod.
The following pre-compiler constants may be used to easily customize a build of BlackHole.
kDriver_Name kPlugIn_BundleID kPlugIn_Icon kDevice_Name kDevice_IsHidden kDevice_HasInput kDevice_HasOutput kDevice2_Name kDevice2_IsHidden kDevice2_HasInput kDevice2_HasOutput kLatency_Frame_Size kNumber_Of_Channels kSampleRates
They can be specified at build time with
xcodebuild \ -project BlackHole.xcodeproj \ GCC_PREPROCESSOR_DEFINITIONS='$GCC_PREPROCESSOR_DEFINITIONS kSomeConstant=value'
Be sure to escape any quotation marks when using strings.
To customize BlackHole it is required to change the following constants.
These can specified as pre-compiler constants using
driverName = "BlackHole" bundleID = "audio.existential.BlackHole" icon = "BlackHole.icns" xcodebuild \ -project BlackHole.xcodeproj \ -configuration Release \ PRODUCT_BUNDLE_IDENTIFIER=$bundleID \ GCC_PREPROCESSOR_DEFINITIONS='$GCC_PREPROCESSOR_DEFINITIONS kDriver_Name=\"'$driverName'\" kPlugIn_BundleID=\"'$bundleID'\" kPlugIn_Icon=\"'$icon'\"'
kNumber_Of_Channels is used to set the number of channels. Be careful when specifying high channel counts. Although BlackHole is designed to be extremely efficient at higher channel counts it's possible that your computer might not be able to keep up. Sample rates play a roll as well. Don't use high sample rates with a high number of channels. Some applications don't know how to handle high channel counts. Proceed with caution.
kLatency_Frame_Size is how much time in frames that the driver has to process incoming and outgoing audio. It can be used to delay the audio inside of BlackHole up to a maximum of 65536 frames. This may be helpful if using BlackHole with a high channel count.
kSampleRates set the sample rate or sample rates of the audio device. If using multiple sample rates separate each with a
By default BlackHole has a hidden mirrored audio device. The devices may be customized using the following constants.
// Original Device kDevice_IsHidden kDevice_HasInput kDevice_HasOutput // Mirrored Device kDevice2_IsHidden kDevice2_HasInput kDevice2_HasOutput
When all are set to true a 2nd BlackHole will show up that works exactly the same. The inputs and outputs are mirrored so the outputs from both devices go to the inputs of both devices.
This is useful if you need a separate device for input and output.
// Original Device kDevice_IsHidden=false kDevice_HasInput=true kDevice_HasOutput= false // Mirrored Device kDevice2_IsHidden=false kDevice2_HasInput= false kDevice2_HasOutput=true
In this situation we have two BlackHole devices. One will have inputs only and the other will have outputs only.
One way to use this in projects is to hide the mirrored device and use it behind the scenes. That way the user will see an input only device while routing audio through to the output behind them scenes.
Hidden audio devices can be accessed using
BlackHole can be integrated into your CI/CD. Take a look at https://github.com/ExistentialAudio/BlackHole/blob/master/Installer/create_installer.sh to see how the installer is built, signed and notarized.
If you are interested in any of the following features please leave a comment in the linked issue. To request a features not listed please create a new issue.
BlackHole is a virtual audio loopback driver. It only shows up in
Audio MIDI Setup,
Sound Preferences, or other audio applications.
Unfortunately macOS does not support changing the volume of a Multi-Output device but you can set the volume of individual devices in Audio MIDI Setup.
System Preferences ->
Security & Privacy ->
Microphone to make sure your digital audio workstation (DAW) has microphone access.
Check that the volume is all the way up on BlackHole input and output in
Audio Midi Setup.
If you are using a multi-output device, due to issues with macOS the Built-in Output must be enabled and listed as the top device in the Multi-Output. See here for details.
Unfortunately multi-outputs are pretty buggy and some apps just won't work with them at all. Here is a list of known ones. If you have more to add please let me know.
The microphone from AirPods runs at a lower sample rate which means it should not be used as the primary/clock device in an Aggregate or Multi-Output device. The solution is to use your built-in speakers (and just mute them) or BlackHole 2ch as the primary/clock device. BlackHole 16ch will not work as the primary since the primary needs to have 2ch.
Read the discussion. https://github.com/ExistentialAudio/BlackHole/issues/146
BlackHole is licensed under GPL-3.0. You can use BlackHole as long as your app is also licensed as GPL-3.0. For all other applications please contact Existential Audio directly.