在我的Swift应用程序内部设置系统主音量有解决方案吗?
我阅读了很多关于AudioToolbox的文章,并阅读了一些Objective-C的源代码示例。例如,我找到了这个:Setting Mac OS X Volume Programatically after 10.6
但我无法在Swift中使其工作。
在我的Swift应用程序内部设置系统主音量有解决方案吗?
我阅读了很多关于AudioToolbox的文章,并阅读了一些Objective-C的源代码示例。例如,我找到了这个:Setting Mac OS X Volume Programatically after 10.6
但我无法在Swift中使其工作。
(代码已更新为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()
函数。
kAudioHardwareServiceDeviceProperty_VirtualMasterVolume
更改为kAudioHardwareServiceDeviceProperty_VirtualMasterBalance
。 @MartinR 请考虑将此注释添加到答案中。 - noamtm