ele*_*119 5 macos cocoa objective-c
如何从Cocoa API访问Mac的当前音量级别?
例如:当我在OS X 10.7上使用Spotify.app并且出现声音广告时,我关闭了Mac的音量,应用程序将暂停广告,直到我将其恢复到平均水平.我觉得这令人讨厌,并且违反了用户隐私,但Spotify已经找到了一种方法来做到这一点.
有什么方法可以用Cocoa做到这一点吗?我正在制作一个应用程序,如果音量很低,可能会对用户发出警告.
有两种选择.第一步是确定您想要的设备并获取其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音频对象关联的硬件设备.如果设备具有主音量控制,则此属性对其进行控制.如果设备具有单独的通道音量控制,则此属性适用于由设备首选多声道布局标识的设备,或者如果设备仅为立体声设备,则适用于首选立体声对.该控件保持其影响的通道之间的相对平衡.
因此,准确定义设备的音量可能很棘手,尤其是对于具有非标准频道映射的多声道设备.
| 归档时间: |
|
| 查看次数: |
4409 次 |
| 最近记录: |