kcat / openal-soft

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

Bioshock EAX support #1001

Open kcajjones opened 5 months ago

kcajjones commented 5 months ago

Using OpenAL Soft v1.23.1 with Bioshock (classic). Game has working audio but in-game EAX toggle is greyed out. Log file shows: [ALSOFT] (EE) EAXSet [EAX_FX_SLOT] Flags out of range (value: 3; min: 0; max: 1)

Full log here: bioshock.log

Game is listed as using EAX 5.0 which, as far as I know, every implementation has been using Creative's OpenAL.

ThreeDeeJay commented 2 months ago

Someone in our server who's been testing games in an XP rig with an X-Fi Titanium Fatal1ty Champion may have confirmed my suspicion: There's just no EAX reverb in BioShock (original or remaster) and instead just uses FMOD for it. Just like in my experiments, he didn't notice any difference in the reverb whether the in-game EAX option was enabled or disabled, though he did notice it improved the amount of sounds that could be played at once, so I guess that's the only important benefit from the "EAX" option (actually just DS3D/OAL), besides virtualizing the game's surround mix (no 3D audio either, even in Stereo mode).

@kcat do these lines tell you anything about what the game's doing with EAX? My only guess is that they're actually disabling/bypassing the control panel system-wide EAX (now that would be ironic) because even with boost=12 I just don't hear any difference in places where FMOD's reverb would kick in.

DSOAL:

47b8:trace:dsound:DSBufferProp_Set (065DD03C)->(EAXPROPERTYID_EAX40_FXSlot0, 0x5, 00000000, 0, 006FCF40, 4)
47b8:trace:dsound:DSBufferProp_Set (065DD03C)->(EAXPROPERTYID_EAX40_FXSlot2, 0x1, 00000000, 0, 006FD068, 4)
47b8:trace:dsound:DSBufferProp_Set (065DD03C)->(EAXPROPERTYID_EAX40_FXSlot3, 0x1, 00000000, 0, 006FD068, 4)
47b8:trace:dsound:DSBufferProp_Set (065F506C)->(EAXPROPERTYID_EAX40_FXSlot0, 0x5, 00000000, 0, 006FCD34, 4)
47b8:trace:dsound:DSBufferProp_Set (065E1044)->(EAXPROPERTYID_EAX40_FXSlot0, 0x5, 00000000, 0, 006FCD34, 4)
47b8:trace:dsound:DSBufferProp_Set (065E1044)->(EAXPROPERTYID_EAX40_FXSlot0, 0x1, 00000000, 0, 006FCDC4, 112)
47b8:trace:dsound:DSBufferProp_Set (065E1044)->(EAXPROPERTYID_EAX40_FXSlot0, 0x1, 00000000, 0, 006FCDF4, 112)
47b8:trace:dsound:DSBufferProp_Set (065E1044)->(EAXPROPERTYID_EAX40_FXSlot2, 0x1, 00000000, 0, 006FFC20, 4)
47b8:trace:dsound:DSBufferProp_Set (065E1044)->(EAXPROPERTYID_EAX40_FXSlot3, 0x1, 00000000, 0, 006FFC20, 4)

wrap_oal + DSOAL:

7084:trace:dsound:DSBufferProp_Set (0C7B107C)->(DSPROPSETID_EAX20_ListenerProperties, 0x2, 00000000, 0, 006FCDA8, 4)
7084:trace:dsound:DSBufferProp_Set (0C90507C)->(DSPROPSETID_EAX20_ListenerProperties, 0x2, 00000000, 0, 006FCDD0, 4)
7084:trace:dsound:DSBufferProp_Set (0C908D7C)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDDC, 4)
7084:trace:dsound:DSBufferProp_Set (0C908E7C)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDDC, 4)
7084:trace:dsound:DSBufferProp_Set (0C90517C)->(EAXPROPERTYID_EAX40_FXSlot0, 0x1, 00000000, 0, 006FCDE0, 112)
7084:trace:dsound:DSBufferProp_Set (0C665FE4)->(DSPROPSETID_EAX20_ListenerProperties, 0x2, 00000000, 0, 006FCF5C, 4)
7084:trace:dsound:DSBufferProp_Set (0C6D104C)->(DSPROPSETID_EAX20_ListenerProperties, 0x2, 00000000, 0, 006FCF6C, 4)
7084:trace:dsound:DSBufferProp_Set (077CE7CC)->(DSPROPSETID_EAX20_ListenerProperties, 0x2, 00000000, 0, 006FCDDC, 4)
7084:trace:dsound:DSBufferProp_Set (077D1ECC)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
7084:trace:dsound:DSBufferProp_Set (077D1FCC)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
7084:trace:dsound:DSBufferProp_Set (077D20CC)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
7084:trace:dsound:DSBufferProp_Set (077D21CC)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
7084:trace:dsound:DSBufferProp_Set (077D22CC)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
7084:trace:dsound:DSBufferProp_Set (077D23CC)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
7084:trace:dsound:DSBufferProp_Set (077D24CC)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
7084:trace:dsound:DSBufferProp_Set (077D25CC)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
7084:trace:dsound:DSBufferProp_Set (077CE8CC)->(EAXPROPERTYID_EAX40_FXSlot0, 0x1, 00000000, 0, 006FCDE8, 112)
7084:trace:dsound:DSBufferProp_Set (077CE8CC)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FC788, 32)
7084:trace:dsound:DSBufferProp_Set (077CE9CC)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FC788, 32)
7084:trace:dsound:DSBufferProp_Set (077CEACC)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FC97C, 32)
7084:trace:dsound:DSBufferProp_Set (077CEBCC)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FEB3C, 32)
7084:trace:dsound:DSBufferProp_Set (077CECCC)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FF71C, 32)
7084:trace:dsound:DSBufferProp_Set (077CEDCC)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FF71C, 32)
7084:trace:dsound:DSBufferProp_Set (077CEECC)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FF71C, 32)

wrap_oal + DSOAL (Windows XP compatibility):

45dc:trace:dsound:DSBufferProp_Set (0E0D3D7C)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDDC, 4)
45dc:trace:dsound:DSBufferProp_Set (0E0D3E7C)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDDC, 4)
45dc:trace:dsound:DSBufferProp_Set (0E9F1744)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
45dc:trace:dsound:DSBufferProp_Set (0E9F1844)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
45dc:trace:dsound:DSBufferProp_Set (0E9F1944)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
45dc:trace:dsound:DSBufferProp_Set (0E9F1A44)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
45dc:trace:dsound:DSBufferProp_Set (0E9F1B44)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
45dc:trace:dsound:DSBufferProp_Set (0E9F1C44)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
45dc:trace:dsound:DSBufferProp_Set (0E9F1D44)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
45dc:trace:dsound:DSBufferProp_Set (0E9F1E44)->(EAXPROPERTYID_EAX40_Source, 0x7, 00000000, 0, 006FCDE4, 4)
45dc:trace:dsound:DSBufferProp_Set (0E9EE144)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FC788, 32)
45dc:trace:dsound:DSBufferProp_Set (0E9EE244)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FC788, 32)
45dc:trace:dsound:DSBufferProp_Set (0E9EE344)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FC97C, 32)
45dc:trace:dsound:DSBufferProp_Set (0E9EE444)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FEB3C, 32)
45dc:trace:dsound:DSBufferProp_Set (0E9EE544)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FF71C, 32)
45dc:trace:dsound:DSBufferProp_Set (0E9EE644)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FF71C, 32)
45dc:trace:dsound:DSBufferProp_Set (0E9EE744)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FF71C, 32)
45dc:trace:dsound:DSBufferProp_Set (0E9EE844)->(EAXPROPERTYID_EAX40_Source, 0x1b, 00000000, 0, 006FF71C, 32)

So if this is conclusive evidence of the game not actually using EAX reverb, then I agree we should put this issue to rest.

kcat commented 2 months ago

@kcat do these lines tell you anything about what the game's doing with EAX? My only guess is that they're actually disabling/bypassing the control panel system-wide EAX (now that would be ironic) because even with boost=12 I just don't hear any difference in places where FMOD's reverb would kick in.

It looks like EAX reverb and associated properties are being set. What exactly they're being set to, I have no idea. I see it expressly setting the "Room" listener/fxslot and source property (reverb and send volume), along with a few "all parameters". If the game uses OpenAL natively though, and you're wrapping it through wrap_oal -> DSOAL -> OpenAL Soft, then aside from what they're being set to, there's not much to say what's making these EAX calls (if it's the game trying to set these that are passing through wrap_oal, or if wrap_oal itself is setting them for some reason).

Hiradur commented 2 months ago

Could Bioshock only be using EAX to gain hardware-acceleration for certain effects to take some burden off the CPU (I assume it's mostly single-threaded as most games were at the time)? Or maybe the game would sound slightly different with Creative's driver or on real hardware, e.g. due to voice count, in-circuit sample rate conversion, CMSS-3D or whatever? If EAX is being used, does Bioshock actually manage 3D sounds via OpenAL?

Maybe the listening test shouldn't focus on the behavior of single reverb effects but rather special cases that would make use of more advanced EAX features, such as smoothing between presets, environmental occlusion, environmental panning, multiple simultaneous environmental reverb effects, or special effects like flanger.

Or maybe the EAX option only exists so one can have fun with EAX Voice in Rapture? :clown_face:

ThreeDeeJay commented 1 month ago

Could Bioshock only be using EAX to gain hardware-acceleration for certain effects to take some burden off the CPU (I assume it's mostly single-threaded as most games were at the time)?

@Hiradur The person who tested ran the game on a 3.6 Ghz quad core Ivy Bridge CPU so I doubt the CPU would be the cause for missing sounds, but then again, my general impression is that the game uses FMOD for mixing and OpenAL for output, so I don't understand how hardware accelerated OpenAL output would increase the voice count if that should only be relevant in the FMOD mixing step. Unless it mixes some sounds in FMOD and others in DS3D/OpenAL?

Or maybe the game would sound slightly different with Creative's driver or on real hardware, e.g. due to voice count, in-circuit sample rate conversion, CMSS-3D or whatever?

Yeah, from what I gather, the only difference hardware makes is higher voice count and CMSS-3D when enabled.

If EAX is being used, does Bioshock actually manage 3D sounds via OpenAL?

We're still not sure if EAX is being used or if it was a misconfigured/broken implementation, but we just found no evidence of EAX reverb being used, only those lines in the log that suggest the game is attempting to use EAX for something but we're still not sure what. As for 3D audio, it also seems hopeless. The highest configuration is 7.1 which does get virtualized by CMSS-3D in real hardware, but there's no 3D audio even when set to stereo and headphones everywhere. Maybe if someone finds a way to force FMOD to use its native (back then) DirectSound3D (or OpenAL?) mode for mixing, perhaps we could get 3D audio, but that's just a pipe dream atm.

Maybe the listening test shouldn't focus on the behavior of single reverb effects but rather special cases that would make use of more advanced EAX features, such as smoothing between presets, environmental occlusion, environmental panning, multiple simultaneous environmental reverb effects, or special effects like flanger.

Perhaps, it's hard to tell what's supposed to use EAX, since reverb seems completely handled by FMOD (there's audible reverb even without an OpenAL library detected, which can't be said for EAX reverb, which isn't audible even on hardware X-Fi in XP). But if you want you can check out the part 2 of the Bioshock demo.

Or maybe the EAX option only exists so one can have fun with EAX Voice in Rapture? 🤡

Can't wait to hear myself with EAX reverb while telling AI NPC mod of big daddy to chill after witnessing him go off.

Fischleblubb commented 1 month ago

Hallo, I am new to the discussion but have followed it for a while. I've made a strange observation that might be interesting. But first: I do have an original PCI X-FI Elite-Pro running on my Win 10 machine and used to play with either headphones or 7.1 speakers. Recently I've moved to a smaller flat and now only use a quad-speaker setup. Now the observation: When setting Bioshock's Audio to quad mode, for some reason the reverb seems to be more intense and sometimes different. I then tried the other sound modes, but only quad seems to be different when it comes to the reverb effects.

If you want, I can make a comparison video. I am not sure if this means that quad mode just uses different parameters for some odd reason, or that in quad mode it uses EAX.

Also for some reason, when configuring the game to stereo but the creative console to quad, I get mixed results. The game outputs most SFX only through the front-speakers, but some effects are send to my rear-speakers, these are the flying gun-drones (I don't know what they are called in English) and some water SFX, these even change depending if I am looking up or down, when I activate the elevation effect in the creative console.

I hope this can help, I know quad mode is rarely used so I might be the first to even notice these oddities.

ThreeDeeJay commented 1 month ago

@Fischleblubb That reminds me of Lava's observation in his video

Bioshock has a noticeable problem with its surround sound. Namely, it only seems to work in Quad speakers mode. Everything else just has flat Stereo in CMSS-3D. Even then, rear sounds are too quiet and usually lack EAX effects. You'll also notice that in general, Bioshock has really poor sound design for such a major AAA release. Ambient sounds are either very quiet (the waterfall in one of the lobbies) or just don't exist (most fires). I'd say this was done to emphasize all the Splicer dialogue, but considering both 2 and Infinite have normal ambience, it was probably just laziness.

That said, in my experience, with OpenAL Soft, the 7.1 Surround sound mix works. Rear (channels 5 and 6) and side (7 and 8) are used and don't seem repeated. Audacity_cIvQPejuPF https://mega.nz/file/yGJFnbrB#92c4_54rcwyhmd0dQZDvZ47AJeKh2U-AOlI5xFrfGug

However, now that I paid closer attention, it seems having the "EAX" option disabled (no OpenAL at all) seems to have a better surround mix: Audacity_O9VaQO35eX https://mega.nz/file/3fQAwABa#rV7gv01a4CUZMSL5JJ9Gy0ntl97UzbLr2YhK4A-ttls Notice the presence of Center (channel 3) and LFE (channel 4, which seems like a full-range downmix), and also there's more channel contrast/uniqueness that seems to improve the surround mix. Also note that there's still (non-EAX) reverb (given that option isn't disabled), but maybe when using OpenAL, it actually applies EAX/EFX reverb on top of the mix, which already has reverb? That'd be kinda lazy and could explain why the positioning sounds more diffuse and there's so much "leak" compared to the version without EAX/OpenAL Soft. I'll have to compare it to wrap_oal (Generic Software) and maybe also ALchemy/DSOAL (Generic Hardware)🤔

Also I wonder why the front channel is missing with OpenAL Soft even though the game already uses it. Perhaps it's getting mixed into the Left and Right channels, either by the game/FMOD, or there might be a bug in OpenAL/Soft, maybe related to this which I don't even have enabled 👀 💦 https://github.com/kcat/openal-soft/blob/76e4ebb81115257b806e89e53c3a39a7821f972d/alsoftrc.sample#L225-L231

kcat commented 1 month ago

Notice the presence of Center (channel 3) and LFE (channel 4, which seems like a full-range downmix), and also there's more channel contrast/uniqueness that seems to improve the surround mix.

The 7.1 mix from OpenAL Soft excludes the LFE and front center channels from the 3D mix, because the remaining 6 provide a near-perfect uniform hexagonal layout that works really well for first- and second-order ambisonic playback (and LFE is excluded because most speaker systems can automatically feed the subwoofer from the low frequencies present in the other channels that the speakers can't handle, so filling the LFE from the 3D mix will be doubling-up on the bass output). The front-stablizer option can generate a front-center signal, which can help for sounds intended to be locked to the front-center of the viewer (e.g. non-panned dialog), but it could subtly interfere with normal sounds that pan in front.

Since ambisonics uses all available speakers to pan a sound, with the goal being to de-emphasize the individual speakers and create more consistent panning (e.g. a sound being at +30 degrees is just as sharp and clear as a sound at -124 degrees, barring any natural head occlusion, essentially trying to make the speakers invisible), there will be more coherence between channels. The more "contrast" there is between speakers, the more emphasized the individual speakers will be, which can be a problem if you want smooth panning.

Incidentally, I do see a consistently stronger signal in the front channels in both of those displays. That would suggest the sounds are being stereo mixed, with the reverb being applied in surround sound from that stereo mix, as other comments suggested might be happening. Though without hearing for myself or seeing what's going on during that section of audio, that's just conjecture (maybe that part of the game just has a lot of front-focused sound, maybe not).

ThreeDeeJay commented 1 month ago

@kcat Ambisonics makes more sense for 3D audio, but in this case the game's already providing OpenAL Soft with an surround mix, so wouldn't we get better externalization/positioning if we bypassed ambisonics and just directly applied HRTF (or pass-through surround if using speakers)?

I think smooth/consistent panning would matter more in very controlled scenarios like a 360 panning test, but I think an alternative to improve it would be specifying custom virtual speaker/emitter angles so they match the game's surround mix in case it's different to what OpenAL Soft HRTF currently uses. The ITU-R BS: 775 standard loosely suggests the side and rear speakers to be placed between 60° and 150° but different games/engines use different angles, e.g. The Last of Us: Remastered (or maybe just this particular test) used 30°-90°-135°, Source engine seems to use 45° (at least for emitters), HeSuVi HRIRs vary and personally I prefer 30°-90°-150° to emphasize the side-rear difference, but I still think we should try to take advantage of 3D HRTFs to match the game's angles, though they're not easy to find (maybe it could be extrapolated from the waveform gaps/fades in a recording where the player steadily rotates next to a constant sound/tone?).

kcat commented 1 month ago

@kcat Ambisonics makes more sense for 3D audio, but in this case the game's already providing OpenAL Soft with an surround mix, so wouldn't we get better externalization/positioning if we bypassed ambisonics and just directly applied HRTF (or pass-through surround if using speakers)?

By default HRTF output bypasses ambisonics and applies HRTF filters directly for panning, except for effects processing. For surround output, it is possible to do pass-through, but the app has to explicitly set it using AL_SOFT_direct_channels_remix. There are reasons you may not want to pass-through, for instance if you have a 5.1 mix with quad output (or vice-versa), OpenAL Soft will pan the 5.1 channels to their appropriate location (so the surrounds are correctly panned to +/-110 degrees and the fronts to +/-30 degrees, rather than being forced to +/-135 and +/-45 to fit the quad). The app can also use AL_SOFT_source_spatialize to dynamically downmix and spatialize multi-channel sounds, which needs to use the main panner, and OpenAL can't know if it'll be used before it's used. So if a surround source used pass-through to surround speakers by default, then the app enabled spatialization for the source during playback, there'd be a problem (if I was smart, I would've restricted changing properties like that while the source was playing, but restricting it now could break apps).

I think smooth/consistent panning would matter more in very controlled scenarios like a 360 panning test, but I think an alternative to improve it would be specifying custom virtual speaker/emitter angles so they match the game's surround mix in case it's different to what OpenAL Soft HRTF currently uses.

The multichannel formats are intended to play back sounds authored for the standard surround sound layouts, with the note that standards give some leeway to account for practical considerations in the ability to place speakers in household settings (your living room or computer space may not have the room to place speakers at specific angles relative to the listener). If the app wants virtual speakers placed more specifically, it should do something like what the Source engine does (or the LAF player example); use a separate source for each channel which can be precisely placed around the listener. The Source engine is doing it right to play back a locally-mixed surround stream through OpenAL with specific virtual speaker placements (alternatively it could do a B-Format mix and avoid formats that depend on virtual speakers, but DSound doesn't support that).

Hiradur commented 1 month ago

Not sure if it would be worth the effort, but would it be possible to add a game-compat option that tells OpenAL to apply AL_SOFT_direct_channels_remix by default? However, should the app then use EAX/EFX reverb, what would the behavior be?

When setting Bioshock's Audio to quad mode, for some reason the reverb seems to be more intense and sometimes different. I then tried the other sound modes, but only quad seems to be different when it comes to the reverb effects.

According to this list it wouldn't be the first game from that era that only enables DS3D/OpenAL output for a higher speaker count.

I would give Bioshock a listen in surround myself since I have a 4.1 setup, too. However, I was unable to make it work without issues in Wine so far.

ThreeDeeJay commented 1 month ago

@kcat So does OpenAL Soft know when it's dealing with a surround mix like this or does it just see a bunch of individual objects, that happen to be virtual speakers? And if so, could it be possible for OpenAL Soft to log when it's using channel-based virtualization as opposed to object-based spatialization? That'd be handy to track down those lazy games that pretend to have 3D audio when it's just virtual surround, especially if we could know the angles requested by the game, if any. Because for games with anti-cheat, it's probably safer to just use system-wide surround virtualization like HeSuVi since DSOAL/OpenAL Soft DLLs could be flagged like MetaAudio.

@Hiradur Are you referring to snd_legacy_surround “1”, set in-game to 4 or more speakers? That's for Source engine which is really weird. By default (snd_legacy_surround “0”) it does output 5.1 (or rather 5.0 since LFE is mute?) surround rZyAaoZ snd_legacy_surround “1” (the default/only mode in pre-2013 builds) just outputs surround via DirectSound3D, which made sense in XP for CMSS-3D to virtualize surround, and nowadays requires a wrapper like DSOAL/ALchemy, but the mix is kinda bizarre. It resembles 7.1 Surround, but the LFE and FC are mute like in Bioshock and I'm not sure if they're excluded by OpenAL Soft like kcat mentioned, or if the game just repurposes them to add side channels (since the game still reports only 6 channels when running soundinfo even in 7.1 Surround, which is another scam) 🤔 SlqYWYm

But yeah, if a game's surround mix is limited to, say, 4.0/5.1 Surround, using object-based DS3D/OAL could add 7.1 Surround output.

kcat commented 1 month ago

Not sure if it would be worth the effort, but would it be possible to add a game-compat option that tells OpenAL to apply AL_SOFT_direct_channels_remix by default? However, should the app then use EAX/EFX reverb, what would the behavior be?

It would be possible, but I don't know how useful it would be. Non-mono sounds should sound fine on surround sound systems (direct channels would be better for appropriate outputs, but I don't think it would be too significant), and it would break virtual surround sound with HRTF/headphones.

If the sound also uses EAX/EFX effects, the effect will receive a virtual speaker mix of the sound (only the dry path is affected by the direct channels property).

@kcat So does OpenAL Soft know when it's dealing with a surround mix like this or does it just see a bunch of individual objects, that happen to be virtual speakers?

Using mono sources to play individual channels of a multichannel sound, OpenAL only sees the individual sources, it doesn't know what they're playing or that they're correlated in such a way. It would be impractical to try and detect if a set of sources are playing different parts of the same multichannel sound.

snd_legacy_surround “1” (the default/only mode in pre-2013 builds) just outputs surround via DirectSound3D, which made sense in XP for CMSS-3D to virtualize surround, and nowadays requires a wrapper like DSOAL/ALchemy, but the mix is kinda bizarre. It resembles 7.1 Surround, but the https://github.com/kcat/openal-soft/issues/1001#issuecomment-2387988939 and I'm not sure if they're excluded by OpenAL Soft like kcat mentioned, or if the game just repurposes them to add side channels (since the game still reports only 6 channels when running soundinfo even in 7.1 Surround, which is another scam) 🤔

If the game uses mono 3D sources to play its mix over virtual speakers, OpenAL Soft would exclude front center since, as far as it knows, it's just playing 5 3D sounds. You can use the front-stablizer config option to get front sound on the front-center channel.

mirh commented 1 month ago

It still doesn't trigger OpenAL in Men of Valor (even with the router and "Audigy" device or my X-Fi or with XP compat)

Mhh so, look.. I even got UE explorer fixed to browse the game files, but for the absolute love of me I couldn't find a single place where that UseHardwareSound is hooked. So until somebody can figure that out I'd put it on hold before drawing conclusions.

I see it expressly setting the "Room" listener/fxslot and source property (reverb and send volume), along with a few "all parameters"

Mhh, would it be possible for the logs to explicitly label them then? Like stoneroom, hangar and whatnot..

btw I noticed something interesting in Bioshock:

Are the EAX2 calls recurrent? Or do they just happen once? Alas we don't have the sources for Creative's wrap_oal but it may just be some wacky tortuous conditional they have.

As for the reminder it checks out once you remember you are talking about FMOD_OUTPUTTYPE_WASAPI, FMOD_OUTPUTTYPE_DSOUND and FMOD_OUTPUTTYPE_OPENAL which of course are very different. Then, even without debugger knowledge, I think it might be possible to know who does which call by hex editing the respective GUIDs in the exe/dlls?

I also tried to run both games in my XP VM but they keep crashing on startup/main menu. 😔

No shit the remaster doesn't work.. As for the original did you try with dsoal-XP? Or ALchemy with HOAL (uh, lol, or ALchemy with dsoal-XP). Ironically enough the only crash reasons on PCGW are indeed sound related.

Anyway, It seems that Fallout 3 uses DirectSound3D (as well as New Vegas), or at least that's what they say on the web. It's very strange because these games came out in late 2008 and late 2010 respectively.

It's not strange at all? Windows isn't ios and doesn't force you to use the latest and newest tech (and certainly they have never been technological trailblazers over at zenimax). It's not like there was even a straightforward replacement until 2008, lol. Btw fallout is one of the few games that as I noted can still give you surround with software buffers (unclear if by sheer luck of Vista managing to go through their checks, or if because they purposefully went back to code the newfound support like e.g. Valve)

I know this is not the right place, maybe this issue should be closed because it is completely off topic now.

It is and I'm blown away by you reporting a literal standalone bug here. Go over to dsoal. p.s. every bugthesda game is broken without mods and would need a remake

There's just no EAX reverb in BioShock (original or remaster) and instead just uses FMOD for it.

I don't know why you are so fixated on it. It's an "use reverb" button (period, nothing else specified) and an "use creative eax audio" button (which we also know word of god said is a generic openal toggle). It's legitimate to ask "what of EAX would they even use to put the label there", but yes even just more voices could be it.

The person who tested ran the game on a 3.6 Ghz quad core Ivy Bridge CPU so I doubt the CPU would be the cause for missing sounds

He didn't say that, but just why in 2007 "many assumptions could have had a different premise than today" (lower cpu overhead is literally advertised in the fmod headers as giving lower cpu overhead). In this case, for as much as we know despite being 100% completely capable of doing everything, it might be it's only with openal that they decided to uncap the maximum number of sounds.

Unless it mixes some sounds in FMOD and others in DS3D/OpenAL?

That may be possible too, if diabolical (but who knows when the game development team isn't the one developing the audio engine, let alone when they are entering the uncharted waters of a novel backend).

According to this list it wouldn't be the first game from that era that only enables DS3D/OpenAL output for a higher speaker count.

That doesn't make much (or any) sense. After having a look at the source 2007 code, it's just that they don't even apply DSBCAPS_CTRL3D below 4 speakers, perhaps due to some clumsy ancient inertia concern for performance (even because I understand that up to stereo it's all a cakewalk to get handled by directsound with just one primary buffer, but to go higher you need n mono secondary buffers). And it's likely something along the same lines for wwise too. But it's not like they change the whole api underneath.

That's for Source engine which is really weird. By default (snd_legacy_surround “0”) it does output 5.1 (or rather 5.0 since LFE is mute?) surround

I couldn't make much sense of what this so-called "interleaved" mode does (except skipping the whole IDirectSound3DBuffer8 and setting position/orientation things.. so maybe it is to have the mix be done internally?), but FWIW with XP compatibility that should be using hardware buffers.

kcat commented 1 month ago

Mhh, would it be possible for the logs to explicitly label them then? Like stoneroom, hangar and whatnot..

It wouldn't be terribly reliable, as it would depend on floating-point equality, where a value can be different but have no perceptible difference, and the values of properties that may not be relevant can make comparisons fail. It would be better to just print out the values being set, but that would cause significant log spam as those values are constantly being set while the app is running, which is why I'm hesitant to add logging for it. The logging system could use more nuanced options to log more specific things to focus on, though I don't want it to add too much overhead when not used.

ThreeDeeJay commented 3 weeks ago

Are the EAX2 calls recurrent? Or do they just happen once?

@mirh I saw 5 repeating "chunks", though only near the top of the log: dsoal_error_wrap+X-Fi.txt

As for the original did you try with dsoal-XP?

Same crash, even though DSOAL-XP works fine in RightMark 3D Sound.

Or ALchemy with HOAL (uh, lol, or ALchemy with dsoal-XP)

ALchemy refuses to load anything (including sens and soft with the mod to load it in ALchemy on Windows ), even Creative Software 3D Library apparently.

Using Creative Software 3D Library
DirectSoundCreate8 : Failed to initialize Creative ALchemy, falling back to dsound.dll

In addition to: Native Device not default when using DSOAL-XP's dsoal-aldrv.dll as ct_oal.dll (probably because it lacks the AL device = sound card which I use to allow OpenAL Soft on ALchemy on Win11. Failed to open Device when using sens_oal.dll as ct_oal.dll Not to mention this warning, which might mean ALchemy relies on something present only in Vista+, or the above just failed because the installer didn't get a chance to set something up (though I do know at least dsound.dll does get loaded): vmplayer_maxBKt1dgr

I don't know why you are so fixated on it. It's an "use reverb" button (period, nothing else specified) and an "use creative eax audio" button (which we also know word of god said is a generic openal toggle). It's legitimate to ask "what of EAX would they even use to put the label there", but yes even just more voices could be it.

The manual explicitly mentions EAX effects and 3D performance (whatever that even means, since we've seen 3D audio positioning mentioned by even Creative themselves but AFAIK it's still just surround feed from FMOD which I guess might just mean 2D surround virtualization) in addition to higher voice count. So I'm just annoyed at the exaggerated capabilities as advertised, that's all.

Not only does it deliver immersive EAX® ADVANCED HD™ effects with superior audio fidelity, it also gives you high voice counts – playing multiple sounds simultaneously – and ultra fast 3D performance.

Unless it mixes some sounds in FMOD and others in DS3D/OpenAL?

That may be possible too, if diabolical (but who knows when the game development team isn't the one developing the audio engine, let alone when they are entering the uncharted waters of a novel backend).

@kcat Is there a way to check whether some sounds are being handled by OpenAL, separately from FMOD? Bioshock logs.zip