@@ -24,6 +24,11 @@ struct AudioObjectAddress {
2424 mSelector: kAudioDevicePropertyDeviceNameCFString,
2525 mScope: kAudioObjectPropertyScopeGlobal,
2626 mElement: kAudioObjectPropertyElementMaster)
27+
28+ static var isRunning = AudioObjectPropertyAddress (
29+ mSelector: kAudioDevicePropertyDeviceIsRunningSomewhere,
30+ mScope: kAudioObjectPropertyScopeGlobal,
31+ mElement: kAudioObjectPropertyElementMaster)
2732}
2833
2934class Audio {
@@ -64,6 +69,20 @@ class Audio {
6469 }
6570 }
6671
72+ var isRunning : Bool {
73+ guard let inputDevice = inputDevice else { return false }
74+
75+ var value : UInt32 = 0
76+ var size = UInt32 ( MemoryLayout . size ( ofValue: value) )
77+
78+ let error = AudioObjectGetPropertyData (
79+ inputDevice, & AudioObjectAddress. isRunning,
80+ 0 , nil ,
81+ & size, & value)
82+
83+ return error == kAudioHardwareNoError ? value == 1 : false
84+ }
85+
6786 func toggleMicMute( ) {
6887 micMuted = !micMuted
6988 }
@@ -114,12 +133,14 @@ class Audio {
114133 private func registerDeviceStateListener( ) {
115134 guard let inputDevice = self . inputDevice else { return }
116135 AudioObjectAddPropertyListenerBlock ( inputDevice, & AudioObjectAddress. muteState, DispatchQueue . main, self . deviceStateListener)
136+ AudioObjectAddPropertyListenerBlock ( inputDevice, & AudioObjectAddress. isRunning, DispatchQueue . main, self . deviceStateListener)
117137
118138 listeners. forEach { $0. value ( ) }
119139 }
120140
121141 private func unregisterDeviceStateListener( ) {
122142 guard let inputDevice = self . inputDevice else { return }
143+ AudioObjectRemovePropertyListenerBlock ( inputDevice, & AudioObjectAddress. isRunning, DispatchQueue . main, self . deviceStateListener)
123144 AudioObjectRemovePropertyListenerBlock ( inputDevice, & AudioObjectAddress. muteState, DispatchQueue . main, self . deviceStateListener)
124145 }
125146
0 commit comments