2013-07-18 58 views
3

如何以编程方式从objective-c更改卷?以编程方式更改OS X系统卷

我发现这个问题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

我也尝试在address结构中使用值20,两者的结果相同。

我该如何解决这个问题,并将其实际降低到50%?

+0

您可以使用AppleScript轻松地做到这一点。 –

+0

@TBlue:是的,我知道,但我宁愿直接在Objective-C中做。 – houbysoft

+0

任何现在的见解? – hashier

回答

8

您需要首先获取默认的音频设备:

#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(主)似乎不被支持(设置命令返回'谁?')

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

我运行了开发人员工具附带的HALLab实用程序(即用于Xcode的音频工具)。这使您可以打开单个设备的信息窗口,该窗口有一个显示通知的选项卡。当我改变我的系统音量时,我确实发现,如Thomas O'Dell的答案所示,输出设备的每个通道的属性都会发生变化。但是,我也看到在主通道上更改属性kAudioHardwareServiceDeviceProperty_VirtualMasterVolume。这似乎更有希望,因为您不必为所有渠道手动设置它并保持它们之间的平衡。

您可以使用Audio Hardware Services的功能AudioHardwareServiceSetPropertyData()在默认输出设备上设置该功能。为了安全起见,您可以首先检查是否可以使用AudioHardwareServiceIsPropertySettable()进行设置。

为该属性文档说:

kAudioHardwareServiceDeviceProperty_VirtualMasterVolume

Float32值,表示音量控制的值。

范围为该属性的值是0.0(沉默)通过1.0(完全水平)。此属性的效果取决于与HAL音频对象关联的硬件设备。如果设备具有主音量控制,则此属性将控制它。如果设备具有单独的通道音量控制,则此属性适用于由设备的首选多通道布局标识的设备,或者如果设备仅为立体声,则适用于首选立体声对。此控件可维持其影响的频道之间的相对平衡。

0

您可以运行bash脚本,将改变主音量。这可以防止第一设置音频到一边:

静音:

execlp("osascript", "osascript", "-e", "set volume output muted true", NULL); 

更改卷(标度为0-10):

execlp("osascript", "osascript", "-e", "set volume 5", NULL); 
相关问题