如何获得计算机的当前音量?

ele*_*119 5 macos cocoa objective-c

如何从Cocoa API访问Mac的当前音量级别?

例如:当我在OS X 10.7上使用Spotify.app并且出现声音广告时,我关闭了Mac的音量,应用程序将暂停广告,直到我将其恢复到平均水平.我觉得这令人讨厌,并且违反了用户隐私,但Spotify已经找到了一种方法来做到这一点.

有什么方法可以用Cocoa做到这一点吗?我正在制作一个应用程序,如果音量很低,可能会对用户发出警告.

sbo*_*oth 9

有两种选择.第一步是确定您想要的设备并获取其ID.假设默认输出设备,代码将类似于:

AudioObjectPropertyAddress propertyAddress = { 
    kAudioHardwarePropertyDefaultOutputDevice, 
    kAudioObjectPropertyScopeGlobal, 
    kAudioObjectPropertyElementMaster 
};

AudioDeviceID deviceID;
UInt32 dataSize = sizeof(deviceID);
OSStatus result = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &dataSize, &deviceID);

if(kAudioHardwareNoError != result)
    // Handle the error
Run Code Online (Sandbox Code Playgroud)

接下来,您可以使用该kAudioHardwareServiceDeviceProperty_VirtualMasterVolume属性获取设备的虚拟主卷:

AudioObjectPropertyAddress propertyAddress = { 
    kAudioHardwareServiceDeviceProperty_VirtualMasterVolume, 
    kAudioDevicePropertyScopeOutput,
    kAudioObjectPropertyElementMaster 
};

if(!AudioHardwareServiceHasProperty(deviceID, &propertyAddress))
    // An error occurred

Float32 volume;
UInt32 dataSize = sizeof(volume);
OSStatus result = AudioHardwareServiceGetPropertyData(deviceID, &propertyAddress, 0, NULL, &dataSize, &volume);

if(kAudioHardwareNoError != result)
    // An error occurred
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用kAudioDevicePropertyVolumeScalar获取特定频道的音量:

UInt32 channel = 1; // Channel 0  is master, if available
AudioObjectPropertyAddress propertyAddress = { 
    kAudioDevicePropertyVolumeScalar, 
    kAudioDevicePropertyScopeOutput,
    channel 
};

if(!AudioObjectHasProperty(deviceID, &propertyAddress))
    // An error occurred

Float32 volume;
UInt32 dataSize = sizeof(volume);
OSStatus result = AudioObjectGetPropertyData(deviceID, &propertyAddress, 0, NULL, &dataSize, &volume);

if(kAudioHardwareNoError != result)
    // An error occurred
Run Code Online (Sandbox Code Playgroud)

Apple的文档解释了两者之间的区别:

kAudioHardwareServiceDeviceProperty_VirtualMasterVolume

Float32值,表示音量控件的值.此属性值的范围是0.0(静音)到1.0(完整级别).此属性的效果取决于与HAL音频对象关联的硬件设备.如果设备具有主音量控制,则此属性对其进行控制.如果设备具有单独的通道音量控制,则此属性适用于由设备首选多声道布局标识的设备,或者如果设备仅为立体声设备,则适用于首选立体声对.该控件保持其影响的通道之间的相对平衡.

因此,准确定义设备的音量可能很棘手,尤其是对于具有非标准频道映射的多声道设备.