The blind foot-plant broadcast hit every entity-registered component; mixers whose authored OUTPUT control is Start forwarded the send as a Start and fired their sound on every stride (the per-step ProgramButton 'chirp'). Added GetOutputControlID() to AudioControlMixer/Multiplier and the broadcast now feeds only stages outputting Volume(3)/Brightness(5) -- the footstep loudness inputs -- directly (mixers are entity-registered, no splitter hop needed). Verified: FootFallInt01 delivers on BOTH gaits now (11/run, walk input included); ProgramButton deliveries 188 -> 38 (the remainder are authored looped-sequence cockpit ambience, not the broadcast); stable 28s drive+fire. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
731 lines
18 KiB
C++
731 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; }
|
|
|
|
//
|
|
//--------------------------------------------------------------------
|
|
// 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; }
|
|
|
|
//
|
|
//--------------------------------------------------------------------
|
|
// 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;
|
|
};
|