How to get Jack Information of Audio Device in MS WIndows 7
See the question and my original answer on StackOverflowTo get jack information, you need to use the DeviceTopology API.
This API defines an IKsJackDescription interface that will give you jack connectors information. Here is a sample console app that displays this information on a machine for all render devices:
int main()
{
HRESULT hr = S_OK;
CoInitialize(NULL);
CComPtr<IMMDeviceEnumerator> enumerator;
hr = enumerator.CoCreateInstance(__uuidof(MMDeviceEnumerator));
if (SUCCEEDED(hr))
{
CComPtr<IMMDeviceCollection> devices;
hr = enumerator->EnumAudioEndpoints(EDataFlow::eRender, DEVICE_STATEMASK_ALL, &devices);
if (SUCCEEDED(hr))
{
UINT count = 0;
devices->GetCount(&count);
for (int i = 0; i < count; i++)
{
CComPtr<IMMDevice> device;
hr = devices->Item(i, &device);
if (SUCCEEDED(hr))
{
CComPtr<IPropertyStore> store;
hr = device->OpenPropertyStore(STGM_READ, &store);
if (SUCCEEDED(hr))
{
PROPVARIANT pv;
PropVariantInit(&pv);
hr = store->GetValue(PKEY_Device_FriendlyName, &pv);
if (SUCCEEDED(hr))
{
PWSTR p;
PSFormatForDisplayAlloc(PKEY_Device_FriendlyName, pv, PDFF_DEFAULT, &p);
wprintf(L"name: '%s'\n", p);
CoTaskMemFree(p);
}
PropVariantClear(&pv);
}
CComPtr<IDeviceTopology> topology;
hr = device->Activate(__uuidof(IDeviceTopology), CLSCTX_ALL, NULL, (void**)&topology);
if (SUCCEEDED(hr))
{
CComPtr<IConnector> connector;
hr = topology->GetConnector(0, &connector);
if (SUCCEEDED(hr))
{
CComPtr<IConnector> connectedTo;
hr = connector->GetConnectedTo(&connectedTo);
if (SUCCEEDED(hr))
{
CComPtr<IPart> part;
hr = connectedTo->QueryInterface(&part);
if (SUCCEEDED(hr))
{
CComPtr<IKsJackDescription> jack;
hr = part->Activate(CLSCTX_ALL, IID_PPV_ARGS(&jack));
if (SUCCEEDED(hr))
{
UINT jackCount = 0;
jack->GetJackCount(&jackCount);
for (int j = 0; j < jackCount; j++)
{
KSJACK_DESCRIPTION desc = { 0 };
jack->GetJackDescription(j, &desc);
wprintf(L" jack[%i] channel mapping: %i\n", j, desc.ChannelMapping);
wprintf(L" jack[%i] connection type: %i\n", j, desc.ConnectionType);
wprintf(L" jack[%i] is connected: %i\n", j, desc.IsConnected);
wprintf(L" jack[%i] color: 0x%08X\n", j, desc.Color);
}
}
}
}
}
}
}
}
}
}
enumerator.Release();
CoUninitialize();
return 0;
}