Apple - How to always use macbook microphone with Bose QuietComfort 35?

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


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.


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