[ros-diffs] [janderwald] 41901: - Use free index directly - Update interface

janderwald at svn.reactos.org janderwald at svn.reactos.org
Sun Jul 12 01:23:41 CEST 2009


Author: janderwald
Date: Sun Jul 12 03:23:40 2009
New Revision: 41901

URL: http://svn.reactos.org/svn/reactos?rev=41901&view=rev
Log:
- Use free index directly
- Update interface

Modified:
    trunk/reactos/drivers/wdm/audio/legacy/wdmaud/control.c
    trunk/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h

Modified: trunk/reactos/drivers/wdm/audio/legacy/wdmaud/control.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/wdmaud/control.c?rev=41901&r1=41900&r2=41901&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/wdmaud/control.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/legacy/wdmaud/control.c [iso-8859-1] Sun Jul 12 03:23:40 2009
@@ -146,6 +146,7 @@
     KSDATAFORMAT_WAVEFORMATEX * DataFormat;
     ULONG FilterId;
     ULONG PinId;
+    ULONG FreeIndex;
 
     if (DeviceInfo->DeviceType == MIXER_DEVICE_TYPE)
     {
@@ -166,12 +167,14 @@
     }
 
     /* close pin handle which uses same virtual audio device id and pin id */
+    FreeIndex = (ULONG)-1;
     for(Index = 0; Index < ClientInfo->NumPins; Index++)
     {
-        if (ClientInfo->hPins[Index].FilterId == FilterId && ClientInfo->hPins[Index].PinId == PinId && ClientInfo->hPins[Index].Handle)
+        if (ClientInfo->hPins[Index].FilterId == FilterId && ClientInfo->hPins[Index].PinId == PinId && ClientInfo->hPins[Index].Handle && ClientInfo->hPins[Index].Type == DeviceInfo->DeviceType)
         {
             ZwClose(ClientInfo->hPins[Index].Handle);
             ClientInfo->hPins[Index].Handle = NULL;
+            FreeIndex = Index;
         }
     }
 
@@ -248,19 +251,16 @@
     {
         PWDMAUD_HANDLE Handels;
 
-        for(Index = 0; Index < ClientInfo->NumPins; Index++)
-        {
-            if (ClientInfo->hPins[Index].Handle == NULL)
-            {
-                /* re-use a free index */
-                ClientInfo->hPins[Index].Handle = PinHandle;
-                ClientInfo->hPins[Index].FilterId = FilterId;
-                ClientInfo->hPins[Index].PinId = PinId;
-                ClientInfo->hPins[Index].Type = DeviceInfo->DeviceType;
-
-                DeviceInfo->hDevice = PinHandle;
-                return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO));
-            }
+        if (FreeIndex != (ULONG)-1)
+        {
+            /* re-use a free index */
+            ClientInfo->hPins[Index].Handle = PinHandle;
+            ClientInfo->hPins[Index].FilterId = FilterId;
+            ClientInfo->hPins[Index].PinId = PinId;
+            ClientInfo->hPins[Index].Type = DeviceInfo->DeviceType;
+
+            DeviceInfo->hDevice = PinHandle;
+            return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO));
         }
 
         Handels = ExAllocatePool(NonPagedPool, sizeof(WDMAUD_HANDLE) * (ClientInfo->NumPins+1));
@@ -411,7 +411,7 @@
     Property.Id = KSPROPERTY_CONNECTION_STATE;
     Property.Flags = KSPROPERTY_TYPE_SET;
 
-    State = DeviceInfo->State;
+    State = DeviceInfo->u.State;
 
     Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&State, sizeof(KSSTATE), &BytesReturned);
 
@@ -647,6 +647,8 @@
             return WdmAudCapabilities(DeviceObject, Irp, DeviceInfo, ClientInfo);
         case IOCTL_CLOSE_WDMAUD:
             return WdmAudIoctlClose(DeviceObject, Irp, DeviceInfo, ClientInfo);
+        case IOCTL_GETPOS:
+            DPRINT1("IOCTL_GETPOS\n");
         case IOCTL_GETDEVID:
         case IOCTL_GETVOLUME:
         case IOCTL_SETVOLUME:

Modified: trunk/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h?rev=41901&r1=41900&r2=41901&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h [iso-8859-1] Sun Jul 12 03:23:40 2009
@@ -30,8 +30,6 @@
 
     HANDLE hDevice;
     ULONG DeviceCount;
-    KSSTATE State;
-    ULONG Volume;
 
     ULONG BufferSize;
     PUCHAR Buffer;
@@ -41,7 +39,10 @@
         WAVEFORMATEX WaveFormatEx;
         WAVEOUTCAPSW WaveOutCaps;
         AUXCAPSW     AuxCaps;
-        WAVEINCAPSW WaveInCaps;
+        WAVEINCAPSW  WaveInCaps;
+        ULONGLONG    Position;
+        KSSTATE State;
+        ULONG Volume;
     }u;
 
 }WDMAUD_DEVICE_INFO, *PWDMAUD_DEVICE_INFO;
@@ -204,5 +205,22 @@
              METHOD_BUFFERED, \
              FILE_CREATE_TREE_CONNECTION | FILE_ANY_ACCESS)
 
+/// IOCTL_GETPOS
+///
+/// Description: This IOCTL retrieves the current playback / write position
+///
+/// Arguments:  InputBuffer is a pointer to a WDMAUD_DEVICE_INFO structure,
+///             InputBufferSize is size of WDMAUD_DEVICE_INFO structure
+/// Note:       The DeviceType and hDevice must be set
+/// Result:     The result is returned in Volume
+/// ReturnCode:  STATUS_SUCCESS indicates success
+/// Prequsites: opened device
+
+#define IOCTL_GETPOS \
+    CTL_CODE(FILE_DEVICE_SOUND, \
+             9, \
+             METHOD_BUFFERED, \
+             FILE_CREATE_TREE_CONNECTION | FILE_ANY_ACCESS)
+
 
 #endif



More information about the Ros-diffs mailing list