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