2013-07-18 4 views
3

목표를 -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을 출력합니다.

또한 20 구조를 address 구조로 사용하여 동일한 결과를 얻으려고 시도했습니다.

어떻게 수정하면 실제로 볼륨을 50 %로 줄일 수 있습니까?

+0

당신은 애플 스크립트로 쉽게 할 수있는이 한쪽으로 먼저 오디오 설정을 방지 할 수 있습니다. –

+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 (마스터)이 지원되지 않는 것 같습니다 (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

개발자 도구 (예 : Xcode 용 오디오 도구)와 함께 제공되는 HALLab 유틸리티를 실행했습니다. 이를 통해 개별 장치에 대한 정보 창을 열 수 있으며 해당 창에는 알림을 표시하는 탭이 있습니다. 시스템 볼륨을 변경할 때 실제로 출력 장치의 각 채널에 대해 kAudioDevicePropertyVolumeScalar 속성이 Thomas O'Dell의 대답에서 알 수 있듯이 변경되었음을 알 수 있습니다. 그러나 마스터 채널에서 kAudioHardwareServiceDeviceProperty_VirtualMasterVolume 속성이 변경되었습니다. 이는 모든 채널에 대해 수동으로 설정하지 않고도 균형을 유지할 수 있으므로 훨씬 더 유망한 것으로 보입니다.

AudioHardwareServiceSetPropertyData()에서 Audio Hardware Services까지의 기능을 사용하여 기본 출력 장치에서 설정하십시오. 안전을 위해 먼저 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); 
관련 문제