kcat / openal-soft

OpenAL Soft is a software implementation of the OpenAL 3D audio API.
Other
2.22k stars 536 forks source link

Win32 titles don't boot starting with build CI #834 #1069

Open siteod opened 16 hours ago

siteod commented 16 hours ago

I spent a lot of time running this down tonight. Was having trouble getting DSOAL to work with HL2 since that anniversary patch came out the other day. The nightly c++ rewrite actions weren't working, the game just wouldn't boot at all.

So tracked down the last build of DSOAL that worked and it's this one, 639 https://github.com/ThreeDeeJay/dsoal/actions/runs/11647580176 , using builds 640 and after and the game won't boot. I doubled checked this against my install of Deus Ex: Invisible War (the only other win32 game I have installed at the moment), same thing, 639 works, 640 and after don't.

After this I went over to the action builds here, found the builds with the same timestamps as DSOAL and sure enough (renaming soft_oal.dll to dsoal-aldrv.dll) open-al soft build CI 833 https://github.com/kcat/openal-soft/actions/runs/11644123389 lets the games boot, builds CI 834 https://github.com/kcat/openal-soft/actions/runs/11653844554 and after do not.

kcat commented 4 hours ago

The commits added between those CI builds is 5fb231f73b28aadb35daa7552307011a8cb3ec4c, 13f681b50c72c78c92d4ba06fe5bfd41db13c0d4, f8725ecefd6e95d1e08d6fffdbacd361d1baa67a, and 492dab4a42083ad849ca9f3db745be68d151d4ac, but two of those don't actually do anything to the DLL, leaving only these two commits: 5fb231f73b28aadb35daa7552307011a8cb3ec4c and f8725ecefd6e95d1e08d6fffdbacd361d1baa67a. And neither of those really change much.

What happens with the newer version? Do you get some kind of error message? Are you able to create a trace log (set ALSOFT_LOGLEVEL to 3 and ALSOFT_LOGFILE to a path+filename to write it to)? It may also help to create a DSOAL trace log (set DSOAL_LOGLEVEL to 3 and DSOAL_LOGFILE to a path+filename to write it to).

siteod commented 3 hours ago

With 834+ when trying to run HL2 Steam will briefly change the green Play button to blue Stop, the cursor will change to the loading ring, then about a second later steam changes back to Play. The game window never opens, it just doesn't boot. DX:IW similarly will change the mouse cursor to the loading ring after double clicking the exe, but no window ever opens and the cursor returns to normal a second later. No error message pops up in a window to click okay on or anything like that.

Here's the error files for HL2 alsoft_error.txt dsoal_error.txt

kcat commented 1 hour ago

I see what the error is:

[ALSOFT] (II) Found option output-limiter = "false"
terminate called after throwing an instance of 'std::invalid_argument'
  what():  stoll

I'm surprised Windows isn't bringing up a message window or crash dialog about an unhandled exception, rather than just silently quitting.

Anyway, when checking an option value for a bool option, if it finds a value it will check if it's "on", "yes", "true", or a non-0 number, and interpret it as true. Previously it used the C function strtoll to try to convert it to a number to test against 0, and strtoll would return 0 if it couldn't be converted (e.g. if it was "off", "no", "false", etc, or a literal 0, strtoll would return 0 and interpret it as false). But more recently it was changed to use the C++ function stoll, which is more or less the same except it takes a std::string instead of const char*, and gives back an index instead of a pointer to the first unconverted character. The other difference is it throws an exception if it can't do any conversion, or if the converted value is too large, rather than returning whatever and setting errno.

It shouldn't be hard to fix. In the mean time, you can replace any setting using false (or off, no, etc) with 0 to work around the problem for now.

kcat commented 14 minutes ago

Should be fixed with commit b27ef50c5d8b32321527d453145fcaeaa1803755.