2013-07-18 60 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); 
相關問題