Поделиться через


Метод IAudioProcessingObjectNotifications2::GetApoNotificationRegistrationInfo2 (audioengineextensionapo.h)

Вызывается системой, чтобы клиенты могли зарегистрироваться для получения обратных вызовов уведомлений для конечной точки APO и уведомлений о эффектах системы. Этот метод работает так же, как IAudioProcessingObjectNotifications::GetApoNotificationRegistrationInfo , с добавлением параметра, который можно использовать для определения типов уведомлений, поддерживаемых в версии Windows, работающей на текущем устройстве.

Синтаксис

HRESULT GetApoNotificationRegistrationInfo2(
        APO_NOTIFICATION_TYPE       maxApoNotificationTypeSupported,
  [out] APO_NOTIFICATION_DESCRIPTOR **apoNotifications,
  [out] DWORD                       *count
);

Параметры

maxApoNotificationTypeSupported

Значение из перечисления APO_NOTIFICATION_TYPE , указывающее наибольшее значение перечисления, поддерживаемое в версии Windows, работающей на текущем устройстве. Клиенты могут использовать оператор сравнения, чтобы определить, поддерживается ли определенный тип уведомлений.

[out] apoNotifications

Выходной параметр, возвращающий указатель на массив APO_NOTIFICATION_DESCRIPTOR указывающий набор изменений APO, для которых запрашиваются уведомления.

[out] count

Выходной параметр, указывающий количество элементов, возвращаемых в apoNotifications.

Возвращаемое значение

Hresult.

Комментарии

В следующем примере показана типичная реализация GetAppNotificationRegistrationInfo2. В примере проверяется значение параметра maxApoNotificationTypeSupported , чтобы определить, поддерживаются ли нужные уведомления в версии Windows, работающей на текущем устройстве. и, если да, регистрируется для этих уведомлений.

STDMETHODIMP SampleApo::GetApoNotificationRegistrationInfo2(
    UINT32 maxApoNotificationTypeSupported,
    APO_NOTIFICATION_DESCRIPTOR** apoNotificationDescriptorsReturned,
    DWORD* count)
{

    *apoNotificationDescriptorsReturned = nullptr;
    
    *count = 0;
    
    // Before this function can be called, our m_device member variable should already have been initialized.
    // This would typically be done in our implementation of IAudioProcessingObject::Initialize, by using
    // APOInitSystemEffects3::pDeviceCollection to obtain the last IMMDevice in the collection.
    
    RETURN_HR_IF_NULL(E_FAIL, m_device);
    
    if(maxApoNotificationTypeSupported >= APO_NOTIFICATION_TYPE_MICROPHONE_BOOST)
    {
    
        // Let the OS know what notifications we are interested in by returning an array of
        // APO_NOTIFICATION_DESCRIPTORs.
        constexpr DWORD numDescriptors = 3;
        wil::unique_cotaskmem_ptr<APO_NOTIFICATION_DESCRIPTOR[]> apoNotificationDescriptors;
        apoNotificationDescriptors.reset(static_cast<APO_NOTIFICATION_DESCRIPTOR*>(
        CoTaskMemAlloc(sizeof(APO_NOTIFICATION_DESCRIPTOR) * numDescriptors)));
        RETURN_IF_NULL_ALLOC(apoNotificationDescriptors);
        
        // Our APO wants to get notified when the volume level changes on the audio endpoint.
        // The APO_NOTIFICATION_DESCRIPTOR::audioEndpointVolume element is used to specify the audio
        // endpoint for both the APO_NOTIFICATION_TYPE_ENDPOINT_VOLUME and the
        // APO_NOTIFICATION_TYPE_ENDPOINT_VOLUME2 notifications.
        apoNotificationDescriptors[0].type = APO_NOTIFICATION_TYPE_ENDPOINT_VOLUME2;
        (void)m_device.query_to(&apoNotificationDescriptors[0].audioEndpointVolume.device);
        
        // Our APO also wants to get notified when the orientation of the device changes.
        apoNotificationDescriptors[1].type = APO_NOTIFICATION_TYPE_DEVICE_ORIENTATION;
        
        // Our APO also wants to get notified when the microphone boost changes on the audio endpoint.
        apoNotificationDescriptors[2].type = APO_NOTIFICATION_TYPE_MICROPHONE_BOOST;
        (void)m_device.query_to(&apoNotificationDescriptors[2].audioMicrophoneBoost.device);
        
        // The OS will immediately fire a notification for the above notification types, so we do not
        // need to query the OS for the current values.
        
        *apoNotificationDescriptorsReturned = apoNotificationDescriptors.release();
        *count = numDescriptors;
    
    }
    else
    {
        // If we get here, the APO is running on an older version of Windows that does not support the
        // APO_NOTIFICATION_TYPE_ENDPOINT_VOLUME2, APO_NOTIFICATION_TYPE_DEVICE_ORIENTATION, and
        // APO_NOTIFICATION_TYPE_MICROPHONE_BOOST notifications. What the APO does at this point is
        // implementation-specific. For example, the APO may choose to subscribe to the
        // APO_NOTIFICATION_TYPE_ENDPOINT_VOLUME notification instead of
        // APO_NOTIFICATION_TYPE_ENDPOINT_VOLUME2.
    }
    
    return S_OK;

}

В версиях Windows до 22621 Windows будет вызывать только метод IAudioProcessingObjectNotifications::GetApoNotificationRegistrationInfo, а не метод iAudioProcessingObjectNotifications2. Так как самый высокий поддерживаемый тип уведомлений в версиях Windows до 22621 был APO_NOTIFICATION_TYPE_SYSTEM_EFFECTS_PROPERTY_CHANGE, APO, который должен работать в версиях 22621 и более ранних, может упростить свой код, используя следующую реализацию для IAudioProcessingObjectNotifications::GetApoNotificationRegistrationInfo.

STDMETHODIMP SampleApo::GetApoNotificationRegistrationInfo(
    APO_NOTIFICATION_DESCRIPTOR** apoNotificationDescriptorsReturned,
    DWORD* count)
{
    // When the OS invokes GetApoNotificationRegistrationInfo, it implies that the maximum notification value
    // that is supported is APO_NOTIFICATION_TYPE_SYSTEM_EFFECTS_PROPERTY_CHANGE.
    GetApoNotificationRegistrationInfo2(APO_NOTIFICATION_TYPE_SYSTEM_EFFECTS_PROPERTY_CHANGE, apoNotificationDescriptorsReturned, count);
    
    return S_OK;
}

Дополнительные сведения об API-интерфейсах Windows 11 для объектов обработки звука (APOs), которые могут поставляться с аудиодрайверами, см. в статье Windows 11 API для объектов обработки звука.

Требования

Требование Значение
Минимальная версия клиента Сборка Windows 22621
Верхняя часть audioengineextensionapo.h