}
-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)
}
/* FIXME move to build filter topology*/
- UsbAudioSetMuteOff(Pin);
UsbAudioSetVolume(Pin);
/* select streaming interface */
PPIN_CONTEXT PinContext;
PLIST_ENTRY CurEntry;
PIRP Irp;
- PIO_STACK_LOCATION IoStack;
PURB Urb;
PUCHAR TransferBuffer, OutBuffer;
ULONG Offset, Length;
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);
else
{
Status = KsStreamPointerAdvanceOffsets(LeadingStreamPointer, 0, Length, FALSE);
+ NT_ASSERT(NT_SUCCESS(Status));
ASSERT(Length == Urb->UrbIsochronousTransfer.TransferBufferLength - Offset);
}
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;
+}