Walking the IDeviceTopology tree to see audio driver settings

I’ve blogged before about using the IDeviceTopology API to poke around the internal structure exposed by audio drivers.

In particular, given an audio endpoint, you can map out all the knobs and widgets of all the signal paths that feed into that endpoint (for playback) or out of it (for recording.)

A version of this has been floating around the forums for some years, but I thought I would spiffy it up a little and make a blog post out of it.

Pseudocode:

for each endpoint exposed by IMMDeviceEnumerator:
figure out whether it’s a playback endpoint or a recording endpoint
find the IPart which is
the very end of the signal path for a playback endpoint, or
the very beginning for a recording endpoint:
if the IPart advertises jack information, query it
if the IPart is a volume control, query the range and the current setting
if the IPart is a mute control, query the current setting
(we could continue here for various other kinds of controls, but I’m lazy)
for all parts which
feed in to the IPart for a playback endpoint, or
are fed by the IPart for a recording endpoint:
recursively process that IPart
if the IPart is a connector:
find the IPart on the other side of the connection
process it recursively
take care not to immediately hop back to this graph!

Output:

>devicetopology.exe
eRender endpoint
Name: Speakers (High Definition Audio Device)
Endpoint ID: {0.0.0.00000000}.{351933db-e9b5-41df-8fa5-69c3d84531df}
0x10000:
{2}.\?hdaudio#func_01&ven_10ec&dev_0262&subsys_103c1309&rev_1002#4&12f2dd06&0&0001#{6994ad04-93ef-11d0-a3cc-00a0c9223196}elineouttopo
0x10001: Speakers
Jacks: 1
— Jack 1 —
ChannelMapping: 0x3
Color: 0x00ff00 (red = 0, green = 255, blue = 0)
Connection Type: 1 (eConnType3Point5mm)
Geometric Location: 1 (eGeoLocRear)
General Location: 0 (eGenLocPrimaryBox)
Port Connection: 0 (ePortConnJack)
IsConnected: No
0x20001: Master Mute
0x20000: Speakers
0x10000:
{0.0.1.00000000}.{6dd94b4a-90d7-4ddc-926d-69312eb53841}
0x10000:

eRender endpoint
Name: Speakers (High Definition Audio Device)
Endpoint ID: {0.0.0.00000000}.{6ce8bdf4-d22f-4ec7-a007-2228540b6705}
0x10000:
{2}.\?hdaudio#func_01&ven_10ec&dev_0262&subsys_103c1309&rev_1002#4&12f2dd06&0&0001#{6994ad04-93ef-11d0-a3cc-00a0c9223196}elineout2topo
0x10001: Speakers
Jacks: 1
— Jack 1 —
ChannelMapping: 0x3
Color: 0x000000 (red = 0, green = 0, blue = 0)
Connection Type: 3 (eConnTypeAtapiInternal)
Geometric Location: 13 (eGeoLocATAPI)
General Location: 0 (eGenLocPrimaryBox)
Port Connection: 1 (ePortConnIntegratedDevice)
IsConnected: Yes
0x20001: Master Mute
Mute node: MUTED
0x20000: Speakers
Channel 0 volume, -46.5 dB to 0 dB in steps of 1.5 dB: -6 dB
0x10000:
{2}.\?hdaudio#func_01&ven_10ec&dev_0262&subsys_103c1309&rev_1002#4&12f2dd06&0&0001#{6994ad04-93ef-11d0-a3cc-00a0c9223196}elineout2wave
0x10001:
0x20000: HD Audio line out
0x10000: PC Speaker

eRender endpoint
Name: Speakerphone (USB Audio Device)
Endpoint ID: {0.0.0.00000000}.{916afdff-2ba3-4a7f-bca9-0bf75c47c946}
0x10000:
{2}.\?usb#vid_095d&pid_0005&mi_00#7&335bfb1&0&0000#{6994ad04-93ef-11d0-a3cc-00a0c9223196}global
0x10003: Speakerphone
0x20009: DAC
0x20008: Volume
Channel 0 volume, -30.0039 dB to 0 dB in steps of 0.5 dB: -17.747 dB
0x20007: Mute
Mute node: NOT MUTED
0x20006: Sample Rate Converter
0x10000:

eCapture endpoint
Name: Microphone (High Definition Audio Device)
Endpoint ID: {0.0.1.00000000}.{38178e43-ed21-4731-b8f0-1330c3b1cd0a}
0x10000:
{2}.\?hdaudio#func_01&ven_10ec&dev_0262&subsys_103c1309&rev_1002#4&12f2dd06&0&0001#{6994ad04-93ef-11d0-a3cc-00a0c9223196}emixedcapturetopo
0x10001: Microphone
Jacks: 1
— Jack 1 —
ChannelMapping: 0x0
Color: 0xff80c0 (red = 255, green = 128, blue = 192)
Connection Type: 1 (eConnType3Point5mm)
Geometric Location: 1 (eGeoLocRear)
General Location: 0 (eGenLocPrimaryBox)
Port Connection: 0 (ePortConnJack)
IsConnected: No
0x20001: Microphone
0x20002: Microphone
0x20003: Microphone Boost
0x20000: Sum
0x10000:
{0.0.0.00000000}.{f7bf26d7-89a3-4049-8cd3-8148a6615565}
0x10000:

eCapture endpoint
Name: Speakerphone (USB Audio Device)
Endpoint ID: {0.0.1.00000000}.{a21f51bc-5d0b-47af-93b6-ef9a968bb8ff}
0x10000:
{2}.\?usb#vid_095d&pid_0005&mi_00#7&335bfb1&0&0000#{6994ad04-93ef-11d0-a3cc-00a0c9223196}global
0x10002: Speakerphone
0x20000: ADC
0x20001: Mute
Mute node: NOT MUTED
0x20002: Volume
Channel 0 volume, 0 dB to 32 dB in steps of 0.5 dB: 29 dB
0x20003: SuperMix
0x20004:
0x20005: Sample Rate Converter
0x10001:

eCapture endpoint
Name: Microphone (High Definition Audio Device)
Endpoint ID: {0.0.1.00000000}.{a9d04431-a99f-4ebe-b995-33f0d027559c}
0x10000:
{2}.\?hdaudio#func_01&ven_10ec&dev_0262&subsys_103c1309&rev_1002#4&12f2dd06&0&0001#{6994ad04-93ef-11d0-a3cc-00a0c9223196}emixedcapturetopo
0x10002: Microphone
Jacks: 1
— Jack 1 —
ChannelMapping: 0x0
Color: 0x000000 (red = 0, green = 0, blue = 0)
Connection Type: 1 (eConnType3Point5mm)
Geometric Location: 2 (eGeoLocFront)
General Location: 0 (eGenLocPrimaryBox)
Port Connection: 0 (ePortConnJack)
IsConnected: No
0x20004: Microphone
0x20005: Microphone
0x20006: Microphone Boost
0x20000: Sum
0x10000:
{0.0.0.00000000}.{f7bf26d7-89a3-4049-8cd3-8148a6615565}
0x10000:

eCapture endpoint
Name: Line In (High Definition Audio Device)
Endpoint ID: {0.0.1.00000000}.{bbf7eb42-7674-4a35-ad02-b723ea047dac}
0x10000:
{2}.\?hdaudio#func_01&ven_10ec&dev_0262&subsys_103c1309&rev_1002#4&12f2dd06&0&0001#{6994ad04-93ef-11d0-a3cc-00a0c9223196}emixedcapturetopo
0x10003: Line In
Jacks: 1
— Jack 1 —
ChannelMapping: 0x0
Color: 0x0000ff (red = 0, green = 0, blue = 255)
Connection Type: 1 (eConnType3Point5mm)
Geometric Location: 1 (eGeoLocRear)
General Location: 0 (eGenLocPrimaryBox)
Port Connection: 0 (ePortConnJack)
IsConnected: No
0x20007: Line In
0x20008: Line In
0x20000: Sum
0x10000:
{0.0.0.00000000}.{f7bf26d7-89a3-4049-8cd3-8148a6615565}
0x10000:

And here’s a screenshot of the Windows Driver Kit‘s Kernel Streaming Studio showing the topology exposed by the audio drivers on my machine:

device-topology-screenshot

Browse source

Download binary

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s