[USBAUDIO]
[reactos.git] / reactos / drivers / usb / usbaudio / pin.c
index b4a0cb6..daba4c4 100644 (file)
@@ -90,58 +90,6 @@ UsbAudioAllocCaptureUrbIso(
 
 }
 
-NTSTATUS
-UsbAudioSetMuteOff(
-    IN PKSPIN Pin)
-{
-    PURB Urb;
-    PVOID SampleRateBuffer;
-    PPIN_CONTEXT PinContext;
-    NTSTATUS Status;
-
-    /* allocate sample rate buffer */
-    SampleRateBuffer = AllocFunction(sizeof(ULONG));
-    if (!SampleRateBuffer)
-    {
-        /* no memory */
-        return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-    /* allocate urb */
-    Urb = AllocFunction(sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));
-    if (!Urb)
-    {
-        /* no memory */
-        FreeFunction(SampleRateBuffer);
-        return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-    /* FIXME: determine controls and format urb */
-    UsbBuildVendorRequest(Urb,
-        URB_FUNCTION_CLASS_INTERFACE,
-        sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
-        USBD_TRANSFER_DIRECTION_OUT,
-        0,
-        0x01,
-        0x100,
-        0x300,
-        SampleRateBuffer,
-        NULL,
-        1,
-        NULL);
-
-    /* get pin context */
-    PinContext = Pin->Context;
-
-    /* submit urb */
-    Status = SubmitUrbSync(PinContext->LowerDevice, Urb);
-
-    DPRINT1("UsbAudioSetMuteOff Pin %p Status %x\n", Pin, Status);
-    FreeFunction(Urb);
-    FreeFunction(SampleRateBuffer);
-    return Status;
-}
-
 NTSTATUS
 UsbAudioSetVolume(
     IN PKSPIN Pin)
@@ -696,7 +644,6 @@ USBAudioPinCreate(
     }
 
     /* FIXME move to build filter topology*/
-    UsbAudioSetMuteOff(Pin);
     UsbAudioSetVolume(Pin);
 
     /* select streaming interface */
@@ -789,7 +736,6 @@ PinCaptureProcess(
     PPIN_CONTEXT PinContext;
     PLIST_ENTRY CurEntry;
     PIRP Irp;
-    PIO_STACK_LOCATION IoStack;
     PURB Urb;
     PUCHAR TransferBuffer, OutBuffer;
     ULONG Offset, Length;
@@ -827,7 +773,6 @@ PinCaptureProcess(
         Irp = (PIRP)CONTAINING_RECORD(CurEntry, IRP, Tail.Overlay.ListEntry);
 
         /* get urb from irp */
-        IoStack = IoGetNextIrpStackLocation(Irp);
         Urb = (PURB)Irp->Tail.Overlay.DriverContext[0];
         ASSERT(Urb);
 
@@ -882,6 +827,7 @@ PinCaptureProcess(
         else
         {
             Status = KsStreamPointerAdvanceOffsets(LeadingStreamPointer, 0, Length, FALSE);
+            NT_ASSERT(NT_SUCCESS(Status));
             ASSERT(Length == Urb->UrbIsochronousTransfer.TransferBufferLength - Offset);
         }
 
@@ -1074,3 +1020,65 @@ USBAudioPinSetDeviceState(
 
     return Status;
 }
+
+
+NTSTATUS
+NTAPI
+UsbAudioPinDataIntersect(
+    _In_  PVOID        Context,
+    _In_  PIRP         Irp,
+    _In_  PKSP_PIN     Pin,
+    _In_  PKSDATARANGE DataRange,
+    _In_  PKSDATARANGE MatchingDataRange,
+    _In_  ULONG        DataBufferSize,
+    _Out_ PVOID        Data,
+    _Out_ PULONG       DataSize)
+{
+    PKSFILTER Filter;
+    PKSPIN_DESCRIPTOR_EX PinDescriptor;
+    PKSDATAFORMAT_WAVEFORMATEX DataFormat;
+    PKSDATARANGE_AUDIO DataRangeAudio;
+
+    /* get filter from irp*/
+    Filter = KsGetFilterFromIrp(Irp);
+    if (!Filter)
+    {
+        /* no match*/
+        return STATUS_NO_MATCH;
+    }
+
+    /* get pin descriptor */
+    PinDescriptor = (PKSPIN_DESCRIPTOR_EX)&Filter->Descriptor->PinDescriptors[Pin->PinId];
+
+    *DataSize = sizeof(KSDATAFORMAT_WAVEFORMATEX);
+    if (DataBufferSize == 0)
+    {
+        /* buffer too small */
+        return STATUS_BUFFER_OVERFLOW;
+    }
+
+    /* sanity checks*/
+    ASSERT(PinDescriptor->PinDescriptor.DataRangesCount >= 0);
+    ASSERT(PinDescriptor->PinDescriptor.DataRanges[0]->FormatSize == sizeof(KSDATARANGE_AUDIO));
+
+    DataRangeAudio = (PKSDATARANGE_AUDIO)PinDescriptor->PinDescriptor.DataRanges[0];
+
+    DataFormat = Data;
+    DataFormat->WaveFormatEx.wFormatTag = WAVE_FORMAT_PCM;
+    DataFormat->WaveFormatEx.nChannels = DataRangeAudio->MaximumChannels;
+    DataFormat->WaveFormatEx.nSamplesPerSec = DataRangeAudio->MaximumSampleFrequency;
+    DataFormat->WaveFormatEx.nAvgBytesPerSec = DataRangeAudio->MaximumSampleFrequency * (DataRangeAudio->MaximumBitsPerSample / 8) * DataRangeAudio->MaximumChannels;
+    DataFormat->WaveFormatEx.nBlockAlign = (DataRangeAudio->MaximumBitsPerSample / 8) * DataRangeAudio->MaximumChannels;
+    DataFormat->WaveFormatEx.wBitsPerSample = DataRangeAudio->MaximumBitsPerSample;
+    DataFormat->WaveFormatEx.cbSize = 0;
+
+    DataFormat->DataFormat.FormatSize = sizeof(KSDATAFORMAT) + sizeof(WAVEFORMATEX);
+    DataFormat->DataFormat.Flags = 0;
+    DataFormat->DataFormat.Reserved = 0;
+    DataFormat->DataFormat.MajorFormat = KSDATAFORMAT_TYPE_AUDIO;
+    DataFormat->DataFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
+    DataFormat->DataFormat.Specifier = KSDATAFORMAT_SPECIFIER_WAVEFORMATEX;
+    DataFormat->DataFormat.SampleSize = (DataRangeAudio->MaximumBitsPerSample / 8) * DataRangeAudio->MaximumChannels;
+
+    return STATUS_SUCCESS;
+}