+ULONG
+IsOutputMixer(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG DeviceIndex)
+{
+ ULONG DeviceCount, Index, Count;
+ NTSTATUS Status;
+ HANDLE hDevice;
+ PFILE_OBJECT FileObject;
+ PKSMULTIPLE_ITEM MultipleItem;
+
+ /* get number of devices */
+ DeviceCount = GetSysAudioDeviceCount(DeviceObject);
+
+ if (!DeviceCount)
+ return 0;
+
+ Index = 0;
+ Count = 0;
+ do
+ {
+ /* open the virtual audio device */
+ Status = OpenSysAudioDeviceByIndex(DeviceObject, Index, &hDevice, &FileObject);
+
+ if (NT_SUCCESS(Status))
+ {
+ /* retrieve all available node types */
+ Status = GetFilterNodeTypes(FileObject, &MultipleItem);
+ if (NT_SUCCESS(Status))
+ {
+ if (CountNodeType(MultipleItem, (LPGUID)&KSNODETYPE_DAC))
+ {
+ /* increment (output) mixer count */
+ if (DeviceIndex == Count)
+ {
+ ExFreePool(MultipleItem);
+ ObDereferenceObject(FileObject);
+ ZwClose(hDevice);
+ return TRUE;
+ }
+
+ Count++;
+ }
+
+ if (CountNodeType(MultipleItem, (LPGUID)&KSNODETYPE_ADC))
+ {
+ /* increment (input) mixer count */
+ if (DeviceIndex == Count)
+ {
+ ExFreePool(MultipleItem);
+ ObDereferenceObject(FileObject);
+ ZwClose(hDevice);
+ return FALSE;
+ }
+ Count++;
+ }
+ ExFreePool(MultipleItem);
+ }
+ ObDereferenceObject(FileObject);
+ ZwClose(hDevice);
+ }
+
+ Index++;
+ }while(Index < DeviceCount);
+
+ ASSERT(0);
+ return FALSE;
+}
+
+
+
+
+NTSTATUS
+WdmAudMixerCapabilities(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PWDMAUD_DEVICE_INFO DeviceInfo,
+ IN PWDMAUD_CLIENT ClientInfo)
+{
+ NTSTATUS Status;
+ LPWSTR Device;
+ WCHAR Buffer[100];
+
+ Status = GetSysAudioDevicePnpName(DeviceObject, DeviceInfo->DeviceIndex,&Device);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to get device name %x\n", Status);
+ return Status;
+ }
+
+ DeviceInfo->u.MixCaps.cDestinations = 1; //FIXME
+
+ Status = FindProductName(Device, sizeof(Buffer) / sizeof(WCHAR), Buffer);
+
+ /* check for success */
+ if (!NT_SUCCESS(Status))
+ {
+ DeviceInfo->u.MixCaps.szPname[0] = L'\0';
+ }
+ else
+ {
+ if (IsOutputMixer(DeviceObject, DeviceInfo->DeviceIndex))
+ {
+ wcscat(Buffer, L" output");
+ }
+ else
+ {
+ wcscat(Buffer, L" Input");
+ }
+ RtlMoveMemory(DeviceInfo->u.MixCaps.szPname, Buffer, min(MAXPNAMELEN, wcslen(Buffer)+1) * sizeof(WCHAR));
+ DeviceInfo->u.MixCaps.szPname[MAXPNAMELEN-1] = L'\0';
+ }
+
+ return Status;
+}
+
+