OpenGothic icon indicating copy to clipboard operation
OpenGothic copied to clipboard

Add new music backend

Open lmichaelis opened this issue 1 year ago • 21 comments

This PR adds a new, experimental music backend recently created at GothicKit/dmusic. It can be enabled by changing the "Soundprovider" option in the sound settings to "GothicKit (Experimental)".

Note @Try: I am having really weird multithreading issues on Fedora. It's likely they are not caused by OpenGothic (since std::recursive_mutex should be fine) but because of them I am having a hard time properly testing everything. It should be mostly okay now though. (specifically: the Kernel keeps semi-predictably sending SIGKILL to the process making the cause impossible to easily debug)

lmichaelis avatar May 03 '24 11:05 lmichaelis

the Kernel keeps semi-predictably sending SIGKILL to the process

What do you mean by "semi-predictably"? Do you have a steps to reproduce?

Try avatar May 03 '24 21:05 Try

the Kernel keeps semi-predictably sending SIGKILL to the process

What do you mean by "semi-predictably"? Do you have a steps to reproduce?

Nope, I don't. It just starts happening randomly in the codebase and then persists at the same that until I debug it enough, then it starts working again. For example, the game plays the gamestart sound bite which requires it to load a WAV from the resources. Doing that, you lock a Resources-internal mutex, which I narrowed the crash down to. As soon as a tried to figure out where in libc(++) it fails by stepping into it with a debugger it stops crashing any everything is fine again. When I restart, the crash is then gone.

This happened in different places too but when and when it happens is a mystery to me.

lmichaelis avatar May 04 '24 05:05 lmichaelis

Hi @lmichaelis, I'm having issues trying to compile your branch, could I do something better?

Checked out lmichaelis/feat/new-music-system + git pull --recurse-submodules and I get these ZenKit compilation errors: https://pastebin.com/g6uARWui

This is on Fedora 40, gcc (GCC) 14.0.1 20240411

Nindaleth avatar May 08 '24 07:05 Nindaleth

Hi @lmichaelis, I'm having issues trying to compile your branch, could I do something better?

Checked out lmichaelis/feat/new-music-system + git pull --recurse-submodules and I get these ZenKit compilation errors: https://pastebin.com/g6uARWui

This is on Fedora 40, gcc (GCC) 14.0.1 20240411

Heyo, looks like your compiler is trying to compile for C++14, rather than >= C++17. Have you tried resetting your CMake cache and recompiling?

lmichaelis avatar May 08 '24 08:05 lmichaelis

I've disabled ccache, removed the OpenGothic build directory entirely, I even tried to recreate with cmake -B build -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo -DCMAKE_CXX_STANDARD=17 -DCXX_STANDARD=17, but the issue stays the same.

Are these missing fuctions specifically C++17 additions? From my log it may be misleading but I think there's no mention of the C++ standard used, it's just by chance that the current compiler major version is 14, this GCC implements C++20 except for modules and almost all of C++23, should be new enough:

$ ll /usr/include/c++/
drwxr-xr-x. root root   4 B  Fri May  3 10:47:44 2024 ./
drwxr-xr-x. root root 6.9 KB Fri May  3 10:47:33 2024 ../
drwxr-xr-x. root root 1.9 KB Fri May  3 10:38:48 2024 14/

$ rpm -qf /usr/include/c++/14
libstdc++-devel-14.0.1-0.15.fc40.x86_64

$ whatdepends libstdc++ | grep ^gcc
gcc-c++-0:14.0.1-0.15.fc40.x86_64
gcc-gdb-plugin-0:14.0.1-0.15.fc40.x86_64
gcc-plugin-annobin-0:14.0.1-0.15.fc40.x86_64

Nindaleth avatar May 08 '24 09:05 Nindaleth

Maybe it's this? https://gcc.gnu.org/gcc-14/porting_to.html:

Header dependency changes

Some C++ Standard Library headers have been changed to no longer include other headers that were being used internally by the library. As such, C++ programs that used standard library components without including the right headers will no longer compile.

The following headers are used less widely in libstdc++ and may need to be included explicitly when compiling with GCC 14:

<algorithm> (for std::copy_n, std::find_if, std::lower_bound, std::remove, std::reverse, std::sort etc.) <cstdint> (for std::int8_t, std::int32_t etc.)

Nindaleth avatar May 08 '24 09:05 Nindaleth

Indeed, sticking #include <algorithm> into Internal.hh and into Mesh.hh (as a quick hackfix) does allow the compilation to finish.

Nindaleth avatar May 08 '24 10:05 Nindaleth

Sorry for posting too much, one last post. Going to Valley of Mines and switching the sound provider results in this:

Switching music provider to 'GothicKit'
[dmusic] DmBand: Downloading instruments for band 'Ingame'
[dmusic] DmRiff: Chunk LIST:[adtl] not fully parsed, 16 bytes remaining
[dmusic] DmRiff: Chunk LIST:[adtl] not fully parsed, 16 bytes remaining
[dmusic] DmBand: Instrument patch 1:10 not found in band 'DLS_Metronom'
[dmusic] DmBand: Instrument patch 1:19 not found in band 'DLS_Rare'
[dmusic] DmBand: Downloading instruments for band 'Ingame'
[dmusic] DmBand: Instrument patch 1:10 not found in band 'DLS_Metronom'
[dmusic] DmBand: Instrument patch 1:19 not found in band 'DLS_Rare'
[dmusic] DmLoader: Automatic download of segment 'owd_daystd.sgt' succeeded
malloc(): unaligned tcache chunk detected

Thread 5 "threaded-ml" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffe56006c0 (LWP 69657)]
(anonymous namespace)::LoadSamples<(FmtType)1> (dstSamples=..., dstOffset=<optimized out>, src=<optimized out>, srcOffset=<optimized out>, srcChans=<optimized out>, srcStep=2, samples=965) at /home/black_fox/src/OpenGothic/lib/Tempest/Engine/thirdparty/openal-soft/core/voice.cpp:236
236	            al::LoadSampleArray<Type>(dst+dstOffset, s, srcStep, samples);
Missing separate debuginfos, use: dnf debuginfo-install dbus-libs-1.14.10-3.fc40.x86_64 elfutils-libelf-0.191-4.fc40.x86_64 expat-2.6.2-1.fc40.x86_64 flac-libs-1.4.3-4.fc40.x86_64 fmt-10.2.1-4.fc40.x86_64 glibc-2.39-8.fc40.x86_64 gsm-1.0.22-6.fc40.x86_64 lame-libs-3.100-17.fc40.x86_64 libX11-1.8.9-1.fc40.x86_64 libX11-xcb-1.8.9-1.fc40.x86_64 libXau-1.0.11-6.fc40.x86_64 libXcursor-1.2.1-7.fc40.x86_64 libXfixes-6.0.1-3.fc40.x86_64 libXrender-0.9.11-6.fc40.x86_64 libasyncns-0.8-28.fc40.x86_64 libatomic-14.0.1-0.15.fc40.x86_64 libcap-2.69-8.fc40.x86_64 libdrm-2.4.120-3.fc40.x86_64 libedit-3.1-50.20230828cvs.fc40.x86_64 libffi-3.4.4-7.fc40.x86_64 libgcc-14.0.1-0.15.fc40.x86_64 libogg-1.3.5-8.fc40.x86_64 libsndfile-1.2.2-2.fc40.x86_64 libstdc++-14.0.1-0.15.fc40.x86_64 libvorbis-1.3.7-10.fc40.x86_64 libwayland-client-1.22.0-3.fc40.x86_64 libxcb-1.17.0-1.fc40.x86_64 libxshmfence-1.3.2-3.fc40.x86_64 libzstd-1.5.6-1.fc40.x86_64 llvm-libs-18.1.1-1.fc40.x86_64 mangohud-0.7.1-3.fc40.x86_64 mesa-vulkan-drivers-24.0.6-2.fc40.x86_64 mpg123-libs-1.31.3-4.fc40.x86_64 ncurses-libs-6.4-12.20240127.fc40.x86_64 opus-1.5.1-1.fc40.x86_64 systemd-libs-255.4-1.fc40.x86_64 vulkan-loader-1.3.280.0-1.fc40.x86_64 xz-libs-5.4.6-3.fc40.x86_64 zlib-ng-compat-2.1.6-2.fc40.x86_64
(gdb) bt
#0  (anonymous namespace)::LoadSamples<(FmtType)1> (dstSamples=..., dstOffset=<optimized out>, src=<optimized out>, srcOffset=<optimized out>, srcChans=<optimized out>, srcStep=2, samples=965) at /home/black_fox/src/OpenGothic/lib/Tempest/Engine/thirdparty/openal-soft/core/voice.cpp:236
#1  (anonymous namespace)::LoadSamples (dstSamples=..., dstOffset=<optimized out>, src=<optimized out>, srcOffset=<optimized out>, srcType=<optimized out>, srcChans=FmtStereo, srcStep=2, samples=965) at /home/black_fox/src/OpenGothic/lib/Tempest/Engine/thirdparty/openal-soft/core/voice.cpp:254
#2  0x00007ffff7bbb30c in (anonymous namespace)::LoadBufferCallback (buffer=<optimized out>, numCallbackSamples=<optimized out>, sampleType=<optimized out>, sampleChannels=<optimized out>, srcStep=<optimized out>, samplesLoaded=<optimized out>, samplesToLoad=965, voiceSamples=...)
   at /home/black_fox/src/OpenGothic/lib/Tempest/Engine/thirdparty/openal-soft/core/voice.cpp:318
#3  Voice::mix (this=0x20dd8f8, vstate=Voice::Stopping, Context=Context@entry=0x1aadce0, deviceTime=..., deviceTime@entry=std::chrono::duration = { 60433333333ns }, SamplesToDo=SamplesToDo@entry=1024) at /home/black_fox/src/OpenGothic/lib/Tempest/Engine/thirdparty/openal-soft/core/voice.cpp:685
#4  0x00007ffff7b8149a in (anonymous namespace)::ProcessContexts (device=0x20dd2e8, SamplesToDo=<optimized out>) at /home/black_fox/src/OpenGothic/lib/Tempest/Engine/thirdparty/openal-soft/alc/alu.cpp:1868
#5  DeviceBase::renderSamples (this=this@entry=0x111abe0, numSamples=<optimized out>) at /home/black_fox/src/OpenGothic/lib/Tempest/Engine/thirdparty/openal-soft/alc/alu.cpp:2073
#6  0x00007ffff7b828d8 in DeviceBase::renderSamples (this=<optimized out>, outBuffer=0x7fffdc000040, numSamples=1024, frameStep=<optimized out>) at /home/black_fox/src/OpenGothic/lib/Tempest/Engine/thirdparty/openal-soft/alc/alu.cpp:2132
#7  0x00007ffff7b9b3eb in (anonymous namespace)::PulsePlayback::streamWriteCallback (this=0x1167610, stream=0x1282810, nbytes=0) at /home/black_fox/src/OpenGothic/lib/Tempest/Engine/thirdparty/openal-soft/alc/backends/pulseaudio.cpp:680
#8  operator() (__closure=0x0, stream=0x1282810, nbytes=<optimized out>, pdata=0x1167610) at /home/black_fox/src/OpenGothic/lib/Tempest/Engine/thirdparty/openal-soft/alc/backends/pulseaudio.cpp:979
#9  _FUN () at /home/black_fox/src/OpenGothic/lib/Tempest/Engine/thirdparty/openal-soft/alc/backends/pulseaudio.cpp:979
#10 0x00007ffff4882c25 in pa_command_request () from /lib64/libpulse.so.0

Nindaleth avatar May 08 '24 11:05 Nindaleth

Indeed, sticking #include <algorithm> into Internal.hh and into Mesh.hh (as a quick hackfix) does allow the compilation to finish.

Thanks! I'll fix it asap.

Sorry for posting too much, one last post. Going to Valley of Mines and switching the sound provider results in this

Could you turn on trace logging for dmusic in main.cpp and post the output?

lmichaelis avatar May 08 '24 12:05 lmichaelis

Could you turn on trace logging for dmusic in main.cpp and post the output?

Sure, here it is:

Switching music provider to 'GothicKit'
[dmusic] DmLoader: Loading segment 'owd_daystd.sgt'
[dmusic] DmLoader: Loading style '_OldWorld.sty'
[dmusic] DmBand: Downloading instruments for band 'Ingame'
[dmusic] DmLoader: Loading DLS collection 'DLS_Bass.dls'
[dmusic] DmRiff: Chunk LIST:[adtl] not fully parsed, 16 bytes remaining
[dmusic] DmRiff: Chunk LIST:[adtl] not fully parsed, 16 bytes remaining
[dmusic] DmBand: DLS instrument 'Bass_L' assigned to channel 0 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Bass_R' assigned to channel 1 for band 'Ingame'
[dmusic] DmLoader: Loading DLS collection 'DLS_Flute.dls'
[dmusic] DmBand: DLS instrument 'Flute_L' assigned to channel 2 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Flute_R' assigned to channel 3 for band 'Ingame'
[dmusic] DmLoader: Loading DLS collection 'DLS_Harp.dls'
[dmusic] DmBand: DLS instrument 'Harp_Mono' assigned to channel 4 for band 'Ingame'
[dmusic] DmLoader: Loading DLS collection 'DLS_Strings.dls'
[dmusic] DmBand: DLS instrument 'Strings_L' assigned to channel 5 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Strings_R' assigned to channel 6 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Strings_L' assigned to channel 7 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Strings_R' assigned to channel 8 for band 'Ingame'
[dmusic] DmLoader: Loading DLS collection 'DLS_Metronom.dls'
[dmusic] DmBand: Instrument patch 1:10 not found in band 'DLS_Metronom'
[dmusic] DmLoader: Loading DLS collection 'DLS_Piano.dls'
[dmusic] DmBand: DLS instrument 'Piano_L' assigned to channel 10 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Piano_R' assigned to channel 11 for band 'Ingame'
[dmusic] DmLoader: Loading DLS collection 'DLS_Guitar.dls'
[dmusic] DmBand: DLS instrument 'Guitar_Mono' assigned to channel 12 for band 'Ingame'
[dmusic] DmLoader: Loading DLS collection 'DLS_Brass.dls'
[dmusic] DmBand: DLS instrument 'Brass_L' assigned to channel 13 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Brass_R' assigned to channel 14 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Brass_L' assigned to channel 15 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Brass_R' assigned to channel 16 for band 'Ingame'
[dmusic] DmLoader: Loading DLS collection 'DLS_Daduk.dls'
[dmusic] DmBand: DLS instrument 'Daduk_L' assigned to channel 17 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Daduk_R' assigned to channel 18 for band 'Ingame'
[dmusic] DmLoader: Loading DLS collection 'DLS_Alpenhorn.dls'
[dmusic] DmBand: DLS instrument 'Alpenhorn_L' assigned to channel 19 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Alpenhorn_R' assigned to channel 20 for band 'Ingame'
[dmusic] DmLoader: Loading DLS collection 'DLS_Percussions.dls'
[dmusic] DmBand: DLS instrument 'Percussion_L' assigned to channel 21 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Percussion_R' assigned to channel 22 for band 'Ingame'
[dmusic] DmLoader: Loading DLS collection 'DLS_Rare.dls'
[dmusic] DmBand: DLS instrument 'Rare_L' assigned to channel 23 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Rare_R' assigned to channel 24 for band 'Ingame'
[dmusic] DmBand: Instrument patch 1:19 not found in band 'DLS_Rare'
[dmusic] DmLoader: Loading DLS collection 'DLS_Organ.dls'
[dmusic] DmBand: DLS instrument 'Organ_L' assigned to channel 26 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Organ_R' assigned to channel 27 for band 'Ingame'
[dmusic] DmBand: Downloading instruments for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Bass_L' assigned to channel 0 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Bass_R' assigned to channel 1 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Flute_L' assigned to channel 2 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Flute_R' assigned to channel 3 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Harp_Mono' assigned to channel 4 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Strings_L' assigned to channel 5 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Strings_R' assigned to channel 6 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Strings_L' assigned to channel 7 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Strings_R' assigned to channel 8 for band 'Ingame'
[dmusic] DmBand: Instrument patch 1:10 not found in band 'DLS_Metronom'
[dmusic] DmBand: DLS instrument 'Piano_L' assigned to channel 10 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Piano_R' assigned to channel 11 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Guitar_Mono' assigned to channel 12 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Brass_L' assigned to channel 13 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Brass_R' assigned to channel 14 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Brass_L' assigned to channel 15 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Brass_R' assigned to channel 16 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Daduk_L' assigned to channel 17 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Daduk_R' assigned to channel 18 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Alpenhorn_L' assigned to channel 19 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Alpenhorn_R' assigned to channel 20 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Percussion_L' assigned to channel 21 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Percussion_R' assigned to channel 22 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Rare_L' assigned to channel 23 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Rare_R' assigned to channel 24 for band 'Ingame'
[dmusic] DmBand: Instrument patch 1:19 not found in band 'DLS_Rare'
[dmusic] DmBand: DLS instrument 'Organ_L' assigned to channel 26 for band 'Ingame'
[dmusic] DmBand: DLS instrument 'Organ_R' assigned to channel 27 for band 'Ingame'
[dmusic] DmLoader: Automatic download of segment 'owd_daystd.sgt' succeeded
malloc(): unaligned tcache chunk detected

Nindaleth avatar May 08 '24 13:05 Nindaleth

Sure, here it is:

Thanks @Nindaleth, but I am unable to replicate the issue. Which distribution of Gothic are you using and how exactly do you trigger the crash? A short video might be helpful for illustration.

lmichaelis avatar May 08 '24 16:05 lmichaelis

Which distribution of Gothic are you using

It's the GOG's Gothic 2 Gold in English, installed from setup_gothic_2_gold_2.7_(14553).exe version.

how exactly do you trigger the crash?

I have MARVIN'd my way into the very beginning of Valley of Mines (it's very easy for me to hear the difference between vanilla and OG), saved there. Then I just load the game and try to switch, nothing really special that could be caught on video.

I start the game like this (then run and no debuginfod) ~/src/OpenGothic $ LD_LIBRARY_PATH=./build/opengothic/ gdb --args /home/black_fox/src/OpenGothic/build/opengothic/Gothic2Notr -g '/home/black_fox/Games/gothic-ii-gold-edition/drive_c/GOG Games/Gothic 2 Gold/' -save 19

save_slot_19.zip

I could upload some of the Gothic's data files into a temporary online storage if that'd help?

Nindaleth avatar May 08 '24 18:05 Nindaleth

Thanks for the explanation. I still can't get this crash to happen though. I do have the GOG version but it does not yield that particular crash. I do still have issues with futexes (at least in debug and debug-release modes) which cause the kernel to kill the OpenGothic process.

I could upload some of the Gothic's data files into a temporary online storage if that'd help?

Not really, but you could post the sha256sum of OWD_DayStd.sgt and _OldWorld.sty just to compare. Here are mine:

22920c08480e6b20a41bcf566cb6720fb6d7898510d92b45c4a439c891a0761c  /mnt/games/Gothic/Gothic26DE/_work/Data/Music/newworld/OWD_DayStd.sgt
045177911583ab7e8f397ed40a0b62bd0ae24bbfa3e7d73b2bd6a67c0eb97b07  /mnt/games/Gothic/Gothic26DE/_work/Data/Music/newworld/_OldWorld.sty

lmichaelis avatar May 09 '24 06:05 lmichaelis

Bump zenkit and dmusic

FYI: I've bumped ZenKit on master, so you can rebase

Try avatar May 09 '24 16:05 Try

Not really, but you could post the sha256sum of OWD_DayStd.sgt and _OldWorld.sty just to compare. Here are mine:

Files on my install are matching your sha256sums completely. My issue was elsewhere and it was self-inflicted.

Since the original issues compiling I had tried setting a newer C++ standard in OpenAL vendored lib in case it would force the rest of the codebase onto that older standard - which turned out to be bogus because it was caused by a change in behaviour of GCC 14. That was the sole source of trouble; after reverting this change and recompiling I don't have get any more crashes on switching the audio provider. There's still a few mentions of missing instrument patches in the log just like before, but with the tracing on I'm now also getting lots of

[dmusic] DmPerformance(Message): time=41009 type=control-change channel=1 control=11 value=0.454053

and the music plays, audibly different compared to the OG sound provider. Hooray!

Nindaleth avatar May 09 '24 21:05 Nindaleth

Hello there!

Finally got to code-review stuff :) What is the current status on this PR? Is it still work-in-progress or issues are non-blocking and we can proceed to merge?

Try avatar Jun 26 '24 22:06 Try

The issues should be non-blocking from my POV. Feel free to change things directly in this branch if you want/need to ;)

lmichaelis avatar Jun 27 '24 16:06 lmichaelis

@lmichaelis

While testing today run into a crash:

                                                                                                                                                                          
                                                                                                                                                                          
1   tsf_channel_note_off_all                                                                                                          tsf.h           1898 0x7ff87b107910 
2   DmSynth_sendNoteOffAll                                                                                                            Synth.c         305  0x7ff87b100d06 
3   DmSynth_sendNoteOffEverything                                                                                                     Synth.c         314  0x7ff87b100d3c 
4   DmPerformance_playPattern                                                                                                         Performance.c   624  0x7ff87b0fe413 
5   DmPerformance_handleCommandMessage                                                                                                Performance.c   676  0x7ff87b0fe66b 
6   DmPerformance_handleMessage                                                                                                       Performance.c   792  0x7ff87b0feb4a 
7   DmPerformance_renderPcm                                                                                                           Performance.c   930  0x7ff87b0ff207 
8   GameMusic::GothicKitMusicProvider::renderSound                                                                                    gamemusic.cpp   210  0x7ff76174f56b 
9   Tempest::SoundEffect::Impl::renderSound                                                                                           soundeffect.cpp 84   0x7fffe6fd818b 
10  Tempest::SoundEffect::Impl::bufferCallback                                                                                        soundeffect.cpp 78   0x7fffe6fd81db 
11  Voice::mix                                                                                                                        voice.cpp       933  0x7fffe6ed29c1 
12  (anonymous namespace)::ProcessContexts                                                                                            alu.cpp         1991 0x7fffe6e730bf 
13  DeviceBase::renderSamples                                                                                                         alu.cpp         2191 0x7fffe6e73bbd 
14  DeviceBase::renderSamples                                                                                                         alu.cpp         2251 0x7fffe6e74041 
15  (anonymous namespace)::WasapiPlayback::mixerProc                                                                                  wasapi.cpp      1222 0x7fffe6e961a2 
16  std::__invoke_impl<int, int ((anonymous namespace)::WasapiPlayback:: * const&)(), (anonymous namespace)::WasapiPlayback *>        invoke.h        74   0x7fffe6ea3f2f 
17  std::__invoke<int ((anonymous namespace)::WasapiPlayback:: * const&)(), (anonymous namespace)::WasapiPlayback *>                  invoke.h        96   0x7fffe6ea3e0f 
18  std::_Mem_fn_base<int ((anonymous namespace)::WasapiPlayback:: *)(), true>::operator()<(anonymous namespace)::WasapiPlayback *>   functional      131  0x7fffe6ea3d1d 
19  std::__invoke_impl<int, std::_Mem_fn<int ((anonymous namespace)::WasapiPlayback:: *)()>, (anonymous namespace)::WasapiPlayback *> invoke.h        61   0x7fffe6ea3c12 
20  std::__invoke<std::_Mem_fn<int ((anonymous namespace)::WasapiPlayback:: *)()>, (anonymous namespace)::WasapiPlayback *>           invoke.h        96   0x7fffe6ea3ae8 
...                                                                                                                                                              

Setup: -g2 -w addonworld.zen Variables view at the time of crash suggests, that one of DmSynthChannel::fount points to uninitialized data (or just corrupted pointer)

Other issues:

  • Track "On the Way to Monastery" doesn't sound right at all
  • Area with pyramids is also sound odd
  • Default soundtrack in G2 newworld.zen sound smooth but doesn't match OpenGothic-sound. Almost as-if different soundtrack been picked
  • Transitions between tracks, doesn't appear to have randomization; and plays transition as-if it's combat mode
  • Sound volume is inconsistent between tracks: main menu in G1 is very quiet, but game sounds normal

Try avatar Jun 27 '24 22:06 Try

Hm I've failed to reproduce the issue on Linux. I will try again on Windows (hopefully) this weekend. As for the playback issues: That's why we've got the new system as an option, don't we :) I've written them down and I'll look into them soon.

lmichaelis avatar Jun 28 '24 15:06 lmichaelis

That's why we've got the new system as an option, don't we :)

Correct, just need to sort out crash issue, rest is FYI :)

Try avatar Jul 01 '24 22:07 Try

Hm I've failed to reproduce the issue on Linux.

Debug crash today a bit. Issue here is a call to DmSynthFontArray_add, at time between font was cached and used. In many cases due to how allocator works, address of font was same, but in addonworld.zen one of soundtracks has about 26 font resulting into a crash.

// My quick fix
diff --git a/src/Synth.c b/src/Synth.c
index a1bde22..8905fc8 100644
--- a/src/Synth.c
+++ b/src/Synth.c
@@ -86,7 +87,19 @@ static DmResult DmSynth_updateFonts(DmSynth* slf, DmBand* band) {
                        tsf_set_output(new_fnt.syn, TSF_STEREO_INTERLEAVED, (int) slf->rate, 0);
                        tsf_set_volume(new_fnt.syn, slf->volume);

-                       rv = DmSynthFontArray_add(&slf->fonts, new_fnt);
+      if (slf->channels_len>0) {
+        DmSynthFont* prev = slf->fonts.data;
+        rv = DmSynthFontArray_add(&slf->fonts, new_fnt);
+        if (rv != DmResult_SUCCESS)
+          return rv;
+        ptrdiff_t offset = (slf->fonts.data - prev);
+        for(size_t r=0; r<slf->channels_len; ++r) {
+          slf->channels[r].font += offset; // HACK with pointer offsets
+          }
+        Dm_report(DmLogLevel_INFO, "font = %p", slf->fonts);
+        } else {
+        rv = DmSynthFontArray_add(&slf->fonts, new_fnt);
+        }
                        if (rv != DmResult_SUCCESS) {
                                return rv;
                        }

Try avatar Jul 01 '24 23:07 Try

Good catch! I've added the fix :+1:

lmichaelis avatar Jul 15 '24 14:07 lmichaelis

Seem to work well now - merged!

Try avatar Jul 15 '24 21:07 Try