← All posts

Microsoft Teams uninstalled itself but kept my microphone hostage

The symptom was the maddening kind: my Mac clearly had a working microphone. System Settings showed the input level bouncing when I talked. But on FaceTime, the friend on the other end heard pure silence.

When the hardware reads fine but one specific app goes mute, the problem usually isn’t the hardware — it’s which microphone the call is actually wired to. So I went looking at the device list.

And this wasn’t its first appearance. The bug had flared up on and off for ages, and my “fix” was always the same dumb ritual: reboot, test, still broken, reboot again — sometimes three or four restarts before a call finally carried sound. That cadence should have been a clue. Each cold boot makes Core Audio re-enumerate every device from scratch, and the default-input pick lands on whichever one comes up first; some boots the real mic won the toss, some boots the ghost did. I wasn’t fixing anything. I was re-flipping a coin until it came up heads.

The smoking gun: a device I never installed

$ system_profiler SPAudioDataType | grep -A6 -i input

The built-in mic was there, set as default, fine. But so was this:

Microsoft Teams Audio Device:
  Input Channels: 1
  Manufacturer: Microsoft Corp.
  Transport: Virtual

Transport: Virtual is the tell. This isn’t a real microphone — it’s a software HAL plugin: a virtual audio device that registers itself system-wide as a selectable input and output. Apps route audio through it. And if a call ends up pointed at a virtual device whose other end goes nowhere, your voice gets dutifully captured and dropped into the void. The level meter still moves. The friend still hears nothing.

The kicker: I uninstalled Teams years ago. The app was long gone from /Applications — I genuinely could not remember the last time I’d opened it. But deleting a Mac app doesn’t unregister the audio drivers it dropped into a system folder — those are not in the app bundle, so they sit there, surviving the app by years.

Where orphaned audio drivers hide

HAL plugins live in one of two folders, and almost always the system one:

$ ls /Library/Audio/Plug-Ins/HAL/
MSTeamsAudioDevice.driver
ParrotAudioPlugin.driver

There it was — MSTeamsAudioDevice.driver, dated long after I thought Teams was gone, quietly haunting every audio app on the machine.

Eviction

Removing it needs sudo (it’s under /Library). Rather than rm outright, I moved it aside first — a HAL folder is a place you want a quick undo:

sudo mkdir -p /Users/Shared/removed-audio-drivers
sudo mv /Library/Audio/Plug-Ins/HAL/MSTeamsAudioDevice.driver \
        /Users/Shared/removed-audio-drivers/

A moved driver doesn’t disappear from the device list until Core Audio reloads. Restart the daemon — it respawns instantly, no reboot:

sudo killall coreaudiod

Re-run the system_profiler check and the Teams device is gone. The default input is the built-in mic, and nothing virtual is lurking to steal the route.

While I was in there: reset the app’s mic permission

Belt and suspenders — if FaceTime’s microphone grant had gotten into a weird state, clearing it forces a fresh prompt on next launch:

tccutil reset Microphone com.apple.FaceTime

Harmless and reversible: the next time FaceTime opens it just asks for the mic again. Click Allow.

The cleanup tail: an iCloud folder that won’t delete

Once I’d decided Teams was getting fully exorcised, a full-disk sweep turned up one last crumb — its iCloud Drive container:

~/Library/Mobile Documents/iCloud~com~microsoft~skype~teams

Empty, but rm -rf returned Permission denied even as my own user. Folders under Mobile Documents are managed by cloudd, and the parent is stamped read-only for you (dr-x------). sudo gets through:

sudo rm -rf ~/Library/Mobile\ Documents/iCloud~com~microsoft~skype~teams

Don’t shoot the parrot: check the signature first

There was a second virtual driver sitting in that same HAL folder:

$ ls /Library/Audio/Plug-Ins/HAL/
ParrotAudioPlugin.driver

Reflex said delete that one too — it looks exactly like the kind of leftover cruft I’d just evicted. That reflex was wrong, and it’s worth slowing down for. A HAL plugin is a real kernel-adjacent component; deleting the wrong one breaks system audio. So before touching it, I checked who signed it:

$ codesign -dv --verbose=2 /Library/Audio/Plug-Ins/HAL/ParrotAudioPlugin.driver
Identifier=com.apple.audio.ParrotAudioPlugin
Authority=Software Signing
Authority=Apple Code Signing Certification Authority
Authority=Apple Root CA
TeamIdentifier=not set

That chain — Apple Root CA, identifier under com.apple.audio, TeamIdentifier=not set — is Apple’s own first-party signing, not a third-party app’s. The bundle was even built with the internal macOS SDK and installed at the exact timestamp of the last OS update. “Parrot” is just an Apple internal codename; the plugin ships with macOS, and unlike the Teams ghost it never even surfaces as a selectable device.

So the rule that separates the villain from the bystander:

Teams driver (delete)Parrot driver (keep)
Bundle idcom.microsoft… (Manufacturer: Microsoft Corp.)com.apple.audio…
Signed bya third partyApple Root CA, TeamIdentifier=not set
Shows as a deviceyes — and stole the routeno
Came froman app deleted years agothe OS itself

If codesign traces to Apple Root CA with a com.apple.* identifier, leave it — it’s part of the OS, and a future update will just reinstall it anyway. The thing worth removing is the one carrying a dead third party’s name.

The takeaway

If an app records but the other side hears nothing, check system_profiler SPAudioDataType for a Transport: Virtual device you don’t recognize before you blame the call, the network, or the mic. Virtual audio drivers — from Teams, Zoom, Loopback, BlackHole, and friends — outlive the apps that installed them, and a stale one can silently capture the route.

Two lines find it (ls /Library/Audio/Plug-Ins/HAL/) and three evict it. And this time it stays fixed — no more reboot lottery, because there’s no longer a second device for the coin to land on. FaceTime works again. The friend can hear me. And Teams, which I hadn’t run in years, is finally, properly gone. 🎙️⚰️


Footnote, with feeling: I didn’t track this one down alone. I described the symptom to Claude Code (thank you, Anthropic), it walked the device list, spotted the Transport: Virtual ghost, traced it to the orphaned driver, and evicted it — start to finish in one sitting, after years of me just rebooting and shrugging. A friendship’s worth of silent FaceTime calls, finally explained. Now I can just call people and they can hear me. Revolutionary. 🙂

Notes from the workshop — the door is open.