5
OS Xの音量が変更されたときに私のアプリに通知する必要があります。これはiOS用ではなく、デスクトップアプリ向けです。この通知にはどのように登録できますか?音量の変更に関する通知を登録するにはどうすればよいですか?
OS Xの音量が変更されたときに私のアプリに通知する必要があります。これはiOS用ではなく、デスクトップアプリ向けです。この通知にはどのように登録できますか?音量の変更に関する通知を登録するにはどうすればよいですか?
一部のオーディオデバイスではマスターチャンネルがサポートされているため、これは少し難しいかもしれませんが、ほとんどの場合、ボリュームはチャンネルごとのプロパティになります。必要なものによっては、1つのチャンネルしか観察できず、デバイスがサポートしている他のすべてのチャンネルが同じ音量であると仮定します。かかわらず、あなたが見たいどのように多くのチャンネルの、あなたが質問にAudioObjectのプロパティリスナーを登録することで、ボリュームを守ってください。
// Some devices (but not many) support a master channel
AudioObjectPropertyAddress propertyAddress = {
kAudioDevicePropertyVolumeScalar,
kAudioDevicePropertyScopeOutput,
kAudioObjectPropertyElementMaster
};
if(AudioObjectHasProperty(deviceID, &propertyAddress)) {
OSStatus result = AudioObjectAddPropertyListener(deviceID, &propertyAddress, myAudioObjectPropertyListenerProc, self);
// Error handling omitted
}
else {
// Typically the L and R channels are 1 and 2 respectively, but could be different
propertyAddress.mElement = 1;
OSStatus result = AudioObjectAddPropertyListener(deviceID, &propertyAddress, myAudioObjectPropertyListenerProc, self);
// Error handling omitted
propertyAddress.mElement = 2;
result = AudioObjectAddPropertyListener(deviceID, &propertyAddress, myAudioObjectPropertyListenerProc, self);
// Error handling omitted
}
あなたのリスナーprocはのようなものでなければなりません:
static OSStatus
myAudioObjectPropertyListenerProc(AudioObjectID inObjectID,
UInt32 inNumberAddresses,
const AudioObjectPropertyAddress inAddresses[],
void *inClientData)
{
for(UInt32 addressIndex = 0; addressIndex < inNumberAddresses; ++addressIndex) {
AudioObjectPropertyAddress currentAddress = inAddresses[addressIndex];
switch(currentAddress.mSelector) {
case kAudioDevicePropertyVolumeScalar:
{
Float32 volume = 0;
UInt32 dataSize = sizeof(volume);
OSStatus result = AudioObjectGetPropertyData(inObjectID, ¤tAddress, 0, NULL, &dataSize, &volume);
if(kAudioHardwareNoError != result) {
// Handle the error
continue;
}
// Process the volume change
break;
}
}
}
}