Skip to content

Commit 1a21b29

Browse files
committed
Always use WAVE_FORMAT_EXTENSIBLE so Windows 7 format negotiation won't fail.
1 parent 3dd2018 commit 1a21b29

File tree

1 file changed

+73
-45
lines changed

1 file changed

+73
-45
lines changed

SynchronousAudioRouter/pin.cpp

+73-45
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)