Ensure WaveOut compatibility with Win9X/NT (#687)

This commit is contained in:
jjceresa 2020-10-14 17:54:56 +02:00 committed by GitHub
parent f14cbb8782
commit 5b8f3cbbc2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -287,6 +287,7 @@ new_fluid_waveout_audio_driver(fluid_settings_t *settings, fluid_synth_t *synth)
sample_size = sizeof(float); sample_size = sizeof(float);
write_ptr = fluid_synth_write_float_channels; write_ptr = fluid_synth_write_float_channels;
wfx.SubFormat = guid_float; wfx.SubFormat = guid_float;
wfx.Format.wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
} }
else if(fluid_settings_str_equal(settings, "audio.sample-format", "16bits")) else if(fluid_settings_str_equal(settings, "audio.sample-format", "16bits"))
{ {
@ -296,6 +297,7 @@ new_fluid_waveout_audio_driver(fluid_settings_t *settings, fluid_synth_t *synth)
sample_size = sizeof(short); sample_size = sizeof(short);
write_ptr = fluid_synth_write_s16_channels; write_ptr = fluid_synth_write_s16_channels;
wfx.SubFormat = guid_pcm; wfx.SubFormat = guid_pcm;
wfx.Format.wFormatTag = WAVE_FORMAT_PCM;
} }
else else
{ {
@ -320,11 +322,21 @@ new_fluid_waveout_audio_driver(fluid_settings_t *settings, fluid_synth_t *synth)
wfx.Format.nBlockAlign = sample_size * wfx.Format.nChannels; wfx.Format.nBlockAlign = sample_size * wfx.Format.nChannels;
wfx.Format.nSamplesPerSec = frequency; wfx.Format.nSamplesPerSec = frequency;
wfx.Format.nAvgBytesPerSec = frequency * wfx.Format.nBlockAlign; wfx.Format.nAvgBytesPerSec = frequency * wfx.Format.nBlockAlign;
/* extension */
wfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; /* WAVEFORMATEXTENSIBLE extension is used only when channels number
wfx.Format.cbSize = 22; is above 2.
wfx.Samples.wValidBitsPerSample = wfx.Format.wBitsPerSample; When channels number is below 2, only WAVEFORMATEX structure
wfx.dwChannelMask = channel_mask_speakers[synth->audio_channels - 1]; will be used by the Windows driver. This ensures compatibility with
Windows 9X/NT in the case these versions does not accept the
WAVEFORMATEXTENSIBLE structure.
*/
if(wfx.Format.nChannels > 2)
{
wfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
wfx.Format.cbSize = 22;
wfx.Samples.wValidBitsPerSample = wfx.Format.wBitsPerSample;
wfx.dwChannelMask = channel_mask_speakers[synth->audio_channels - 1];
}
/* Calculate the length of a single buffer */ /* Calculate the length of a single buffer */
lenBuffer = (MS_BUFFER_LENGTH * wfx.Format.nAvgBytesPerSec + 999) / 1000; lenBuffer = (MS_BUFFER_LENGTH * wfx.Format.nAvgBytesPerSec + 999) / 1000;