2011-07-19 13 views

答えて

9

一部のオーディオデバイスではマスターチャンネルがサポートされているため、これは少し難しいかもしれませんが、ほとんどの場合、ボリュームはチャンネルごとのプロパティになります。必要なものによっては、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, &currentAddress, 0, NULL, &dataSize, &volume); 

       if(kAudioHardwareNoError != result) { 
        // Handle the error 
        continue; 
       } 

       // Process the volume change 

       break; 
      } 
     } 
    } 
} 
関連する問題