有没有从我的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中遗漏了一些示例代码
(代码更新为Swift 4及更高版本,Swift 2和3版本可在编辑历史记录中找到.)
这是我通过编程方式将答案转换为更改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)
为简洁起见,省略了错误检查.当然,应该检查实际应用程序中成功或失败的状态返回值.
积分去设置在OS X中使用10.11雨燕OS X的体积,而不使用过时AudioHardwareServiceSetPropertyData API的使用AudioObjectSetPropertyData()
,而不是过时的AudioHardwareServiceSetPropertyData()
.