fix: use delivered system audio format

This commit is contained in:
2026-08-26 10:22:59 +02:00
parent aed34f6d28
commit 4e8fdc7603
3 changed files with 60 additions and 7 deletions
+42 -1
View File
@@ -116,6 +116,47 @@ extension AudioObjectID {
try read(kAudioTapPropertyFormat, defaultValue: AudioStreamBasicDescription())
}
/// Reads the virtual format of the first input stream exposed by this device.
///
/// An aggregate device can adapt a tap to the active output hardware. Its
/// input stream format is therefore the format delivered to the I/O proc,
/// which can differ from the tap object's originally advertised format.
func readInputStreamBasicDescription() throws -> AudioStreamBasicDescription {
var streamsAddress = AudioObjectPropertyAddress(
mSelector: kAudioDevicePropertyStreams,
mScope: kAudioObjectPropertyScopeGlobal,
mElement: kAudioObjectPropertyElementMain
)
var dataSize: UInt32 = 0
var status = AudioObjectGetPropertyDataSize(self, &streamsAddress, 0, nil, &dataSize)
guard status == noErr else {
throw "Error reading device stream list size: \(status)"
}
var streamIDs = [AudioObjectID](
repeating: .unknown,
count: Int(dataSize) / MemoryLayout<AudioObjectID>.size
)
status = AudioObjectGetPropertyData(self, &streamsAddress, 0, nil, &dataSize, &streamIDs)
guard status == noErr else {
throw "Error reading device stream list: \(status)"
}
for streamID in streamIDs {
let direction: UInt32 = try streamID.read(
kAudioStreamPropertyDirection,
defaultValue: 0
)
guard direction == 1 else { continue }
return try streamID.read(
kAudioStreamPropertyVirtualFormat,
defaultValue: AudioStreamBasicDescription()
)
}
throw "Device has no input stream."
}
private func requireSystemObject() throws {
if self != .system { throw "Only supported for the system object." }
}
@@ -307,4 +348,4 @@ extension AudioObjectID {
func getDeviceName() throws -> String {
return try readString(kAudioDevicePropertyDeviceNameCFString)
}
}
}