import AudioToolbox import CoreAudio import Foundation /// Resolves hardware audio input devices, e.g. the built-in or currently /// selected microphone. Unlike system audio capture, this talks to a real /// input device directly and needs no process tap or aggregate device. public class InputDeviceResolver { /// Returns the system's current default audio input device. public static func defaultInputDevice() throws -> AudioObjectID { var address = getPropertyAddress(selector: kAudioHardwarePropertyDefaultInputDevice) var deviceID = AudioObjectID(kAudioObjectUnknown) var size = UInt32(MemoryLayout.size) let status = AudioObjectGetPropertyData( AudioObjectID(kAudioObjectSystemObject), &address, 0, nil, &size, &deviceID) guard status == kAudioHardwareNoError, deviceID != kAudioObjectUnknown else { AudioTeeLogging.logger.error( "Failed to resolve default input device", context: ["status": String(status)]) throw AudioTeeError.defaultInputDeviceUnavailable(status) } AudioTeeLogging.logger.debug( "Resolved default input device", context: ["device_id": String(deviceID)]) return deviceID } }