サンプルコード
# 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