サンプルコード
#import <CoreAudio/CoreAudio.h>
#import <AudioToolbox/AudioToolbox.h>
// デフォルトのサウンド出力デバイスを目標に設定
AudioObjectPropertyAddress addr;
addr.mSelector = kAudioHardwarePropertyDefaultOutputDevice;
addr.mScope = kAudioObjectPropertyScopeGlobal;
addr.mElement = kAudioObjectPropertyElementMaster;
// アドレスを元にデバイスIDを取得
AudioDeviceID outputDeviceID;
UInt32 size = sizeof(AudioDeviceID);
OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &addr, 0, NULL, &size, &outputDeviceID);
if (err == noErr) {
// デバイスの出力マスター音量を目標に設定
AudioObjectPropertyAddress addr;
addr.mSelector = kAudioHardwareServiceDeviceProperty_VirtualMasterVolume;
addr.mScope = kAudioObjectPropertyScopeOutput;
addr.mElement = kAudioObjectPropertyElementMaster;
Float32 volume;
// 音量を取得
AudioObjectGetPropertyData(outputDeviceID, &addr, 0, NULL, &size, &volume);
NSLog(@"volume: %lf", volume);
// 音量を設定
size = sizeof(Float32);
volume = 0.1;
AudioObjectSetPropertyData(outputDeviceID, &addr, 0, NULL, size, &volume);
}
CoreAudioはC風のAPIなのでObjCで書いたけど、Swiftでも(UnsafePointer
を駆使することになるが)できないことはないはず。
解説
サウンドデバイスはCore AudioではAudioDeviceID
によって表される。これはAudioObject
の一種で、AudioObject
を対象とする様々な関数の引数として渡すことができる。
AudioObject
のプロパティの取得・設定にはAudioObjectGetPropertyData
とAudioObjectSetPropertyData
という関数を使う。これらの関数にはAudioObject
のどのプロパティを対象とするかをAudioObjectPropertyAddress
というデータを渡すことで指定する。これは3つのフィールドを持つ構造体である(それぞれのフィールドについての詳しい説明についてはヘッダファイルCoreAudio/AudioHardwareBase.h
を参照のこと)。
kAudioHardwareServiceDeviceProperty_VirtualMasterVolume
はAudioToolboxのAudio Hardware Serviceで提供されている。他にもkAudioHardwareServiceDeviceProperty_VirtualMasterBalance
(ステレオ機器の左右の出力バランス)が設定できる。
備考
- 情報が少なくて苦労したが、Audio MIDI設定でできるなら方法があるはずだと信じて探したらなんとかなった
-
AudioObjectGetPropertyData
とAudioHardwareServiceGetPropertyData
は何か違うんだろうか? AHSには制限があるらしいが……
参考
OS Xでのマイク入力キャプチャ Swift版
macOSX10.6AudioVolumeいじいじ - のんべんだらりぃ~ for MacBook
HALExamples: ConfigDefaultOutput.c