@@ -322,21 +322,24 @@ NTSTATUS SarKsPinSetDataFormat(
322322 NT_ASSERT (!oldFormat);
323323
324324 const KSDATARANGE_AUDIO *audioRange = (const KSDATARANGE_AUDIO *)dataRange;
325- PKSDATAFORMAT_WAVEFORMATEX waveFormat =
326- (PKSDATAFORMAT_WAVEFORMATEX )pin->ConnectionFormat ;
325+ PKSDATAFORMAT_WAVEFORMATEXTENSIBLE waveFormat =
326+ (PKSDATAFORMAT_WAVEFORMATEXTENSIBLE )pin->ConnectionFormat ;
327327
328- if (waveFormat->DataFormat .FormatSize !=
329- sizeof (KSDATAFORMAT_WAVEFORMATEX )) {
328+ if (waveFormat->DataFormat .FormatSize <
329+ sizeof (KSDATAFORMAT_WAVEFORMATEXTENSIBLE )) {
330330
331331 return STATUS_NO_MATCH;
332332 }
333333
334- if (waveFormat->WaveFormatEx .wFormatTag != WAVE_FORMAT_PCM ||
335- waveFormat->WaveFormatEx .nChannels != audioRange->MaximumChannels ||
336- waveFormat->WaveFormatEx .nSamplesPerSec !=
334+ if (waveFormat->WaveFormatExt .Format .wFormatTag !=
335+ WAVE_FORMAT_EXTENSIBLE ||
336+ waveFormat->WaveFormatExt .Format .nChannels !=
337+ audioRange->MaximumChannels ||
338+ waveFormat->WaveFormatExt .Format .nSamplesPerSec !=
337339 audioRange->MaximumSampleFrequency ||
338- waveFormat->WaveFormatEx .wBitsPerSample !=
339- audioRange->MaximumBitsPerSample ) {
340+ waveFormat->WaveFormatExt .Samples .wValidBitsPerSample !=
341+ audioRange->MaximumBitsPerSample ||
342+ waveFormat->WaveFormatExt .SubFormat != KSDATAFORMAT_SUBTYPE_PCM) {
340343
341344 return STATUS_NO_MATCH;
342345 }
@@ -424,7 +427,7 @@ NTSTATUS SarKsPinIntersectHandler(
424427 PKSDATARANGE_AUDIO callerFormat = nullptr ;
425428 PKSDATARANGE_AUDIO myFormat = nullptr ;
426429
427- *dataSize = sizeof (KSDATAFORMAT_WAVEFORMATEX );
430+ *dataSize = sizeof (KSDATAFORMAT_WAVEFORMATEXTENSIBLE );
428431
429432 if (callerDataRange->FormatSize == sizeof (KSDATARANGE_AUDIO) &&
430433 callerDataRange->MajorFormat == KSDATAFORMAT_TYPE_AUDIO) {
@@ -452,7 +455,7 @@ NTSTATUS SarKsPinIntersectHandler(
452455 return STATUS_BUFFER_OVERFLOW;
453456 }
454457
455- if (dataBufferSize < sizeof (KSDATAFORMAT_WAVEFORMATEX )) {
458+ if (dataBufferSize < sizeof (KSDATAFORMAT_WAVEFORMATEXTENSIBLE )) {
456459 return STATUS_BUFFER_TOO_SMALL;
457460 }
458461
@@ -466,23 +469,34 @@ NTSTATUS SarKsPinIntersectHandler(
466469 return STATUS_NO_MATCH;
467470 }
468471
469- PKSDATAFORMAT_WAVEFORMATEX waveFormat = (PKSDATAFORMAT_WAVEFORMATEX)data;
472+ PKSDATAFORMAT_WAVEFORMATEXTENSIBLE waveFormat =
473+ (PKSDATAFORMAT_WAVEFORMATEXTENSIBLE)data;
470474
471475 RtlCopyMemory (
472476 &waveFormat->DataFormat , &myFormat->DataRange , sizeof (KSDATAFORMAT));
473- waveFormat->WaveFormatEx .wFormatTag = WAVE_FORMAT_PCM;
474- waveFormat->WaveFormatEx .nChannels = (WORD)myFormat->MaximumChannels ;
475- waveFormat->WaveFormatEx .nSamplesPerSec = myFormat->MaximumSampleFrequency ;
476- waveFormat->WaveFormatEx .wBitsPerSample =
477+ waveFormat->WaveFormatExt .Format .wFormatTag =
478+ WAVE_FORMAT_EXTENSIBLE;
479+ waveFormat->WaveFormatExt .Format .nChannels =
480+ (WORD)myFormat->MaximumChannels ;
481+ waveFormat->WaveFormatExt .Format .nSamplesPerSec =
482+ myFormat->MaximumSampleFrequency ;
483+ waveFormat->WaveFormatExt .Format .wBitsPerSample =
477484 (WORD)myFormat->MaximumBitsPerSample ;
478- waveFormat->WaveFormatEx .nBlockAlign =
485+ waveFormat->WaveFormatExt . Format .nBlockAlign =
479486 ((WORD)myFormat->MaximumBitsPerSample / 8 ) *
480487 (WORD)myFormat->MaximumChannels ;
481- waveFormat->WaveFormatEx .nAvgBytesPerSec =
482- waveFormat->WaveFormatEx .nBlockAlign *
483- waveFormat->WaveFormatEx .nSamplesPerSec ;
484- waveFormat->WaveFormatEx .cbSize = 0 ;
485- waveFormat->DataFormat .SampleSize = waveFormat->WaveFormatEx .nBlockAlign ;
488+ waveFormat->WaveFormatExt .Format .nAvgBytesPerSec =
489+ waveFormat->WaveFormatExt .Format .nBlockAlign *
490+ waveFormat->WaveFormatExt .Format .nSamplesPerSec ;
491+ waveFormat->WaveFormatExt .Format .cbSize =
492+ sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX);
493+ waveFormat->WaveFormatExt .Samples .wValidBitsPerSample =
494+ (WORD)myFormat->MaximumBitsPerSample ;
495+ waveFormat->WaveFormatExt .dwChannelMask =
496+ (1 << myFormat->MaximumChannels ) - 1 ;
497+ waveFormat->WaveFormatExt .SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
498+ waveFormat->DataFormat .SampleSize =
499+ waveFormat->WaveFormatExt .Format .nBlockAlign ;
486500 waveFormat->DataFormat .FormatSize = *dataSize;
487501 return STATUS_SUCCESS;
488502}
@@ -528,32 +542,43 @@ NTSTATUS SarKsPinGetDefaultDataFormat(
528542 return STATUS_NOT_FOUND;
529543 }
530544
531- if (outputLength < sizeof (KSDATAFORMAT_WAVEFORMATEX )) {
532- irp->IoStatus .Information = sizeof (KSDATAFORMAT_WAVEFORMATEX );
545+ if (outputLength < sizeof (KSDATAFORMAT_WAVEFORMATEXTENSIBLE )) {
546+ irp->IoStatus .Information = sizeof (KSDATAFORMAT_WAVEFORMATEXTENSIBLE );
533547 SarReleaseEndpointAndContext (endpoint);
534548 return STATUS_BUFFER_OVERFLOW;
535549 }
536550
537- PKSDATAFORMAT_WAVEFORMATEX waveFormat = (PKSDATAFORMAT_WAVEFORMATEX)data;
551+ PKSDATAFORMAT_WAVEFORMATEXTENSIBLE waveFormat =
552+ (PKSDATAFORMAT_WAVEFORMATEXTENSIBLE)data;
538553 PKSDATARANGE_AUDIO myFormat = endpoint->dataRange ;
539554
540555 RtlCopyMemory (
541- &waveFormat->DataFormat , endpoint->dataRange , sizeof (KSDATAFORMAT));
542-
543- waveFormat->WaveFormatEx .wFormatTag = WAVE_FORMAT_PCM;
544- waveFormat->WaveFormatEx .nChannels = (WORD)myFormat->MaximumChannels ;
545- waveFormat->WaveFormatEx .nSamplesPerSec = myFormat->MaximumSampleFrequency ;
546- waveFormat->WaveFormatEx .wBitsPerSample =
556+ &waveFormat->DataFormat , &myFormat->DataRange , sizeof (KSDATAFORMAT));
557+ waveFormat->WaveFormatExt .Format .wFormatTag =
558+ WAVE_FORMAT_EXTENSIBLE;
559+ waveFormat->WaveFormatExt .Format .nChannels =
560+ (WORD)myFormat->MaximumChannels ;
561+ waveFormat->WaveFormatExt .Format .nSamplesPerSec =
562+ myFormat->MaximumSampleFrequency ;
563+ waveFormat->WaveFormatExt .Format .wBitsPerSample =
547564 (WORD)myFormat->MaximumBitsPerSample ;
548- waveFormat->WaveFormatEx .nBlockAlign =
565+ waveFormat->WaveFormatExt . Format .nBlockAlign =
549566 ((WORD)myFormat->MaximumBitsPerSample / 8 ) *
550567 (WORD)myFormat->MaximumChannels ;
551- waveFormat->WaveFormatEx .nAvgBytesPerSec =
552- waveFormat->WaveFormatEx .nBlockAlign *
553- waveFormat->WaveFormatEx .nSamplesPerSec ;
554- waveFormat->WaveFormatEx .cbSize = 0 ;
555- waveFormat->DataFormat .SampleSize = waveFormat->WaveFormatEx .nBlockAlign ;
556- waveFormat->DataFormat .FormatSize = sizeof (KSDATAFORMAT_WAVEFORMATEX);
568+ waveFormat->WaveFormatExt .Format .nAvgBytesPerSec =
569+ waveFormat->WaveFormatExt .Format .nBlockAlign *
570+ waveFormat->WaveFormatExt .Format .nSamplesPerSec ;
571+ waveFormat->WaveFormatExt .Format .cbSize =
572+ sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX);
573+ waveFormat->WaveFormatExt .Samples .wValidBitsPerSample =
574+ (WORD)myFormat->MaximumBitsPerSample ;
575+ waveFormat->WaveFormatExt .dwChannelMask =
576+ (1 << myFormat->MaximumChannels ) - 1 ;
577+ waveFormat->WaveFormatExt .SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
578+ waveFormat->DataFormat .SampleSize =
579+ waveFormat->WaveFormatExt .Format .nBlockAlign ;
580+ waveFormat->DataFormat .FormatSize =
581+ sizeof (KSDATAFORMAT_WAVEFORMATEXTENSIBLE);
557582 SarReleaseEndpointAndContext (endpoint);
558583 return STATUS_SUCCESS;
559584}
@@ -581,7 +606,8 @@ NTSTATUS SarKsPinProposeDataFormat(
581606 return STATUS_BUFFER_TOO_SMALL;
582607 }
583608
584- PKSDATAFORMAT_WAVEFORMATEX format = (PKSDATAFORMAT_WAVEFORMATEX)data;
609+ PKSDATAFORMAT_WAVEFORMATEXTENSIBLE format =
610+ (PKSDATAFORMAT_WAVEFORMATEXTENSIBLE)data;
585611
586612 if (format->DataFormat .MajorFormat != KSDATAFORMAT_TYPE_AUDIO ||
587613 format->DataFormat .SubFormat != KSDATAFORMAT_SUBTYPE_PCM ||
@@ -598,17 +624,19 @@ NTSTATUS SarKsPinProposeDataFormat(
598624 return STATUS_NO_MATCH;
599625 }
600626
601- if (outputLength < sizeof (KSDATAFORMAT_WAVEFORMATEX )) {
627+ if (outputLength < sizeof (KSDATAFORMAT_WAVEFORMATEXTENSIBLE )) {
602628 SarReleaseEndpointAndContext (endpoint);
603629 return STATUS_BUFFER_TOO_SMALL;
604630 }
605631
606- if (format->WaveFormatEx .nChannels != endpoint->channelCount ||
607- (format->WaveFormatEx .wBitsPerSample !=
632+ if (format->WaveFormatExt . Format .nChannels != endpoint->channelCount ||
633+ (format->WaveFormatExt . Format .wBitsPerSample !=
608634 endpoint->owner ->sampleSize * 8 ) ||
609- (format->WaveFormatEx .wFormatTag != WAVE_FORMAT_PCM &&
610- format->WaveFormatEx .wFormatTag != WAVE_FORMAT_EXTENSIBLE) ||
611- format->WaveFormatEx .nSamplesPerSec != endpoint->owner ->sampleRate ) {
635+ format->WaveFormatExt .Format .wFormatTag != WAVE_FORMAT_EXTENSIBLE ||
636+ (format->WaveFormatExt .Format .nSamplesPerSec !=
637+ endpoint->owner ->sampleRate ) ||
638+ format->WaveFormatExt .SubFormat != KSDATAFORMAT_SUBTYPE_PCM) {
639+
612640 SarReleaseEndpointAndContext (endpoint);
613641 return STATUS_NO_MATCH;
614642 }
0 commit comments