Virtual Audio Drivers for Legacy Hackintosh (macOS 10.6–10.13): Soundflower and BlackHole Guide
Step-by-step guide to installing and configuring Soundflower and BlackHole virtual audio drivers on Hackintosh systems running macOS 10.6 through 10.13, including troubleshooting and persistence tips.
On a Hackintosh running macOS 10.6 through 10.13, getting audio output working is only half the battle. The real headache starts when you need to route system audio into a recording app, capture microphone input without a physical mic, or merge multiple outputs into one stream. That's where a virtual audio device comes in — a kernel extension that tricks macOS into seeing a software-only interface as real hardware.
I'll focus on the drivers that actually work on 10.6 through 10.13 — Soundflower and BlackHole — and skip the built-in aggregate device enhancements from 10.14 and later. Those need a Metal-capable GPU and APFS, which legacy Hackintosh hardware usually can't provide.
When a Virtual Audio Device Becomes Necessary
On a genuine Mac, Audio MIDI Setup lets you create a multi-output or aggregate device without third-party software. On a Hackintosh running 10.6–10.13, that aggregate device feature works but has a critical flaw: it can't produce a single stereo stream that both outputs to speakers and is simultaneously available for recording. For streaming, voice chat, or screenshot capture with audio, you need a loopback interface — a virtual audio device that sends audio from applications right back into the recording subsystem.
- Streaming video capture: Recording the desktop with QuickTime Player or OBS while also preserving system sounds.
- Voice chat with game audio: Merging microphone input and game sound into a single virtual input for programs like Discord or TeamSpeak.
- System-wide audio routing: Sending all audio from one app to a separate output (e.g., a USB DAC) while monitoring elsewhere.
- Testing kernel extensions: debugging audio without a physical speaker connected.
All of these scenarios require a kernel-level driver that creates a virtual device capable of both input and output simultaneously.
Candidate Drivers for Legacy macOS
Three open-source or freeware virtual audio drivers have historically been used in the Hackintosh community. Each has a different compatibility window and a different set of limitations.
| Driver | Latest supported macOS | Architecture | Kext injection note |
|---|---|---|---|
| Soundflower 2.0b2 | 10.6 – 10.11 | 32-bit / 64-bit (fat) | Must be installed via installer; cache rebuild required |
| Soundflower 1.6.6 | 10.4 – 10.9 | 32-bit only | Works with kextload in single-user mode |
| BlackHole 16ch (0.5.0) | 10.10 – 10.13 | 64-bit only | Can be injected via Clover/OpenCore kext folder |
Soundflower was the original choice, but its 2.0b2 version has a known race condition on 10.12 and newer that causes kernel panics when the system is under audio load. BlackHole, written by a developer who contributed to Soundflower, offers a cleaner architecture with a 16-channel variant that works well with aggregate devices. On 10.13 High Sierra, BlackHole is the safest option because it does not rely on the deprecated IORegistry property that Soundflower uses for naming.
Installation Workflow for BlackHole on 10.12–10.13
Assuming you are running macOS Sierra or High Sierra on a Sandy Bridge, Ivy Bridge, or Haswell platform with a working AppleHDA installation, follow these steps. Always back up your current /Library/Extensions and /System/Library/Extensions before modifying any kext.
- Download the BlackHole installer from the official GitHub repository (version 0.5.0 for 10.10+). The package is a .pkg that installs the driver into /Library/Audio/Plug-Ins/HAL/ and the kext into /Library/Extensions/BlackHole.kext.
- Re-enable SIP before running the installer. Use the recovery partition to boot, open Terminal, and run
csrutil enable. Virtual audio drivers require a signed kernel extension; SIP must be enabled for the kext to load without a UUID warning. On most Hackintosh installs, SIP is already partially disabled; you may need to setcsr-active-configto0x10a(allow unsigned kexts but enforce signed drivers) in your bootloader config. - Run the installer and reboot. After reboot, open Audio MIDI Setup (in /Applications/Utilities/). You should see a new device named "BlackHole 16ch" under both Input and Output tabs.
- Create an Aggregate Device if you want to hear audio while recording. Click the + button in the lower-left corner of Audio MIDI Setup, choose "Create Aggregate Device". Add both your built-in output (e.g., "Built-in Output") and "BlackHole 16ch". Check the "Drift Correction" box for the BlackHole channel. This creates a single device that sends audio to your speakers and simultaneously to the virtual input.
- Set the Aggregate Device as the default output in System Preferences > Sound. Open your recording application (QuickTime, OBS, Audacity) and select "BlackHole 16ch" as the audio input source.
If the kernel extension does not load after reboot, check the system log with log show --predicate 'subsystem == "com.apple.kext"' --last 5m. Look for entries containing "BlackHole" or "com.audiohole.BlackHole". A common error on 10.13 is a missing code signature; re-run the installer with SIP fully enabled to fix this.
Soundflower on 10.9–10.11: The Reliable Workaround
For Mavericks through El Capitan, Soundflower 2.0b2 remains the most straightforward choice. Its installation is identical to BlackHole, but you must also add a kernel flag in your bootloader to prevent the kext from being blocked by the macOS kernel extension policy. On Clover, add kext-dev-mode=1 to the boot arguments. On OpenCore, set Kernel > Quirks > DummyPowerManagement to true and add kext-dev-mode=1 to NVRAM > Add > 7C436110-AB2A-4BBB-A880-FE41995C9F82 > boot-args.
Soundflower creates two devices: "Soundflower (2ch)" and "Soundflower (64ch)". Use the 2-channel variant for most applications; the 64-channel version is intended for multi-track recording software. On 10.11, Soundflower exhibits a bug where the device disappears after sleep. The workaround is to create a LaunchDaemon that reloads the kext upon wake:
sudo nano /Library/LaunchDaemons/com.cycling74.soundflower-reload.plist
Paste the following:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" ";
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.cycling74.soundflower-reload</string>
<key>ProgramArguments</key>
<array>
<string>/sbin/kextload</string>
<string>/Library/Extensions/Soundflower.kext</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/var/run/systemid</string>
</array>
</dict>
</plist>
Save the file, then run sudo launchctl load /Library/LaunchDaemons/com.cycling74.soundflower-reload.plist. This forces the kext to reload after every system wake from sleep.
Limitations on 10.13 and Newer
High Sierra introduced a stricter kernel extension validation policy. Even with SIP enabled, some users report that BlackHole 0.5.0 produces a static burst when the aggregate device is first activated. This is caused by a race condition in the driver's audio clock recovery. The only reliable mitigation is to set the BlackHole 16ch device as the only input in the aggregate device configuration, and then route the output separately. Alternatively, use Loopback (commercial software) which uses a user-space audio server instead of a kernel extension, but that requires a purchased license.
On 10.13.4 and later, Apple changed the internal audio routing API, causing Soundflower to kernel panic on load. There is no patch for Soundflower beyond 2.0b2; the developer abandoned the project. BlackHole remains the only free option for 10.13, but its 16ch variant may cause a 10–30 ms latency increase in the audio chain. This is acceptable for recording but not for real-time monitoring.
Testing and Diagnosing the Virtual Device
After installation, open the Audio MIDI Setup and verify that the virtual device shows a "Thru" indicator when you play a test tone from System Preferences > Sound > Output. If the indicator does not appear, the virtual output is not receiving audio. Common causes:
- Kext not loaded: Run
kextstat | grep -E 'Soundflower|BlackHole'. If nothing appears, the kext is not in the kernel stack. Reinstall or inject via bootloader. - Wrong SIP configuration: On 10.12+, set
csr-active-configto0x28(allow unsigned kexts but enforce signed drivers) instead of0x67(disable all SIP). - Duplicate device entries: Some users see two "BlackHole 16ch" devices after a failed install. Remove both via Audio MIDI Setup, delete the kext from /Library/Extensions, and reinstall.
- Sample rate mismatch: The virtual device defaults to 44.1 kHz. If your recording application expects 48 kHz, open Audio MIDI Setup and change the format of the BlackHole device to 48000 Hz before creating the aggregate device.
Persistence After macOS Updates
Minor macOS updates (10.12.4 → 10.12.5) do not typically break virtual audio kexts, but major version jumps (10.12 → 10.13) require a fresh installation. The kexts are not signed by Apple, so after a system update that re-validates the kernel extension cache, the virtual device may disappear. The fix is to re-run the .pkg installer from the same version. Keep a copy of the installer on your EFI partition or a dedicated tools USB drive.
If you are using Clover or OpenCore, you can inject the virtual audio kext from the EFI/OC/Kexts folder instead of installing it into /Library/Extensions. This method bypasses the SIP signing requirement entirely, but it requires that the bootloader's Kernel > Add section includes the correct plist entry with the bundle path and the ExecutablePath set to Contents/MacOS/BlackHole. For legacy machines that boot with Clover, this approach is more reliable because the kext is loaded before the kernel extension cache is built.
Regardless of the method, always test the virtual device immediately after a macOS update by playing a sound and checking the Audio MIDI Setup. If the device is missing, do not attempt to record or stream until you have restored the kext — the system may crash if an application tries to open a non-existent audio interface.
