如何以编程方式从Objective-C更改音量?
我发现了这个问题 Controlling OS X volume in Snow Leopard ,建议这样做:
Float32 volume = 0.5;
UInt32 size = sizeof(Float32);
AudioObjectPropertyAddress address = {
kAudioDevicePropertyVolumeScalar,
kAudioDevicePropertyScopeOutput,
1 // Use values 1 and 2 here, 0 (master) does not seem to work
};
OSStatus err;
err = AudioObjectSetPropertyData(kAudioObjectSystemObject, &address, 0, NULL, size, &volume);
NSLog(@"status is %i", err);
这对我没有任何意义,并打印出status is 2003332927
。
我还尝试在2
结构中使用值0
和address
,两者的结果相同。
如何解决此问题并使其实际将音量降低至50%?
答案 0 :(得分:9)
您需要先获取默认音频设备:
#import <CoreAudio/CoreAudio.h>
AudioObjectPropertyAddress getDefaultOutputDevicePropertyAddress = {
kAudioHardwarePropertyDefaultOutputDevice,
kAudioObjectPropertyScopeGlobal,
kAudioObjectPropertyElementMaster
};
AudioDeviceID defaultOutputDeviceID;
UInt32 volumedataSize = sizeof(defaultOutputDeviceID);
OSStatus result = AudioObjectGetPropertyData(kAudioObjectSystemObject,
&getDefaultOutputDevicePropertyAddress,
0, NULL,
&volumedataSize, &defaultOutputDeviceID);
if(kAudioHardwareNoError != result)
{
// ... handle error ...
}
然后,您可以在通道1(左)和通道2(右)上设置音量。请注意,似乎不支持通道0(主站)(set命令返回'who?')
AudioObjectPropertyAddress volumePropertyAddress = {
kAudioDevicePropertyVolumeScalar,
kAudioDevicePropertyScopeOutput,
1 /*LEFT_CHANNEL*/
};
Float32 volume;
volumedataSize = sizeof(volume);
result = AudioObjectSetPropertyData(defaultOutputDeviceID,
&volumePropertyAddress,
0, NULL,
sizeof(volume), &volume);
if (result != kAudioHardwareNoError) {
// ... handle error ...
}
希望这能回答你的问题!
答案 1 :(得分:1)
我运行了开发人员工具附带的HALLab实用程序(即Xcode的Audio Tools)。这允许您打开单个设备的信息窗口,该窗口有一个显示通知的选项卡。当我更改系统音量时,我确实看到了输出设备的每个通道的kAudioDevicePropertyVolumeScalar
属性发生变化,正如Thomas O'Dell的回答所暗示的那样。但是,我也看到主通道上的属性kAudioHardwareServiceDeviceProperty_VirtualMasterVolume
发生了变化。这似乎更有希望,因为您不必为所有通道手动设置它并保持它们之间的平衡。
您可以使用Audio Hardware Services中的AudioHardwareServiceSetPropertyData()
函数在默认输出设备上设置该函数。为安全起见,您可以先使用AudioHardwareServiceIsPropertySettable()
检查它是否可设置。
该属性的文档说:
kAudioHardwareServiceDeviceProperty_VirtualMasterVolume
表示音量控件值的
Float32
值。此属性值的范围是0.0(静音)到1.0(完整级别)。此属性的效果取决于与HAL音频对象关联的硬件设备。如果设备具有主音量控制,则此属性对其进行控制。如果设备具有单独的通道音量控制,则此属性适用于由设备首选多声道布局标识的设备,或者如果设备仅为立体声设备,则适用于首选立体声对。该控件保持其影响的通道之间的相对平衡。
答案 2 :(得分:0)
您可以运行将更改主卷的bash脚本。这可以防止首先将音频设置为一侧:
静音:
execlp("osascript", "osascript", "-e", "set volume output muted true", NULL);
更改音量(音阶0-10):
execlp("osascript", "osascript", "-e", "set volume 5", NULL);