使用Swift从AudioToolbox访问OS X主音量

17

在我的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

1个回答

30

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

这是我从翻译关于如何通过编程方式更改Mac OS X系统音量以及10.6(Snow Leopard)后如何通过编程方式设置Mac OS X音量的答案中得到的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在评论中提到的那样,这也适用于通过传递相应参数来获取和设置左右平衡。

mSelector: kAudioHardwareServiceDeviceProperty_VirtualMasterBalance

AudioObjectPropertyAddress()函数。


太棒了,非常感谢。现在我看到了我用AudioDeviceId和kAudio...犯的错误。 - Peter Shaw
@zneak: 非常感谢您让我知道。我已经更新了Swift 4(和5)的代码。在我的项目中,即使是在Swift 5(Xcode 10.2 beta)中,只需导入AudioToolbox就足够了。 - Martin R
完美运行于Catalina 10.15.2,Swift 5和Xcode 11.3.1。 - user3069232
@duongel:抱歉,我不知道。 - Martin R
3
谢谢。我想补充一点,左右平衡也可以用相同的方式控制,只需要将 kAudioHardwareServiceDeviceProperty_VirtualMasterVolume 更改为 kAudioHardwareServiceDeviceProperty_VirtualMasterBalance。 @MartinR 请考虑将此注释添加到答案中。 - noamtm
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接