digraph coreaudiodemo { fontname="Helvetica,Arial,sans-serif" node [color=black, style=bold, fontname="Helvetica,Arial,sans-serif",shape="record"] edge [color=blue, style=bold, fontname="Helvetica,Arial,sans-serif"] de [label=" class IMMDeviceEnumerator\n(Retrieves current endpoints)",labelloc=b]; dc [label=" class IMMDeviceCollection\n(Endpoint collection)",labelloc=b]; ie [label=" class IMMDevice (Deceitful name, actual endpoint)",labelloc=b]; ieroutes [label=" class IMMEndpoint \n(Just Playback/Capture flag) | class IAudioEndpointVolume \n(Endpoint volume/balance) | class IAudioSessionManager \n(Entry point to endpoint's session management)",labelloc=b]; iase [label=" class IAudioSessionEnumerator \n(Retrieves endpoint's current sessions)",labelloc=b]; iasc [label=" class IAudioSessionControl \n(Used to call derived class)",labelloc=b]; iasc2 [label=" class IAudioSessionControl2 \n(Session management. Called via `QueryInterface())",labelloc=b]; isav [label=" class ISimpleAudioVolume \n(Session volume controls. Called via `QueryInterface())`",labelloc=b]; de -> dc; dc -> ie; ie -> ieroutes:p0 [label=""]; ie -> ieroutes:p1; ie -> ieroutes:p2; ieroutes:p2 -> iase; iase -> iasc; iasc -> iasc2; iasc2 -> isav; }