2011-07-19 17 views

Odpowiedz

9

Może to być trochę trudne, ponieważ niektóre urządzenia audio obsługują kanał główny, ale większość tak nie robi, że głośność będzie właściwością dla jednego kanału. W zależności od tego, co musisz zrobić, możesz obserwować tylko jeden kanał i założyć, że wszystkie inne kanały obsługiwane przez urządzenie mają taką samą głośność. Niezależnie od tego, ile kanałów chcesz oglądać, można zaobserwować głośność rejestracji nieruchomość słuchacza do AudioObject w pytaniu:

// 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 
} 

Twój słuchacz proc powinno być coś jak:

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; 
      } 
     } 
    } 
} 
Powiązane problemy