Audio Phase 1 (AUDIO_FIDELITY F3/F4/F10/F15/F18/F20 + KB): the quick wins
F3 distance: alDistanceModel(AL_NONE); restored the commented authored distance multiply in Dynamic3D::CalculateSourceVolumeScale, added the same override to Static3D, dropped the (now inert) AL_MAX_DISTANCE writes. Far battle audio follows the authored knee/rolloff curve again, and the volume cull / voice steal / ducking chains are distance-aware. F4 volume law: AL_GAIN = volume_scale^2 at all 3 per-frame sites (Direct/ Dyn3D/Static3D) -- the GM CC7 squared curve; linear was ~+6 dB at mids. F10 doppler: alDopplerFactor(0) (AL's model ran wrong constants + sign- inverted velocity: approaching sources pitched DOWN); the AUTHORED dopplerCents (AUDIO.INI range/speed-of-sound model, decomp-proven consumer part_008.c:7466) now adds into the Dynamic3D pitch chain. F15 ConfigureActivePress: published at the MechSubsystem BASE (binary id 2, descriptor @0x50de5c -> +0x110); renamed the misnamed vitalSubsystemIndex member (the weapon ConfigureMappables handler already drives it 0/-1). Removed the invented Sensor/Myomers duplicates and RESTORED their byte- exact layouts (0x328/0x358 allocs + asserts). MechWeapon's pinned-id pad absorbed the +1 chain shift -- which matches the binary's own numbering. F18 cook-off warning: AmmoBin FireCountdownStarted -> the existing cookOffArmed @0x18C (binary table @0x512600); the countdown klaxon can fire. F20 zoom blip: L4MechControlsMapper publishes TargetRangeExponent -> the live @0x1a4 zoom member (own table chained to MechControlsMapper). KB: replaced the bogus divisionParameters+0x10 rate read with SystemClock::GetTicksPerSecond() (FUN_0044e19c is GetFrameRate -- original audio frames were CLOCK TICKS). Regression (35s drive+fire): stable; ConfigureActivePress binds real on all 9 subsystems (idle -1, zero pad redirects); FireCountdownStarted + TargetRangeExponent bind live members; attrnull 53 -> 41; chirp still dead; footfalls still fire (gain now correctly squared). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
05cb3f5549
commit
fc7f311771
+34
-18
@@ -1106,8 +1106,7 @@ void
|
||||
<< " vol=" << volume_scale << "\n" << std::flush; }
|
||||
for (int i=0; i < channelSet.count; i++)
|
||||
{
|
||||
alSourcef(channelSet.sources[i],AL_MAX_DISTANCE,audio_location->getMaxDistance(audio_head));
|
||||
alSourcef(channelSet.sources[i], AL_GAIN, volume_scale);
|
||||
alSourcef(channelSet.sources[i], AL_GAIN, volume_scale * volume_scale); // FIDELITY F4: CC7 squared law (linear was ~+6 dB at mid volumes)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1439,6 +1438,13 @@ void
|
||||
|
||||
pitch_offset = CalculateSourcePitchOffset();
|
||||
|
||||
// FIDELITY (AUDIO_FIDELITY.md F10): the AUTHORED doppler (AUDIO.INI
|
||||
// doppler_range/speed_of_sound -> AudioLocation::dopplerCents, computed each
|
||||
// spatial update) -- the decomp proves the original added it to the pitch
|
||||
// cents on THIS dynamic path (part_008.c:7466). AL's own doppler is now
|
||||
// disabled (it ran with wrong constants and a sign-inverted velocity feed).
|
||||
pitch_offset += GetAudioLocation()->GetDopplerCents();
|
||||
|
||||
double relativePitch = pow(2.0,pitch_offset/1200.0);
|
||||
Clamp(relativePitch,0.5,2.0);
|
||||
{ // apply the combined control-chain + note pitch per frame
|
||||
@@ -1456,9 +1462,8 @@ void
|
||||
for (int i=0; i < channelSet.count; i++)
|
||||
{
|
||||
alSource3f(channelSet.sources[i],AL_POSITION,pos.x,pos.y,pos.z);
|
||||
alSourcef(channelSet.sources[i], AL_GAIN, volume_scale);
|
||||
alSourcef(channelSet.sources[i], AL_GAIN, volume_scale * volume_scale); // FIDELITY F4: CC7 squared law (linear was ~+6 dB at mid volumes)
|
||||
alSource3f(channelSet.sources[i],AL_VELOCITY,-relative_velocity.x,-relative_velocity.y,-relative_velocity.z);
|
||||
alSourcef(channelSet.sources[i],AL_MAX_DISTANCE,audio_location->getMaxDistance(audio_head));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1477,22 +1482,18 @@ AudioControlValue
|
||||
//
|
||||
Scalar
|
||||
volume_scale = L4AudioSource::CalculateSourceVolumeScale();
|
||||
return volume_scale;
|
||||
|
||||
//
|
||||
// Update the spatial model that will result in the value
|
||||
// for distance related volume attenuation
|
||||
//
|
||||
/*Check(application);
|
||||
Check(application->GetAudioRenderer());
|
||||
UpdateSpatialModel(application->GetAudioRenderer()->GetAudioHead());
|
||||
|
||||
//
|
||||
// Apply distance attenuation to the volume scale
|
||||
//
|
||||
// FIDELITY (AUDIO_FIDELITY.md F3): apply the AUTHORED distance attenuation
|
||||
// (AUDIO.INI knee/rolloff curve, computed into distanceVolumeScale on every
|
||||
// spatial update). This multiply was commented out and AL_LINEAR_DISTANCE
|
||||
// substituted -- far sounds faded on a straight line to zero instead of the
|
||||
// authored 1/(1+(k(d-knee))^2) curve, and the volume-based cull / voice
|
||||
// steal / ducking chains were distance-blind. AL's model is now AL_NONE.
|
||||
//
|
||||
Check(GetAudioLocation());
|
||||
volume_scale *= GetAudioLocation()->GetDistanceVolumeScale();
|
||||
return volume_scale;*/
|
||||
return volume_scale;
|
||||
}
|
||||
|
||||
//#############################################################################
|
||||
@@ -1682,6 +1683,22 @@ void
|
||||
// StartRequest(this);
|
||||
}
|
||||
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
//
|
||||
AudioControlValue
|
||||
Static3DPatchSource::CalculateSourceVolumeScale()
|
||||
{
|
||||
Check(this);
|
||||
// FIDELITY (AUDIO_FIDELITY.md F3): same authored distance attenuation as the
|
||||
// dynamic path -- the spatial model computes distanceVolumeScale per execute.
|
||||
Scalar volume_scale = L4AudioSource::CalculateSourceVolumeScale();
|
||||
Check(GetAudioLocation());
|
||||
volume_scale *= GetAudioLocation()->GetDistanceVolumeScale();
|
||||
return volume_scale;
|
||||
}
|
||||
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
@@ -1992,9 +2009,8 @@ void
|
||||
//Static models have their position freely available as relative positions and stand still
|
||||
for (int i=0; i < channelSet.count; i++)
|
||||
{
|
||||
alSourcef(channelSet.sources[i], AL_GAIN, volume_scale);
|
||||
alSourcef(channelSet.sources[i], AL_GAIN, volume_scale * volume_scale); // FIDELITY F4: CC7 squared law (linear was ~+6 dB at mid volumes)
|
||||
alSource3f(channelSet.sources[i],AL_POSITION,relative_position.x,relative_position.y,relative_position.z);
|
||||
alSourcef(channelSet.sources[i],AL_MAX_DISTANCE,audio_location->getMaxDistance(audio_head));
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user