使用 Swift 的 AudioToolbox 访问 OS X 主音量 [英] Using AudioToolbox from Swift to access OS X master volume

查看:30
本文介绍了使用 Swift 的 AudioToolbox 访问 OS X 主音量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有解决方案可以在我的 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 系统得到的答案以编程方式设置Mac OS X在 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))让 status1 = AudioObjectGetPropertyData(AudioObjectID(kAudioObjectSystemObject),&getDefaultOutputDevicePropertyAddress,0,零,&defaultOutputDeviceIDSize,&defaultOutputDeviceID)

设置音量:

var volume = Float32(0.50)//0.0 ... 1.0var volumeSize = UInt32(MemoryLayout.size(ofValue: volume))var volumePropertyAddress = AudioObjectPropertyAddress(mSelector: kAudioHardwareServiceDeviceProperty_VirtualMasterVolume,mScope:kAudioDevicePropertyScopeOutput,mElement: kAudioObjectPropertyElementMaster)让 status2 = AudioObjectSetPropertyData(默认输出设备ID,&volumePropertyAddress,0,零,体积大小,&音量)

最后,为了完整起见,获取音量:

var volume = Float32(0.0)var volumeSize = UInt32(MemoryLayout.size(ofValue: volume))var volumePropertyAddress = AudioObjectPropertyAddress(mSelector: kAudioHardwareServiceDeviceProperty_VirtualMasterVolume,mScope:kAudioDevicePropertyScopeOutput,mElement: kAudioObjectPropertyElementMaster)让 status3 = AudioObjectGetPropertyData(默认输出设备ID,&volumePropertyAddress,0,零,&volumeSize,&音量)打印(卷)

为简洁起见,已省略错误检查.当然,在实际应用中应该检查状态返回值是成功还是失败.

学分转到使用 Swift 在 OS X 10.11 中设置 OS X 音量,而无需使用已弃用的 AudioHardwareServiceSetPropertyData API 来使用 AudioObjectSetPropertyData()而不是已弃用的 AudioHardwareServiceSetPropertyData().

正如 noamtm 在评论中提到的,这也适用于获取和设置左右平衡,通过传递

mSelector: kAudioHardwareServiceDeviceProperty_VirtualMasterBalance

AudioObjectPropertyAddress().

Is there a solution to setting the system's master volume from within my Swift app?

I read a lot about AudioToolbox and read some source examples in Objective-C. For example, I found this: Setting Mac OS X Volume Programatically after 10.6

But I can't get it working in 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

解决方案

(Code updated for Swift 4 and later, the Swift 2 and 3 versions can be found in the edit history.)

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):

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().

As noamtm mentions in the comments, this works also for getting and setting the left-right balance, by passing

mSelector: kAudioHardwareServiceDeviceProperty_VirtualMasterBalance

to AudioObjectPropertyAddress().

这篇关于使用 Swift 的 AudioToolbox 访问 OS X 主音量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆