Search code examples
pythonaudiooperating-systemregistryguid

get audio device GUID in Python


I am trying to get GUID of audio device. The GUID can be found in registry Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\ the guid should look like {0.0.0.00000000}.{37e73048-025a-47ea-bf9f-59d5ef8f2b43}

basically like this. but I want in python Getting GUID of audio output device (speaker,headphones)

I've tried myself but only thing I can find is to use command line and parse it in Python

import subprocess

sd = subprocess.run(
    ["pnputil", "/enum-devices", "/connected", "/class", "AudioEndpoint"],
    capture_output=True,
    text=True,
)

output = sd.stdout.split("\n")[1:-1]

def getDevices(devices):
    deviceList = {}
    for device in range(len(devices)):
        if "Instance ID:" in devices[device]:
            deviceList[devices[device+1].split(":")[-1].strip()] = devices[device].split("\\")[-1].strip()
    return deviceList

print(getDevices(output))

which got me

{'Headset (Soundcore Life Q30 Hands-Free)': '{0.0.0.00000000}.{4ac89ef7-f00d-4069-b96b-421bd3276295}', 'Speakers (Echo Dot-BQP)': '{0.0.0.00000000}.{8085b216-297a-4d02-bc3d-83b997b79524}', 'Headphones (Soundcore Life Q30)': '{0.0.0.00000000}.{37e73048-025a-47ea-bf9f-59d5ef8f2b43}'}

Hopping there is better way


Solution

  • from __future__ import print_function
    import comtypes
    from pycaw.pycaw import AudioUtilities, IMMDeviceEnumerator, EDataFlow, DEVICE_STATE
    from pycaw.constants import CLSID_MMDeviceEnumerator
    
    def MyGetAudioDevices(direction="in", State = DEVICE_STATE.ACTIVE.value):
        devices = []
        # for all use EDataFlow.eAll.value
        if direction == "in":
            Flow = EDataFlow.eCapture.value     # 1
        else:
            Flow = EDataFlow.eRender.value      # 0
        
        deviceEnumerator = comtypes.CoCreateInstance(
            CLSID_MMDeviceEnumerator,
            IMMDeviceEnumerator,
            comtypes.CLSCTX_INPROC_SERVER)
        if deviceEnumerator is None:
            return devices
        
    
        collection = deviceEnumerator.EnumAudioEndpoints(Flow, State)
        if collection is None:
            return devices
    
        count = collection.GetCount()
        for i in range(count):
            dev = collection.Item(i)
            if dev is not None:
                if not ": None" in str(AudioUtilities.CreateDevice(dev)):
                    devices.append(AudioUtilities.CreateDevice(dev))
        return devices
    
    output_device = MyGetAudioDevices("out")
    input_device = MyGetAudioDevices("in")
    
    print(output_device)
    print(input_device)
    
    

    This worked for me