- implement MMixerGetDeviceNameWithComponentId, which retrieves the device name via...
[reactos.git] / reactos / sdk / lib / drivers / sound / mmixer / sup.c
index 401e776..84d5547 100644 (file)
@@ -801,6 +801,53 @@ MMixerCreateMixerData(
     return MM_STATUS_SUCCESS;
 }
 
+MIXER_STATUS
+MMixerGetDeviceNameWithComponentId(
+    IN PMIXER_CONTEXT MixerContext,
+    IN HANDLE hMixer,
+    OUT LPWSTR OutDeviceName)
+{
+    MIXER_STATUS Status;
+    KSPROPERTY Property;
+    KSCOMPONENTID ComponentId;
+    ULONG Length;
+    UNICODE_STRING GuidString;
+    ULONG ResultLength, KeyType;
+    HANDLE hMediaKey, hGuidKey;
+    LPWSTR DeviceName;
+
+    /* prepare property */
+    Property.Flags = KSPROPERTY_TYPE_GET;
+    Property.Set = KSPROPSETID_General;
+    Property.Id = KSPROPERTY_GENERAL_COMPONENTID;
+
+    /* try get component id */
+    Status = MixerContext->Control(hMixer, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), &ComponentId, sizeof(KSCOMPONENTID), &Length);
+
+    if (Status == MM_STATUS_SUCCESS)
+    {
+        Status = MixerContext->OpenKey(NULL, L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\MediaCategories", KEY_READ, &hMediaKey);
+        if (Status == MM_STATUS_SUCCESS)
+        {
+            RtlStringFromGUID(&ComponentId.Name, &GuidString);
+            Status = MixerContext->OpenKey(hMediaKey, GuidString.Buffer, KEY_READ, &hGuidKey);
+            RtlFreeUnicodeString(&GuidString);
+            if (Status == MM_STATUS_SUCCESS)
+            {
+                Status = MixerContext->QueryKeyValue(hGuidKey, L"Name", (PVOID*)&DeviceName, &ResultLength, &KeyType);
+                if (Status == MM_STATUS_SUCCESS)
+                {
+                    MixerContext->Copy(OutDeviceName, DeviceName, min(ResultLength, (MAXPNAMELEN-1)*2));
+                }
+
+                MixerContext->CloseKey(hGuidKey);
+            }
+            MixerContext->CloseKey(hMediaKey);
+        }
+    }
+    return Status;
+}
+
 MIXER_STATUS
 MMixerGetDeviceName(
     IN PMIXER_CONTEXT MixerContext,