Design Considerations for sAPO Development

If you want to develop your own sAPOs, be aware that all sAPOs must have similar characteristics to work with Windows Vista.

General Characteristics and Requirements

All system-supplied and custom sAPOs must have the following general characteristics:

  • An sAPO must have one input and one output connection. These connections are audio buffers and can have multiple channels.

  • An sAPO must have real-time compatibility. This means the following:

    All buffers that are processed by the sAPO must be nonpageable.

    All code and data in the process path must be nonpageable.

    All methods that are members of real-time interfaces must be implemented as nonblocking members. They must not block, use paged memory, or call any blocking system routines.

    Note Real-time interfaces are identified by an "RT" at the end of their name, such as IAudioProcessingObjectRT.

Real-time compatible sAPOs can be used in contexts that do not require real-time processing.
  • An sAPO can modify only the audio data that is passed to it through its IAudioProcessingObjectRT::APOProcess routine. The sAPO cannot change the settings of the underlying logical device, including its KS topology.

  • GFX sAPOs must process data by using a format with a fixed frame size. The frame size is specified by the audio engine. The format is static for both input and output.

  • GFX sAPOs should not introduce more than 10 ms of latency into the audio processing chain. An sAPO reports this latency through the IAudioProcessingObject::GetLatency API.

In addition to IUnknown, sAPOs must expose the following interfaces:

  • IAudioProcessingObject. An interface that handles setup tasks such as initialization and format negotiation.

  • IAudioProcessingObjectConfiguration. The configuration interface.

  • IAudioProcessingObjectRT. A real-time interface that handles audio processing. It can be called from a real-time processing thread.

  • IAudioSystemEffects. The interface that makes the audio engine recognize a DLL as an sAPO.

Important Custom sAPOs must not expose the IAudioProcessingObjectVBR interface.

For detailed information about the required interfaces, see the Audioenginebaseapo.h and Audioenginebaseapo.idl files in the WinDDK\<build number>\inc\API folder.

Design Tasks and Development Options

The following topics provide details about the two main tasks required for wrapping one or more system-supplied sAPOs and replacing the rest with custom sAPOs.

Wrapping system-supplied sAPOs

Replacing System-supplied sAPOs


Send comments about this topic to Microsoft