macos - 使用 Swift 中的 AudioToolbox 访问 OS X 主音量

标签 macos cocoa swift audiotoolbox

是否有在我的 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 中遗漏了一些示例代码

最佳答案

(代码更新为 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在评论中提到,这也适用于通过传递来获取和设置左右平衡

mSelector: kAudioHardwareServiceDeviceProperty_VirtualMasterBalance

AudioObjectPropertyAddress()

关于macos - 使用 Swift 中的 AudioToolbox 访问 OS X 主音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27290751/

相关文章:

javascript - node.js 要求找不到自定义模块

objective-c - 在 Cocoa AppKit 中平滑地拉伸(stretch) PNG

ios - Swift 2.0 'unexpected trailing closure' 惰性变量分配错误

objective-c - 使用本地化字典值对 NSArray 进行排序

objective-c - 如何在 Cocoa 中从不同的音频文件创建同时播放的音频堆栈?

swift - 为什么 Enum 作为协议(protocol)要求中的可选行为表现得很奇怪?

swift - 如何更改 DispatchTimeInterval 以获得成员毫秒

macos - 缺少标题 tiffio.h 在 Mac OS X 上安装 Pillow

c++ - 如何在 OSX 上将静态 C++ 函数声明为友元

objective-c - 自定义 NSTextView insertText :replacementRange breaks Spell Checking