I have noise canceling headphones (Bose QC 35), that also have microphone built-in. If the microphone is active, noise canceling doesn't work, they just pass through ambient sounds (this is by design. I suppose, they did it so you wouldn't feel that you're in "vacuum" when you are talking).

Anyway, the problem is that whenever I connect my headphones to macOS, the system switches from internal microphone to headphones' one. Therefore, noise canceling doesn't work, unless I go to system settings and switch microphone back to the internal one.

This is very annoying, especially considering that I have to do that every time I connect headphones.

Is there any way to force macOS to always use internal microphone, or not to use the specific headphones' one?

Update from 10/2017:

So I found out that "headphones' microphone is being used" only happens when Skype is running. But ever since I stopped using Skype (or having it running all the time), the problem was gone!

This is not the solution for the original question, I'm just leaving it here for the future reference.

  • How do you connect your headphones, via Bluetooth? If yes, how it looks like in Bluetooth Preferences, as a single device, or as pair of two devices, headphones + microphone? – toma Jun 28 '17 at 18:24
  • @toma the Bose QC 35 is a wireless headset, but it can be used also via phone connector – northsea Jun 28 '17 at 19:35
  • @northsea as I can see on official website, this headphones supports both interfaces, bluetooth and audio wire. so if you connect them via bluetooth, how they are displayed in BT prefs? bose.com/en_us/products/headphones/over_ear_headphones/… – toma Jun 28 '17 at 19:40
  • @toma I'm using them via bluetooth, yes. They are shown as headphones. – kovpas Jun 29 '17 at 21:26
  • 4
    This is not an actual solution, but you can quickly switch input sources by holding Option and clicking the Sound icon in your menu bar, then selecting an input source from the list. It's a bit faster than using System Preferences, at least. – aaplmath Jul 1 '17 at 0:09
up vote 5 down vote accepted
+100

I'm not sure how practical this is (I haven't had the chance to measure CPU usage, etc.), but the below AppleScript will do the job—just replace [YOUR HEADPHONES' NAME] with the actual name of your headphones. This is a modified version of a script from an Apple Support Communities thread.

Save the script below as an application, run it, and add it to your startup items—it should run continuously in the background.

repeat
    set statusOld to checkStatus()
    set statusNew to checkStatus()
    repeat while statusOld is equal to statusNew
        delay 5 --for 5 second checks
        set statusNew to checkStatus()
    end repeat
    if statusNew is true then
        tell application "System Preferences" to activate
        tell application "System Preferences"
            reveal anchor "input" of pane id "com.apple.preference.sound"
        end tell
        delay 0.5
        tell application "System Events" to tell process "System Preferences"
            tell table 1 of scroll area 1 of tab group 1 of window 1
                select (row 1 where value of text field 1 is "Internal Microphone")
            end tell
        end tell
        tell application "System Preferences" to quit
    else
        -- Nothing needs to happen, the device was removed
    end if
end repeat

on checkStatus()
    set bluetoothDeviceName to "[YOUR HEADPHONES' NAME]"
    set myString to do shell script "system_profiler SPBluetoothDataType"

    --initial check if it's not even there
    if myString does not contain bluetoothDeviceName then
        return false
    else

        --find out if connected/disconnected
        set AppleScript's text item delimiters to "name:"
        set myList to the text items of myString --each item of mylist is now one of the devices

        set numberOfDevices to count of myList
        set counter to 1
        repeat numberOfDevices times --loop through each devices checking for Connected string
            if item counter of myList contains bluetoothDeviceName then
                if item counter of myList contains "Connected: Yes" then
                    return true
                else if item counter of myList contains "Connected: No" then
                    return false
                else
                    display dialog "Something went wrong with the script" --this shouldn't happen
                end if
            end if
            set counter to counter + 1
        end repeat
    end if
end checkStatus

You could play with the time between checks (the line with the comment for 5 second checks) to reduce resource consumption.

There are a number of new APIs (especially in AVFoundation) coming to macOS High Sierra that would allow for a much cleaner solution to this problem. If you're comfortable with Swift or Objective-C (or the Cocoa scripting bridge in AppleScript and JXA), I would look into using those APIs instead of this script once High Sierra is released. In particular, Apple's Audio Session Programming Guide and this Stack Overflow post show some techniques of detecting Bluetooth connections using AVAudioSession.

  • Yeah, looks like a decent compromise. I'm really disappointed Bose still can't come up with good support of their product on Sierra... Until then it seems that I'd have to use workarounds like this :(. Thank you! – kovpas Jul 3 '17 at 18:15
  • @aaplmath The script is really interesting... and I really like that suggestion at the end of your post. Writing a menu bar app (or headless) application that monitors the audio session and always re-routes to the internal microphone would be a fun project to work on and might be a little more robust... (maybe) But still, I like the AppleScript version because it's something anyone could just use today. Thanks! – Evan K. Stone Oct 23 at 13:21

I have this problem when using the iOS Simulator and it makes any sound, like from a keyboard. My Bose 35's switch to a lower quality audio stream and everything sounds awful.

From other search results I found that switching to my Mac's internal microphone fixes the problem. Based on this question, I realized I may not be able to set the setting for my mac, but I can set them for my iOS Simulator.

iOS Simulator: Hardware -> Audio Input -> Internal Microphone

I still really like @aaplmath's suggestion (and that may be the best one going forward), but I also just stumbled on this solution that requires no coding (AppleScript/Swift/ObjC/Other) in High Sierra, and it's super easy to configure.

Please note that the answer was in the comment section of the article and it seems to work on High Sierra (I'm on 10.13.6), but I don't know if this works on Mojave and beyond.

Open the standard "Audio MIDI Setup.app" utility, and click the + at the bottom to create an Aggregate Device. Then select the Internal Microphone as the only component in this aggregate device and select it as the default input. For some reason this prevents Mac OS X from selecting the Bluetooth Microphone from now on and it will stay on the internal one when you reconnect.

After creating that aggregate input, go to your usual System Preferences -> Sound -> Input (tab)

Source: http://ssrubin.com/posts/fixing-macos-bluetooth-headphone-audio-quality-issues-with-hammerspoon.html#comment-4018174387

If you use your headphones via cable instead of bluetooth, the simplest solution should be to use a cable with a TRS (Tip + Ring + Sleeve) phone jack instead of a TRRS (Tip + Ring + Ring + Sleeve) phone jack. The TRS phone jack only supports Stereo signal, but no microphone. Thus no microphone signal will be transmitted and the built-in microphone should stay active.

  • 1
    No, I'm using them via bluetooth. Wireless was the main reason to buy them in the first place :) – kovpas Jun 29 '17 at 21:27

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.