【发布时间】:2015-02-02 03:20:38
【问题描述】:
是否有解决方案可以在我的 Swift 应用中设置系统的主音量?
我阅读了很多有关 AudioToolbox 的内容并阅读了一些 Objective-C 中的源代码示例。例如,我发现了这个:Setting Mac OS X Volume Programatically after 10.6
但我无法让它在 Swift 中运行。
【问题讨论】:
标签: macos cocoa swift audiotoolbox
是否有解决方案可以在我的 Swift 应用中设置系统的主音量?
我阅读了很多有关 AudioToolbox 的内容并阅读了一些 Objective-C 中的源代码示例。例如,我发现了这个:Setting Mac OS X Volume Programatically after 10.6
但我无法让它在 Swift 中运行。
【问题讨论】:
标签: macos cocoa swift audiotoolbox
(为 Swift 4 及更高版本更新了代码,Swift 2 和 3 版本可以在编辑历史记录中找到。)
这是我将 Change OS X system volume programmatically 和 Setting 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()。
【讨论】:
CoreAudio,并且 kAudio 属性具有正确的类型。
kAudioHardwareServiceDeviceProperty_VirtualMasterVolume改为kAudioHardwareServiceDeviceProperty_VirtualMasterBalance即可。 @MartinR 请考虑将此注释添加到答案中。