@@ -322,21 +322,24 @@ NTSTATUS SarKsPinSetDataFormat(
322
322
NT_ASSERT (!oldFormat);
323
323
324
324
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 ;
327
327
328
- if (waveFormat->DataFormat .FormatSize !=
329
- sizeof (KSDATAFORMAT_WAVEFORMATEX )) {
328
+ if (waveFormat->DataFormat .FormatSize <
329
+ sizeof (KSDATAFORMAT_WAVEFORMATEXTENSIBLE )) {
330
330
331
331
return STATUS_NO_MATCH;
332
332
}
333
333
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 !=
337
339
audioRange->MaximumSampleFrequency ||
338
- waveFormat->WaveFormatEx .wBitsPerSample !=
339
- audioRange->MaximumBitsPerSample ) {
340
+ waveFormat->WaveFormatExt .Samples .wValidBitsPerSample !=
341
+ audioRange->MaximumBitsPerSample ||
342
+ waveFormat->WaveFormatExt .SubFormat != KSDATAFORMAT_SUBTYPE_PCM) {
340
343
341
344
return STATUS_NO_MATCH;
342
345
}
@@ -424,7 +427,7 @@ NTSTATUS SarKsPinIntersectHandler(
424
427
PKSDATARANGE_AUDIO callerFormat = nullptr ;
425
428
PKSDATARANGE_AUDIO myFormat = nullptr ;
426
429
427
- *dataSize = sizeof (KSDATAFORMAT_WAVEFORMATEX );
430
+ *dataSize = sizeof (KSDATAFORMAT_WAVEFORMATEXTENSIBLE );
428
431
429
432
if (callerDataRange->FormatSize == sizeof (KSDATARANGE_AUDIO) &&
430
433
callerDataRange->MajorFormat == KSDATAFORMAT_TYPE_AUDIO) {
@@ -452,7 +455,7 @@ NTSTATUS SarKsPinIntersectHandler(
452
455
return STATUS_BUFFER_OVERFLOW;
453
456
}
454
457
455
- if (dataBufferSize < sizeof (KSDATAFORMAT_WAVEFORMATEX )) {
458
+ if (dataBufferSize < sizeof (KSDATAFORMAT_WAVEFORMATEXTENSIBLE )) {
456
459
return STATUS_BUFFER_TOO_SMALL;
457
460
}
458
461
@@ -466,23 +469,34 @@ NTSTATUS SarKsPinIntersectHandler(
466
469
return STATUS_NO_MATCH;
467
470
}
468
471
469
- PKSDATAFORMAT_WAVEFORMATEX waveFormat = (PKSDATAFORMAT_WAVEFORMATEX)data;
472
+ PKSDATAFORMAT_WAVEFORMATEXTENSIBLE waveFormat =
473
+ (PKSDATAFORMAT_WAVEFORMATEXTENSIBLE)data;
470
474
471
475
RtlCopyMemory (
472
476
&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 =
477
484
(WORD)myFormat->MaximumBitsPerSample ;
478
- waveFormat->WaveFormatEx .nBlockAlign =
485
+ waveFormat->WaveFormatExt . Format .nBlockAlign =
479
486
((WORD)myFormat->MaximumBitsPerSample / 8 ) *
480
487
(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 ;
486
500
waveFormat->DataFormat .FormatSize = *dataSize;
487
501
return STATUS_SUCCESS;
488
502
}
@@ -528,32 +542,43 @@ NTSTATUS SarKsPinGetDefaultDataFormat(
528
542
return STATUS_NOT_FOUND;
529
543
}
530
544
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 );
533
547
SarReleaseEndpointAndContext (endpoint);
534
548
return STATUS_BUFFER_OVERFLOW;
535
549
}
536
550
537
- PKSDATAFORMAT_WAVEFORMATEX waveFormat = (PKSDATAFORMAT_WAVEFORMATEX)data;
551
+ PKSDATAFORMAT_WAVEFORMATEXTENSIBLE waveFormat =
552
+ (PKSDATAFORMAT_WAVEFORMATEXTENSIBLE)data;
538
553
PKSDATARANGE_AUDIO myFormat = endpoint->dataRange ;
539
554
540
555
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 =
547
564
(WORD)myFormat->MaximumBitsPerSample ;
548
- waveFormat->WaveFormatEx .nBlockAlign =
565
+ waveFormat->WaveFormatExt . Format .nBlockAlign =
549
566
((WORD)myFormat->MaximumBitsPerSample / 8 ) *
550
567
(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);
557
582
SarReleaseEndpointAndContext (endpoint);
558
583
return STATUS_SUCCESS;
559
584
}
@@ -581,7 +606,8 @@ NTSTATUS SarKsPinProposeDataFormat(
581
606
return STATUS_BUFFER_TOO_SMALL;
582
607
}
583
608
584
- PKSDATAFORMAT_WAVEFORMATEX format = (PKSDATAFORMAT_WAVEFORMATEX)data;
609
+ PKSDATAFORMAT_WAVEFORMATEXTENSIBLE format =
610
+ (PKSDATAFORMAT_WAVEFORMATEXTENSIBLE)data;
585
611
586
612
if (format->DataFormat .MajorFormat != KSDATAFORMAT_TYPE_AUDIO ||
587
613
format->DataFormat .SubFormat != KSDATAFORMAT_SUBTYPE_PCM ||
@@ -598,17 +624,19 @@ NTSTATUS SarKsPinProposeDataFormat(
598
624
return STATUS_NO_MATCH;
599
625
}
600
626
601
- if (outputLength < sizeof (KSDATAFORMAT_WAVEFORMATEX )) {
627
+ if (outputLength < sizeof (KSDATAFORMAT_WAVEFORMATEXTENSIBLE )) {
602
628
SarReleaseEndpointAndContext (endpoint);
603
629
return STATUS_BUFFER_TOO_SMALL;
604
630
}
605
631
606
- if (format->WaveFormatEx .nChannels != endpoint->channelCount ||
607
- (format->WaveFormatEx .wBitsPerSample !=
632
+ if (format->WaveFormatExt . Format .nChannels != endpoint->channelCount ||
633
+ (format->WaveFormatExt . Format .wBitsPerSample !=
608
634
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
+
612
640
SarReleaseEndpointAndContext (endpoint);
613
641
return STATUS_NO_MATCH;
614
642
}
0 commit comments