使用Swift中的AudioToolbox访问OS X主卷

Pet*_*haw 8 macos cocoa audiotoolbox swift

有没有从我的Swift应用程序中设置系统主卷的解决方案?

我读了很多关于AudioToolbox的内容,并在Objective-C中阅读了一些源代码示例.例如,我发现这一点:在10.6之后以编程方式设置Mac OS X卷

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

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

Mar*_*n R 18

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

这是我通过编程方式将答案转换为更改OS X系统卷在10.6(Snow Leopard)之后编程方式设置Mac OS X卷到Swift(为简洁省略错误检查)所得到的:

所需框架:

import AudioToolbox
Run Code Online (Sandbox Code Playgroud)

获取默认输出设备:

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)
Run Code Online (Sandbox Code Playgroud)

设定量:

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)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

为简洁起见,省略了错误检查.当然,应该检查实际应用程序中成功或失败的状态返回值.

积分去设置在OS X中使用10.11雨燕OS X的体积,而不使用过时AudioHardwareServiceSetPropertyData API的使用AudioObjectSetPropertyData() ,而不是过时的AudioHardwareServiceSetPropertyData().

  • 谢谢你。我想补充一点,左右平衡也可以用同样的方式控制,只需将`kAudioHardwareServiceDeviceProperty_VirtualMasterVolume`更改为`kAudioHardwareServiceDeviceProperty_VirtualMasterBalance`即可。@MartinR 请考虑将此注释添加到答案中。 (3认同)