如何忽略从系统首选项中更改音频输出? (苹果系统)

时间:2017-09-11 02:36:21

标签: macos core-audio

我让自己的应用可以选择音频输出。 (例如'系统默认'或'用户的DAC')

但是当用户从系统偏好设置面板中选择输出 - 声音时,我的应用程序的输出将跟随输出用户选择。

我搜索了很多并添加了一些监听器,因此如果系统输出已更改,我可以立即将我的应用程序的输出更改为先前用户选择的。

但它使得延迟几毫秒的时间非常短暂。

我想这是因为我已将应用程序的输出更改为系统默认值后切换。

所以我想知道如果我能在系统默认输出改变之前知道。 (像来自可可的viewWillAppear api)

谢谢。

我用来了解系统默认音频输出的监听器来自下面的文章。

How to get notification if System Preferences Default Sound changed

感谢

更多细节

我使用AudioUnitSetProperty(audioOut, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Output, 0, &deviceID, (UInt32)sizeof(deviceID))来选择输出设备。 apple document

并添加此侦听器

func addListenerBlock(listenerBlock: @escaping AudioObjectPropertyListenerBlock, onAudioObjectID: AudioObjectID, forPropertyAddress: inout AudioObjectPropertyAddress) {
                if (kAudioHardwareNoError != AudioObjectAddPropertyListenerBlock(onAudioObjectID, &forPropertyAddress, nil, listenerBlock)) {
                    LOG("Error calling: AudioObjectAddPropertyListenerBlock") }
            }

func add() {

        var propertyAddress = AudioObjectPropertyAddress(mSelector: kAudioHardwarePropertyDefaultOutputDevice,
                                                         mScope: kAudioObjectPropertyScopeGlobal,
                                                         mElement: kAudioObjectPropertyElementMaster)
        self.addListenerBlock(listenerBlock: audioObjectPropertyListenerBlock,
                                          onAudioObjectID: AudioObjectID(bitPattern: kAudioObjectSystemObject),
                                          forPropertyAddress: &propertyAddress)
    }

1 个答案:

答案 0 :(得分:1)

kAudioUnitSubType_DefaultOutput跟踪用户在“声音首选项”中选择的当前输出设备。要播放特定设备,请使用kAudioUnitSubType_HALOutputAUComponent.h中的评论很有帮助:

@enum           Apple input/output audio unit sub types (OS X)
@constant       kAudioUnitSubType_HALOutput         
                    - desktop only
                The audio unit that interfaces to any audio device. The user specifies which 
                audio device to track. The audio unit can do input from the device as well as 
                output to the device. Bus 0 is used for the output side, bus 1 is used
                to get audio input from the device.

@constant       kAudioUnitSubType_DefaultOutput     
                    - desktop only
                A specialisation of AUHAL that is used to track the user's selection of the 
                default device as set in the Sound Prefs

@constant       kAudioUnitSubType_SystemOutput      
                    - desktop only
                A specialisation of AUHAL that is used to track the user's selection of the 
                device to use for sound effects, alerts
                and other UI sounds.

您没有说明如何设置输出(AUGraph?),因此使用kAudioUnitSubType_HALOutput的方式会有所不同。