简体   繁体   English

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

[英]Using AudioToolbox from Swift to access OS X master volume

Is there a solution to setting the system's master volume from within my Swift app?是否有解决方案可以在我的 Swift 应用程序中设置系统的主音量?

I read a lot about AudioToolbox and read some source examples in Objective-C.我阅读了很多关于 AudioToolbox 的内容,并阅读了一些 Objective-C 中的源代码示例。 For example, I found this: Setting Mac OS X Volume Programatically after 10.6例如,我发现了这个: Setting Mac OS X Volume Programatically after 10.6

But I can't get it working in Swift.但我不能让它在 Swift 中工作。

I am missing some example code in https://developer.apple.com/library/mac/documentation/AudioToolbox/Reference/AudioHardwareServicesReference/index.html#//apple_ref/c/func/AudioHardwareServiceGetPropertyData我在https://developer.apple.com/library/mac/documentation/AudioToolbox/Reference/AudioHardwareServicesReference/index.html#//apple_ref/c/func/AudioHardwareServiceGetPropertyData 中缺少一些示例代码

(Code updated for Swift 4 and later, the Swift 2 and 3 versions can be found in the edit history.) (为 Swift 4 及更高版本更新了代码,Swift 2 和 3 版本可以在编辑历史中找到。)

This is what I got from translating the answers to Change OS X system volume programmatically and Setting Mac OS X volume programmatically after 10.6 (Snow Leopard) to Swift (error checking omitted for brevity):这是我通过将答案翻译为以编程方式更改 OS X 系统音量在 10.6 (Snow Leopard)到 Swift 之后以编程方式设置 Mac OS X 音量(为简洁起见省略错误检查)中得到的:

Required framework:所需框架:

import AudioToolbox

Get default output device:获取默认输出设备:

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)

Set volume:设置音量:

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)

Finally, for the sake of completeness, get the 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)

Error checking has been omitted for brevity.为简洁起见,已省略错误检查。 Of course one should check the status return values for success or failure in a real application.当然,在实际应用中应该检查状态返回值是否成功。

Credits go to Set OS X volume in OS X 10.11 using Swift without using the deprecated AudioHardwareServiceSetPropertyData API for using AudioObjectSetPropertyData() instead of the deprecated AudioHardwareServiceSetPropertyData() .积分转到使用 Swift 在 OS X 10.11 中设置 OS X 音量,而不使用已弃用的 AudioHardwareServiceSetPropertyData API来使用AudioObjectSetPropertyData()而不是已弃用的AudioHardwareServiceSetPropertyData()

As noamtm mentions in the comments, this works also for getting and setting the left-right balance, by passing正如noamtm在评论中提到的,这也适用于通过传递获取和设置左右平衡

mSelector: kAudioHardwareServiceDeviceProperty_VirtualMasterBalance

to AudioObjectPropertyAddress() .AudioObjectPropertyAddress()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM