[MMIXER] Implement hadling WAVE_FORMAT_EXTENSIBLE audio format
Fix opening audio device error when trying to open it with WAVE_FORMAT_EXTENSIBLE format tag set in wFormatTag member of WAVEFORMATEX:
- Pass additional data size from WAVEFORMATEX.cbSize to pin data format.
- Append it to the whole size of pin data format (KSDATAFORMAT.FormatSize).
- Set additional fields in WAVEFORMATEXTENSIBLE structure (data format, BPS and channel mask) when WAVE_FORMAT_EXTENSIBLE is used. They are used by our inbuilt Intel AC97 miniport driver at least. It simply fails when these members are not set.
- Fix pin connect allocation size by appending an additional data size from WAVEFORMATEX.cbSize to KSPIN_CONNECT + KSDATAFORMAT + WAVEFORMATEX. This allows to proerly initialize additional extensible data and avoids kernel memory leakage when using extensible audio format.
- Remove format tag check which allowed WAVE_FORMAT_PCM to be opened correctly. So now all possible audio formats can be opened properly at least (although it does not mean they may work correctly).
This fixes the audio playback for all apps those are supporting extensible audio data and use it by default (e. g. AIMP 5.30, QMMP 0.12.17, all Chrome/Chromium-based browsers, GameDev Tycoon Demo game etc.).
CORE-10907, CORE-14783
* [KS] Allow passing additional extensible audio data when extensible audio format is used
- Append additional data size from WAVEFORMATEX.cbSize to pin connect size passed to KsCreatePin. If the tag is WAVE_FORMAT_PCM, then this member should always be zero. So in that case, no any additional data is passed to creation request, and the passed data size is correct for PCM too (KSDATAFORMAT + WAVEFORMATEX).
This fixes audio playback in several apps those are supporting extensibble audio and use it by default (e. g. AIMP 5.30, QMMP 0.12.17, all Chrome/Chromium based browsers, GameDev Tycoon Demo game etc.).
CORE-10907, CORE-14783.
* [WDMAUD.DRV] Pass the correct additional data size to I/O control request
Store a correct size of additional data in WAVEFORMATEX.cbSize when performing open of audio device, when WAVE_FORMAT_EXTENSIBLE audio format is used.
It allows to properly open audio device with Legacy APIs enabled too.
This fixes audio playback in several apps those are using extensible audio data (e. g. AIMP 5.30, QMMP 0.12.17, all Chrome/Chromium based browsers, GameDevTycoon Demo game etc.).
CORE-10907, CORE-14783
By taking alternative code-paths in WdmAud and bypassing Sysaudio.
This is my 2nd attempt to commit that.
Using USE_MMIXER_LIB relies on those 2 previous patches:
0.4.15-dev-765-g b8e936a57b CORE17214 (#3148) wdmaud-racecondition-fix and
0.4.15-dev-796-g a27f0debca CORE17276 winmm:mixer-testbot-crash-fix
Defining USE_MMIXER_LIB will fix/improve:
- the test execution times of "GCCLin_x86 on Test VBox" will be dramatically improve (iirc by ~10-15min)
- CORE-8726/CORE-9986/CORE-16564 AC97 driver from rapps will work in the same session that the driver is installed, not a single reboot is needed anymore
- CORE13202 Unhandled exception from wdmaud.drv when recording sound in Scratch 1.4 leads to app-crash (gets fixed even for older builds that did not receive 0.4.15-dev-2794-g 81f8bce yet)
- CORE-13488 A deadlock in "DiabloII" character selection screen and "The Lion King II"
- CORE-9981 "DosBox + Commander Keen6" almost 100% fixed, DosBox + Commander Keen6 properly plays music instead of garbled output,
same improvement for "ScummVM 2.0 with Monkey Island 2"
The playback is not yet *entirely* perfect, still a few hiccups now and then, but by orders of magnitude better than before.
Defining USE_MMIXER_LIB will also have some negative aspects:
- CORE-17277 crash of dsound:duplex on "GCCLin_x86 on Test VBox" gets unhidden on the bot, but was proven to be broken even beforehand already. The driver beforehand was just not found and the tests were skipped therefore.
- CORE-17278 crash of dsound:capture on "GCCLin_x86 on Test VBox" gets unhidden on the bot, but was proven to be broken even beforehand already. The driver beforehand was just not found and the tests were skipped therefore.
- It may also have a negative impact for CORE-17285 "Realtek HD Audio" but Oleg Dubinsky accepted to tolerate that and aims to approach it differently. I will resolve that as WontFix now.
This reverts commit 0.4.15-dev-791-g
6d7ebc2048
It was a workaround just. To bypass sysaudio. It had a very positive effect on
our playback performance, but using the different codepaths did also lead to
regressions, that I have no idea how to address, therefore I think it's my
personal responsibility to revert it. I guess it's better to improve on the
code-paths that we intend to use finally, instead of fixing what will
be dead paths in the future.
The revert will fix:
- CORE-17277 crash of dsound:duplex on "GCCLin_x86 on Test VBox"
- CORE-17278 crash of dsound:capture on "GCCLin_x86 on Test VBox"
- CORE-17285 Realtek HD Audio does no longer work in ReactOS
But ofc now we will suffer again from very severe things that the hack could workaround:
- CORE-13202 Unhandled exception from wdmaud.drv when recording sound in Scratch 1.4 leads to app-crash
- CORE-13488 A deadlock in "DiabloII" character selection screen and "The Lion King II"
- CORE-8726/CORE-9986/CORE-16564 AC97 driver from rapps will need reboot-orgies again, does not longer
work in the same session that we installed the driver
- CORE-9981 "DosBox + Commander Keen6" totally garbled sound output instead of music
"ScummVM 2.0 with Monkey Island 2" totally garbled sound output instead of music
- the test execution times of "GCCLin_x86 on Test VBox" will almost double
By taking alternative code-paths in WdmAud and bypassing Sysaudio.
This relies on the patch 0.4.15-dev-765-g
b8e936a57b
It fixes the following bugs/regressions:
-CORE-13202 Unhandled exception from wdmaud.drv when recording sound in Scratch 1.4 leads to app-crash
-CORE-13488 A deadlock in "DiabloII" character selection screen and "The Lion King II"
-CORE-8726/CORE-9986/CORE-16564 AC97 driver is now working in the same session where driver was installed, no reboot-orgies needed anymore
-CORE-9981 almost 100% fixed, DosBox + Commander Keen6 properly plays music instead of garbled output,
same improvement for ScummVM 2.0 with Monkey Island 2
The playback is not yet *entirely* perfect, still a few hiccups now and then, but
by orders of magnitude better than before.
Remove misuse of multithreading and use NtDeviceIoContol with completion apc
callback instead (mirrors usage of WriteFileEx in WdmAudCommitWaveBufferByLegacy).
This fixes a crash caused by race condition. Code was simulating completion
callback using a thread, this resulted in single threaded code being executed
simultaneously by multiple threads.
CORE-17214
There is no need to compile our DLLs as shared libraries since we are
managing symbols exports and imports through spec files.
On my system, this reduces the configure-time by a factor of two.