【问题标题】:Using AudioToolbox from Swift to access OS X master volume使用 Swift 中的 AudioToolbox 访问 OS X 主音量
【发布时间】:2015-02-02 03:20:38
【问题描述】:

是否有解决方案可以在我的 Swift 应用中设置系统的主音量?

我阅读了很多有关 AudioToolbox 的内容并阅读了一些 Objective-C 中的源代码示例。例如,我发现了这个:Setting Mac OS X Volume Programatically after 10.6

但我无法让它在 Swift 中运行。

我在https://developer.apple.com/library/mac/documentation/AudioToolbox/Reference/AudioHardwareServicesReference/index.html#//apple_ref/c/func/AudioHardwareServiceGetPropertyData 中缺少一些示例代码

【问题讨论】:

    标签: macos cocoa swift audiotoolbox


    【解决方案1】:

    (为 Swift 4 及更高版本更新了代码,Swift 2 和 3 版本可以在编辑历史记录中找到。)

    这是我将 Change OS X system volume programmaticallySetting Mac OS X volume programmatically after 10.6 (Snow Leopard) 的答案翻译成 Swift 的结果(为简洁起见,省略了错误检查):

    所需框架:

    import AudioToolbox
    

    获取默认输出设备:

    var defaultOutputDeviceID = AudioDeviceID(0)
    var defaultOutputDeviceIDSize = UInt32(MemoryLayout.size(ofValue: defaultOutputDeviceID))
    
    var getDefaultOutputDevicePropertyAddress = AudioObjectPropertyAddress(
        mSelector: kAudioHardwarePropertyDefaultOutputDevice,
        mScope: kAudioObjectPropertyScopeGlobal,
        mElement: AudioObjectPropertyElement(kAudioObjectPropertyElementMaster))
    
    let status1 = AudioObjectGetPropertyData(
        AudioObjectID(kAudioObjectSystemObject),
        &getDefaultOutputDevicePropertyAddress,
        0,
        nil,
        &defaultOutputDeviceIDSize,
        &defaultOutputDeviceID)
    

    设置音量:

    var volume = Float32(0.50) // 0.0 ... 1.0
    var volumeSize = UInt32(MemoryLayout.size(ofValue: volume))
    
    var volumePropertyAddress = AudioObjectPropertyAddress(
        mSelector: kAudioHardwareServiceDeviceProperty_VirtualMasterVolume,
        mScope: kAudioDevicePropertyScopeOutput,
        mElement: kAudioObjectPropertyElementMaster)
    
    let status2 = AudioObjectSetPropertyData(
        defaultOutputDeviceID,
        &volumePropertyAddress,
        0,
        nil,
        volumeSize,
        &volume)
    

    最后,为了完整起见,获取音量:

    var volume = Float32(0.0)
    var volumeSize = UInt32(MemoryLayout.size(ofValue: volume))
    
    var volumePropertyAddress = AudioObjectPropertyAddress(
        mSelector: kAudioHardwareServiceDeviceProperty_VirtualMasterVolume,
        mScope: kAudioDevicePropertyScopeOutput,
        mElement: kAudioObjectPropertyElementMaster)
    
    let status3 = AudioObjectGetPropertyData(
        defaultOutputDeviceID,
        &volumePropertyAddress,
        0,
        nil,
        &volumeSize,
        &volume)
    
    print(volume)
    

    为简洁起见,省略了错误检查。当然,在实际应用中应该检查状态返回值是成功还是失败。

    感谢 Set OS X volume in OS X 10.11 using Swift without using the deprecated AudioHardwareServiceSetPropertyData API 使用AudioObjectSetPropertyData() 而不是已弃用的AudioHardwareServiceSetPropertyData()

    正如noamtm 在 cmets 中提到的,这也适用于通过传递获取和设置左右平衡

    mSelector: kAudioHardwareServiceDeviceProperty_VirtualMasterBalance
    

    AudioObjectPropertyAddress()

    【讨论】:

    • 酷。多谢。现在我看到了我在使用 AudioDeviceId 和 kAudio 时犯的错误......
    • 在 Swift 5 中,您还需要导入 CoreAudio,并且 kAudio 属性具有正确的类型。
    • @zneak:感谢您告诉我。我已经更新了 Swift 4(和 5)的代码。在我的项目中,导入 AudioToolbox 就足够了,即使在 Swift 5(Xcode 10.2 beta)中也是如此。
    • 完美运行 Catalina 10.15.2、Swift 5、Xcode 11.3.1
    • 谢谢。我想补充一点,左右平衡也可以用同样的方式控制,只需将kAudioHardwareServiceDeviceProperty_VirtualMasterVolume改为kAudioHardwareServiceDeviceProperty_VirtualMasterBalance即可。 @MartinR 请考虑将此注释添加到答案中。
    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    相关资源
    最近更新 更多