Files
BT411/engine/MUNGA/AUDCMP.h
T
arcattackandClaude Opus 4.8 847b9b85cd Audio: target the step-intensity send at FOOTSTEP sources only (task #50)
The output-filtered broadcast still fed EVERY volume/brightness mixer -- the
always-on ambience pulse's own volume mixer got cranked to step intensity on
every stride ('a stuck button', 3/s, loud).  The send now identifies footstep
sources by authored patch (FootFallInt/Ext: bank2 37-39, bank1 106/107) through
mixer->GetTargetComponent() -> AudioSource -> PatchResource LOD bank/patch
(new accessors: GetTargetComponent, GetBankID/GetPatchID,
AudioResource::PeekAudioLevelOfDetail).

Also: step intensity curve raised (speed/25, floor 0.55 -- a mech stomp is
never subtle; it was firing at ~0.4 gain and masked under 0.9-gain layers,
heard as an unrecognizable 'orchestral hit').

Verified: FootFallInt at 0.78 gain in the live tape; the ambience pulse back
to its brief authored form (absent from 1/s snapshots).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-16 08:36:28 -05:00

733 lines
18 KiB
C++

#pragma once
#include "style.h"
#include "audio.h"
#include "audloc.h"
#include "average.h"
#include "audtime.h"
//##########################################################################
//######################## AudioMessageWatcher #######################
//##########################################################################
class AudioMessageWatcher:
public AudioComponent
{
public:
//
//-----------------------------------------------------------------------
// Constructor, Destructor
//-----------------------------------------------------------------------
//
AudioMessageWatcher(
PlugStream *stream,
Entity *entity
);
~AudioMessageWatcher();
Logical
TestInstance() const;
//
//-----------------------------------------------------------------------
// BuildFromPage
//-----------------------------------------------------------------------
//
static void
BuildFromPage(
PlugStream *stream,
NameList *name_list,
ClassID class_ID,
ObjectID object_ID
);
//
//-----------------------------------------------------------------------
// MessageTapScanCallback
//-----------------------------------------------------------------------
//
void
MessageTapScanCallback(
Receiver::Message *message,
Receiver *receiver
);
//
//-----------------------------------------------------------------------
// Controller methods
//-----------------------------------------------------------------------
//
void
ReceiveControl(
AudioControlID control_ID,
AudioControlValue control_value
);
private:
//
//-----------------------------------------------------------------------
// Controller methods
//-----------------------------------------------------------------------
//
virtual Logical
DoesMessageMatch(Receiver::Message*)
{return True;}
//
//-----------------------------------------------------------------------
// Private Data
//-----------------------------------------------------------------------
//
SlotOf<AudioComponent*>
audioComponentSocket;
AudioControlID controlID;
AudioControlValue controlValue;
MessageTap *messageTap;
#if DEBUG_LEVEL>0
Receiver *verifyReceiver;
Receiver::MessageID verifyMessageID;
#endif
};
//##########################################################################
//############### AudioControlsButtonMessageWatcher ##################
//##########################################################################
class AudioControlsButtonMessageWatcher:
public AudioMessageWatcher
{
public:
//
//-----------------------------------------------------------------------
// Constructor, Destructor
//-----------------------------------------------------------------------
//
AudioControlsButtonMessageWatcher(
PlugStream *stream,
Entity *entity
);
~AudioControlsButtonMessageWatcher();
private:
//
//-----------------------------------------------------------------------
// Controller methods
//-----------------------------------------------------------------------
//
Logical
DoesMessageMatch(Receiver::Message*);
};
//##########################################################################
//######################### AudioControlSend #########################
//##########################################################################
class AudioControlSend:
public AudioComponent
{
public:
//
//--------------------------------------------------------------------
// Construction, Destruction, Testing
//--------------------------------------------------------------------
//
AudioControlSend(
PlugStream *stream,
Entity *entity
);
~AudioControlSend();
//
//--------------------------------------------------------------------
// BuildFromPage
//--------------------------------------------------------------------
//
static void
BuildFromPage(
PlugStream *stream,
NameList *name_list,
ClassID class_ID,
ObjectID object_ID
);
//
//--------------------------------------------------------------------
// Controller methods
//--------------------------------------------------------------------
//
void
ReceiveControl(
AudioControlID control_ID,
AudioControlValue control_value
);
};
//##########################################################################
//####################### AudioControlSplitter #######################
//##########################################################################
class AudioControlSplitter:
public AudioComponent
{
public:
//
//--------------------------------------------------------------------
// Construction, Destruction, Testing
//--------------------------------------------------------------------
//
AudioControlSplitter(
PlugStream *stream,
Entity *entity
);
void
AudioControlSplitterX(Entity *entity);
~AudioControlSplitter();
Logical
TestInstance() const;
//
//--------------------------------------------------------------------
// BuildFromPage
//--------------------------------------------------------------------
//
static void
BuildFromPage(
PlugStream *stream,
NameList *name_list,
ClassID class_ID,
ObjectID object_ID
);
//
//--------------------------------------------------------------------
// Controller methods
//--------------------------------------------------------------------
//
void
ReceiveControl(
AudioControlID control_ID,
AudioControlValue control_value
);
private:
//
//--------------------------------------------------------------------
// Private data
//--------------------------------------------------------------------
//
SChainOf<AudioComponent*> audioComponentSocket;
};
//##########################################################################
//####################### AudioControlMixer ##########################
//##########################################################################
#define AUDIO_CONTROL_MIXER_MAX_CONTROLS (4)
class AudioControlMixer:
public AudioComponent
{
public:
// DIAG/game-facing: expose the authored output control so game-side control
// broadcasts (the foot-plant intensity send) can target only volume/brightness
// mix stages and never Start-outputting stages.
AudioControlID GetOutputControlID() const { return outputControlID; }
AudioComponent *GetTargetComponent() { return audioComponentSocket.GetCurrent(); }
//
//--------------------------------------------------------------------
// Construction, Destruction, Testing
//--------------------------------------------------------------------
//
AudioControlMixer(
PlugStream *stream,
Entity *entity
);
void
AudioControlMixerX(
AudioComponent *audio_component,
Entity *entity,
AudioControlID first_input_control_ID,
AudioControlID last_input_control_ID,
AudioControlID output_control_ID
);
~AudioControlMixer();
Logical
TestInstance() const;
//
//--------------------------------------------------------------------
// BuildFromPage
//--------------------------------------------------------------------
//
static void
BuildFromPage(
PlugStream *stream,
NameList *name_list,
ClassID class_ID,
ObjectID object_ID
);
//
//--------------------------------------------------------------------
// Controller methods
//--------------------------------------------------------------------
//
void
ReceiveControl(
AudioControlID control_ID,
AudioControlValue control_value
);
private:
//
//--------------------------------------------------------------------
// Private data
//--------------------------------------------------------------------
//
SlotOf<AudioComponent*>
audioComponentSocket;
AudioControlValue
controlValueArray[AUDIO_CONTROL_MIXER_MAX_CONTROLS];
AudioControlID
firstInputControlID;
int
numberOfInputs;
AudioControlID
outputControlID;
};
//##########################################################################
//###################### AudioControlMultiplier ######################
//##########################################################################
#define AUDIO_CONTROL_MULTIPLIER_MAX_CONTROLS (4)
class AudioControlMultiplier:
public AudioComponent
{
public:
// DIAG/game-facing: expose the authored output control so game-side control
// broadcasts (the foot-plant intensity send) can target only volume/brightness
// mix stages and never Start-outputting stages.
AudioControlID GetOutputControlID() const { return outputControlID; }
AudioComponent *GetTargetComponent() { return audioComponentSocket.GetCurrent(); }
//
//--------------------------------------------------------------------
// Construction, Destruction, Testing
//--------------------------------------------------------------------
//
AudioControlMultiplier(
PlugStream *stream,
Entity *entity
);
void
AudioControlMultiplierX(
AudioComponent *audio_component,
Entity *entity,
AudioControlID first_input_control_ID,
AudioControlID last_input_control_ID,
AudioControlID output_control_ID
);
~AudioControlMultiplier();
Logical
TestInstance() const;
//
//--------------------------------------------------------------------
// BuildFromPage
//--------------------------------------------------------------------
//
static void
BuildFromPage(
PlugStream *stream,
NameList *name_list,
ClassID class_ID,
ObjectID object_ID
);
//
//--------------------------------------------------------------------
// Controller methods
//--------------------------------------------------------------------
//
void
ReceiveControl(
AudioControlID control_ID,
AudioControlValue control_value
);
private:
//
//--------------------------------------------------------------------
// Private data
//--------------------------------------------------------------------
//
SlotOf<AudioComponent*>
audioComponentSocket;
AudioControlValue
controlValueArray[AUDIO_CONTROL_MULTIPLIER_MAX_CONTROLS];
AudioControlID
firstInputControlID;
int
numberOfInputs;
AudioControlID
outputControlID;
};
//##########################################################################
//######################## AudioControlSmoother ######################
//##########################################################################
class AudioControlSmoother:
public AudioComponent
{
public:
//
//--------------------------------------------------------------------
// Construction, Destruction, Testing
//--------------------------------------------------------------------
//
AudioControlSmoother(
PlugStream *stream,
Entity *entity
);
void
AudioControlSmootherX(
AudioComponent *audio_component,
Entity *entity,
AudioControlID control_ID
);
~AudioControlSmoother();
Logical
TestInstance() const;
//
//--------------------------------------------------------------------
// BuildFromPage
//--------------------------------------------------------------------
//
static void
BuildFromPage(
PlugStream *stream,
NameList *name_list,
ClassID class_ID,
ObjectID object_ID
);
//
//--------------------------------------------------------------------
// Controller methods
//--------------------------------------------------------------------
//
void
ReceiveControl(
AudioControlID control_ID,
AudioControlValue control_value
);
private:
//
//--------------------------------------------------------------------
// Private data
//--------------------------------------------------------------------
//
SlotOf<AudioComponent*>
audioComponentSocket;
AverageOf<AudioControlValue>
audioControlAverage;
AudioControlID
controlID;
};
//##########################################################################
//####################### AudioResourceSelector ######################
//##########################################################################
class AudioResourceIndex;
class AudioResourceSelector:
public AudioComponent
{
public:
//
//--------------------------------------------------------------------
// Construction, Destruction, Testing
//--------------------------------------------------------------------
//
AudioResourceSelector(
PlugStream *stream,
Entity *entity
);
void
AudioResourceSelectorX(
AudioSource *audio_source,
Entity *entity,
AudioResourceIndex *audio_resource_index,
AudioControlID control_ID,
AudioControlValue min_control_value,
AudioControlValue max_control_value,
Logical dump_value
);
~AudioResourceSelector();
Logical
TestInstance() const;
//
//--------------------------------------------------------------------
// BuildFromPage
//--------------------------------------------------------------------
//
static void
BuildFromPage(
PlugStream *stream,
NameList *name_list,
ClassID class_ID,
ObjectID object_ID
);
//
//--------------------------------------------------------------------
// Controller methods
//--------------------------------------------------------------------
//
void
ReceiveControl(
AudioControlID control_ID,
AudioControlValue control_value
);
private:
//
//--------------------------------------------------------------------
// Private data
//--------------------------------------------------------------------
//
SlotOf<AudioComponent*>
audioSourceSocket;
AudioResourceIndex
*audioResourceIndex;
AudioControlID
controlID;
AudioControlValue
minControlValue,
maxControlValue;
Logical
dumpValue;
};
//##########################################################################
//######################## AudioSampleAndHold ########################
//##########################################################################
class AudioSampleAndHold:
public AudioComponent
{
public:
//
//-----------------------------------------------------------------------
// Construction, Destruction, Testing
//-----------------------------------------------------------------------
//
AudioSampleAndHold(
PlugStream *stream,
Entity *entity
);
void
AudioSampleAndHoldX(
AudioComponent *audio_component,
Entity *entity,
AudioControlID audio_control_ID,
const AudioTime &sample_duration,
Scalar min_value,
Scalar max_value
);
~AudioSampleAndHold();
//
//-----------------------------------------------------------------------
// BuildFromPage
//-----------------------------------------------------------------------
//
static void
BuildFromPage(
PlugStream *stream,
NameList *name_list,
ClassID class_ID,
ObjectID object_ID
);
//
//--------------------------------------------------------------------
// Execute
//--------------------------------------------------------------------
//
void
Execute();
//
//-----------------------------------------------------------------------
// Controller methods
//-----------------------------------------------------------------------
//
void
ReceiveControl(
AudioControlID control_ID,
AudioControlValue control_value
);
private:
//
//-----------------------------------------------------------------------
// Private methods
//-----------------------------------------------------------------------
//
void
SampleAndHold();
//
//-----------------------------------------------------------------------
// Private data
//-----------------------------------------------------------------------
//
SlotOf<AudioComponent*>
audioComponentSocket;
AudioControlID
audioControlID;
AudioControlValue
minValue,
maxValue,
currentValue;
AudioTime
nextSampleTime,
sampleDuration;
};
//##########################################################################
//############################# AudioLFO #############################
//##########################################################################
enum AudioLFOWaveForm
{
SinusoidalAudioLFOWaveForm = 0,
TriangularAudioLFOWaveForm = 1
};
inline MemoryStream&
MemoryStream_Read(
MemoryStream *stream,
AudioLFOWaveForm *ptr
)
{return stream->ReadBytes(ptr, sizeof(*ptr));}
inline MemoryStream&
MemoryStream_Write(
MemoryStream *stream,
const AudioLFOWaveForm *ptr
)
{return stream->WriteBytes(ptr, sizeof(*ptr));}
class AudioLFO:
public AudioComponent
{
public:
//
//-----------------------------------------------------------------------
// Construction, Destruction, Testing
//-----------------------------------------------------------------------
//
AudioLFO(
PlugStream *stream,
Entity *entity
);
void
AudioLFOX(
AudioComponent *audio_component,
Entity *entity,
AudioControlID audio_control_ID,
AudioLFOWaveForm wave_form,
Scalar the_period,
AudioControlValue min_value,
AudioControlValue max_value,
Logical dump_value
);
~AudioLFO();
//
//-----------------------------------------------------------------------
// BuildFromPage
//-----------------------------------------------------------------------
//
static void
BuildFromPage(
PlugStream *stream,
NameList *name_list,
ClassID class_ID,
ObjectID object_ID
);
//
//--------------------------------------------------------------------
// Execute
//--------------------------------------------------------------------
//
void
Execute();
//
//-----------------------------------------------------------------------
// Controller methods
//-----------------------------------------------------------------------
//
void
ReceiveControl(
AudioControlID control_ID,
AudioControlValue control_value
);
private:
//
//-----------------------------------------------------------------------
// Private methods
//-----------------------------------------------------------------------
//
void
Generate();
//
//-----------------------------------------------------------------------
// Private data
//-----------------------------------------------------------------------
//
SlotOf<AudioComponent*>
audioComponentSocket;
AudioControlID
audioControlID;
AudioLFOWaveForm
waveForm;
AudioControlValue
minValue,
maxValue;
AudioTime
period;
AudioTime
startTime;
Logical
dumpValue;
};