Author: janderwald
Date: Sun Nov  6 13:59:39 2016
New Revision: 73150

URL: http://svn.reactos.org/svn/reactos?rev=73150&view=rev
Log:
[USBAUDIO]
- partly implement GetDataRangeIndexForFormat

Modified:
    trunk/reactos/drivers/usb/usbaudio/pin.c

Modified: trunk/reactos/drivers/usb/usbaudio/pin.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbaudio/pin.c?rev=73150&r1=73149&r2=73150&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/usbaudio/pin.c    [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbaudio/pin.c    [iso-8859-1] Sun Nov  6 
13:59:39 2016
@@ -694,6 +694,71 @@
     return STATUS_SUCCESS;
 }
 
+ULONG
+GetDataRangeIndexForFormat(
+    IN PKSDATARANGE ConnectionFormat,
+    IN PKSDATARANGE * DataRanges,
+    IN ULONG DataRangesCount)
+{
+    ULONG Index;
+    PKSDATARANGE CurrentDataRange;
+    PKSDATARANGE_AUDIO CurrentAudioDataRange;
+    PKSDATAFORMAT_WAVEFORMATEX ConnectionDataFormat;
+
+    if (ConnectionFormat->FormatSize != sizeof(KSDATAFORMAT) + 
sizeof(WAVEFORMATEX))
+    {
+        /* unsupported connection format */
+        DPRINT1("GetDataRangeIndexForFormat expected KSDATARANGE_AUDIO\n");
+        return MAXULONG;
+    }
+
+    /* cast to right type */
+    ConnectionDataFormat = (PKSDATAFORMAT_WAVEFORMATEX)ConnectionFormat;
+
+    for (Index = 0; Index < DataRangesCount; Index++)
+    {
+         /* get current data range */
+         CurrentDataRange = DataRanges[Index];
+
+         /* compare guids */
+         if (!IsEqualGUIDAligned(&CurrentDataRange->MajorFormat, 
&ConnectionFormat->MajorFormat) ||
+             !IsEqualGUIDAligned(&CurrentDataRange->SubFormat, 
&ConnectionFormat->SubFormat) ||
+             !IsEqualGUIDAligned(&CurrentDataRange->Specifier, 
&ConnectionFormat->Specifier))
+         {
+             /* no match */
+             continue;
+         }
+
+         /* all pin data ranges are KSDATARANGE_AUDIO */
+         CurrentAudioDataRange = (PKSDATARANGE_AUDIO)CurrentDataRange;
+
+         /* check if number of channel match */
+         if (CurrentAudioDataRange->MaximumChannels != 
ConnectionDataFormat->WaveFormatEx.nChannels)
+         {
+             /* number of channels mismatch */
+             continue;
+         }
+
+         if (CurrentAudioDataRange->MinimumSampleFrequency > 
ConnectionDataFormat->WaveFormatEx.nSamplesPerSec)
+         {
+             /* channel frequency too low */
+             continue;
+         }
+
+         if (CurrentAudioDataRange->MaximumSampleFrequency < 
ConnectionDataFormat->WaveFormatEx.nSamplesPerSec)
+         {
+             /* channel frequency too high */
+             continue;
+         }
+
+         /* FIXME add checks for bitrate / sample size etc */
+         return Index;
+    }
+
+    /* no datarange found */
+    return MAXULONG;
+}
+
 NTSTATUS
 NTAPI
 USBAudioPinCreate(
@@ -704,6 +769,7 @@
     PFILTER_CONTEXT FilterContext;
     PPIN_CONTEXT PinContext;
     NTSTATUS Status;
+    ULONG FormatIndex;
 
     Filter = KsPinGetParentFilter(Pin);
     if (Filter == NULL)
@@ -741,9 +807,16 @@
         ASSERT(Status == STATUS_SUCCESS);
     }
 
+    /* choose correct dataformat */
+    FormatIndex = GetDataRangeIndexForFormat(Pin->ConnectionFormat, 
Pin->Descriptor->PinDescriptor.DataRanges, 
Pin->Descriptor->PinDescriptor.DataRangesCount);
+    if (FormatIndex == MAXULONG)
+    {
+        /* no format match */
+        return STATUS_NO_MATCH;
+    }
+
     /* select streaming interface */
-    /* FIXME choose correct dataformat */
-    Status = USBAudioSelectAudioStreamingInterface(Pin, PinContext, 
PinContext->DeviceExtension, 
PinContext->DeviceExtension->ConfigurationDescriptor, 0);
+    Status = USBAudioSelectAudioStreamingInterface(Pin, PinContext, 
PinContext->DeviceExtension, 
PinContext->DeviceExtension->ConfigurationDescriptor, FormatIndex);
     if (!NT_SUCCESS(Status))
     {
         /* failed */
@@ -980,7 +1053,7 @@
         /* calculate offset*/
         Offset = TotalPacketSize - PinContext->BufferLength;
 
-        if (PinContext->BufferOffset + Offset >= PinContext->BufferSize)
+        if (PinContext->BufferOffset + TotalPacketSize >= 
PinContext->BufferSize)
         {
             RtlMoveMemory(PinContext->Buffer, 
&PinContext->Buffer[PinContext->BufferOffset - PinContext->BufferLength], 
PinContext->BufferLength);
             PinContext->BufferOffset = PinContext->BufferLength;
@@ -1025,7 +1098,7 @@
             PinContext->BufferLength = CloneStreamPointer->OffsetIn.Remaining 
- ((PacketCount * TotalPacketSize) + Offset);
 
             /* check for overflow */
-            if (PinContext->BufferOffset + Offset >= PinContext->BufferSize)
+            if (PinContext->BufferOffset + TotalPacketSize >= 
PinContext->BufferSize)
             {
                 /* reset buffer offset*/
                 PinContext->BufferOffset = 0;


Reply via email to