Requirements
--------------------

1)  The SAD client interface needs a simple mechanism for legacy support to
    hook up to the "default" or "main" audio renderer/capturer.  Redbook, SB
    and mpu401 emulation will normally use this mechanism.

2)  The SAD client interface also needs a broader interface that allows 
    the selection/query of renderer(s)/capturer(s) endpoints and other
    properties like h/w vs s/w acceleration, 3D audio, etc to be set. The
    mmsystem api and dsound support need this.  The clients will have more
    choices available regarding endpoints and paths thru the possible graphs.

3)  The SAD client interface provides as many pin instances and data formats
    as possible given the current collection of filters.  The SAD client
    interface changes as filters come and go; it isn't fixed to a predetermined
    set of data formats, interfaces, etc.  The SAD will insert a mixer into
    the output graph before the last instance of renderer's pin is used.

4)  SAD supports multiple renderer/capturer filters.

5)  SAD supports multiple renderers, capturers or converters within
    a single filter.

6)  SAD supports h/w "almost arbitrary" renderer/capturer filters.  USB, 1394
    and other PNP hardware devices can come and go.  There will still have
    to be some limits.

7)  SAD supports s/w "almost arbitrary" renderer/capturer filters.  DirectMusic,
    TAPI, and ISVs will want to add special software renderer/capturer.

8)  SAD supports multiple "almost arbitrary" s/w converter filters. ISVs will
    to provide support (via filters) other data formats (like OPL2/OPK3 or
    ADPCM) not covered by our filters.

9)  SAD supports multiple "almost arbitrary" h/w converter filters. OEMs will
    want to provide h/w mixing, SRC, MIDI, etc. converters.

10) Because h/w filters can come and go, need to support closing a running
    graph from SAD down.  There is still a question of whether we ignores
    the requests from the SAD client or return an error until the h/w returns.

11) A communication sink to sink converter filter is needed.  Streaming class
    h/w converters have sink inputs and sink outputs.  This filter is needed
    to connect to the mixer's sink input.  May also need a sink to source
    converter for putting a converter in the input graph.

12) A KSINTERFACE_MEDIA_WAVE_QUEUED to KSINTERFACE_STANDARD_PACKETSTREAMING
    interface converter is needed.  The mmsystem legacy support needs this
    to connect to renderers, mixers or swmidi that only support packet
    streaming.

13) SAD loads s/w filters only when needed by a client.  We do not want unused
    filters wasting memory.

14) A user configurable option to disable any filter (h/w or s/w, 
    renderer/capturer or converter).  ISVs program will need exclusive
    access (hopefully through ActiveMovie) to certain devices.

15) Need a property on renderer to get the "preferred" data format (sample rate,
    number of channels, bits per sample).  SB cards use up more CPU as the
    rates/channels/bits increase where for USB speakers don't use more CPU.

16) User configurable preferences - sound quality vs CPU cycles, default
    main endpoint, high quality SRC on/off, etc.

17) Support an AEC filter on input. This requires inserting a splitter after
    the mixer or a reference pin on renderer on the "related" output device.

18) A stream splitter is needed for AEC. It is basically converts one input
    pin instance to multiple output pin instances.  The splitter could split
    any data format.

19) Topology SAD pin to support the mmsystem topology api.

20) Add an arbitrary filter before the mixer on the SAD client's path to mixer.

21) Add an arbitrary filter after the mixer.  Do we need this?


Restrictions
------------

1) h/w filters can not change their configuration (number of pins, formats on
   the pins, maximum number of instances available on a pin, etc.) between PNP
   events.

2) s/w filters configuration (number of pins, formats on the pins, maximum 
   number of instances available on a pin, etc.) is fixed.  This is so we
   can either get this information from the registry without loading the
   driver or during initialization loading the driver, query and save the
   properties, and then unload the driver.

   The PNP software filter enumerator may help in allowing s/w filters to be
   more dynamic.

3) h/w filters must present enough information via the pin properties
   (DataRanges, DataRouting, Interfaces, Transform type, etc.) to determine
   if is a renderer/capturer or a converter, i.e. can not get any information 
   from the registry. SIPC.

4) Filters must have a valid (no invalid node numbers, no loops) topology 
   for SAD to use in a graph.

5) Filters must have at least one topology node if any transform is 
   done. Devices like pass data straight through like MPU401 don't 
   need a topology node.

6) SAD only searches for the following device class associations:

    KSCATEGORY_BRIDGE
    KSCATEGORY_RENDER
    KSCATEGORY_CAPTURE
    KSCATEGORY_MIXER
    KSCATEGORY_DATATRANSFORM
    KSCATEGORY_INTERFACETRANSFORM
    KSCATEGORY_MEDIUMTRANSFORM
    KSCATEGORY_DATACOMPRESSOR
    KSCATEGORY_DATADECOMPRESSOR

7) Renderers and Capturers must have bridge pins.

8) Sysaudio assumes that properties, etc. can be sent to all nodes through
   any sink pin handle.  Splitters are not supported.


Rules
-----

1) Mixers are only inserted into output graphs (to renderers).  Kmixer may
   be inserted into an input graph for sample rate conversion.

2) Splitters are only connected between the mixer (output pin) and
   renderer (input pin).

3) Echo cancelers are only connected between the capturer (output pin) and
   SAD output pin.


Todo
----

Replace DLS hack in SWMIDI with something more efficient.

Make more code pageable in SWMIDI.

Wait or cancel pending IRPs on pin close - this can cause gpfs when swmidi is closed.

SWMIDI should not forward IRPs and doesn't need to reserve the extra IRP stack location.

Convert the midi input pin to STREAMING interface (and mmsystem/wdmaud/sbemul will also have to change).  The current interface isn't KS correct.



Use the new PNP notifications and class associations.

Use the "data intersection" property in sysaudio driver.

Fix or inspect all the BUGBUG's in sysaudio driver.

The list enumerate functions are being used to destroy nodes with the 
assumption that the link in the node (usually leNext) is at the beggining
of the node.

Race conditions getting cPinInstances and doing the pin connect.

Filter instances counts. H/W converters may have limits on number of instances.

Kmixer should tell me that (via topology or some property) that could pre-mix
like sample rates.  Maybe it could show up as three different mixers (via the
shingle name): one main 44.1 mixer, one 11k mixer and one 22k mixer.


Questions
---------

What is KSPRIORITY and how it is used?

Need to define limits on what SAD can handle from a USB, etc. device because
USB is so general (too general for Memphis).

Implement BASIC_SUPPORT and RELATIONS properties?