Files
CydandClaude Fable 5 fdd9ac9d97 Initial import: Tesla Release 4.10 (Tesla:BattleTech & Tesla:Red Planet)
Archival snapshot of the Virtual World Entertainment Tesla cockpit
software, 1994-1996: MUNGA engine and L4 pod layer source (Borland
C++ 5.0), BT/RP game code, and game content (models, audio, maps,
gauges, Division renderer data). Includes third-party libraries:
Division dVS/DPL graphics, HMI SOS audio, WATTCP networking.

Files are preserved byte-for-byte (.gitattributes disables all
line-ending conversion). README.md documents the layout, target
hardware, and toolchain.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 13:21:58 -05:00

700 lines
15 KiB
C++

//===========================================================================//
// File: audsrc.hpp //
// Project: MUNGA Brick: Audio manager //
// Contents: //
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 01/30/95 ECH Initial coding. //
//---------------------------------------------------------------------------//
// Copyright (C) 1994-1995, Virtual World Entertainment, Inc. //
// All Rights reserved worldwide //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
#if !defined(AUDSRC_HPP)
# define AUDSRC_HPP
# if !defined(STYLE_HPP)
# include <style.hpp>
# endif
# if !defined(AUDIO_HPP)
# include <audio.hpp>
# endif
# if !defined(AUDLOC_HPP)
# include <audloc.hpp>
# endif
# if !defined(AUDLVL_HPP)
# include <audlvl.hpp>
# endif
# if !defined(AUDWGT_HPP)
# include <audwgt.hpp>
# endif
# if !defined(AUDTIME_HPP)
# include <audtime.hpp>
# endif
//##########################################################################
//##################### AudioSourceStartState ########################
//##########################################################################
class AudioSourceStartState SIGNATURED
{
public:
AudioSourceStartState();
~AudioSourceStartState();
Logical
TestInstance() const;
void
CalculateDuration(AudioControlValue control_value);
Logical
IsFinishedPlaying();
AudioTime
GetCurrentRunningTime();
void
SetNoteValue(AudioControlValue note_value)
{noteValue = note_value;}
AudioControlValue
GetNoteValue()
{return noteValue;}
void
SetDurationValue(AudioControlValue duration_value);
void
Start()
{startTime = AudioTime::Now();}
private:
AudioControlValue
noteValue;
Logical
isDurationSet;
Logical
hasDuration;
Scalar
duration;
AudioTime
startTime;
AudioTime
endTime;
};
//~~~~~~~~~~~~~~~~~~~~~ AudioSourceStartState inlines ~~~~~~~~~~~~~~~~~~~~~~
inline Logical
AudioSourceStartState::IsFinishedPlaying()
{
Check(this);
if (hasDuration)
{
return (AudioTime::Now() > endTime);
}
return False;
}
inline void
AudioSourceStartState::SetDurationValue(AudioControlValue duration_value)
{
Check(this);
isDurationSet = True;
duration = duration_value;
}
inline AudioTime
AudioSourceStartState::GetCurrentRunningTime()
{
Check(this);
return (AudioTime::Now() - startTime);
}
//##########################################################################
//######################### AudioSource ##############################
//##########################################################################
class AudioSource__RequestMessage;
class AudioSource__StartMessage;
class AudioSource__StopMessage;
class AudioSource:
public AudioComponent
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction, Destruction, and Testing
//
public:
AudioSource(
PlugStream *stream,
Entity *entity
);
void
AudioSource::AudioSourceX(
AudioResource *audio_resource,
AudioLocation *audio_location,
Entity *entity,
AudioSourcePriority priority,
AudioSourceMixPresence mix_presence,
AudioControlValue volume_mix_level,
AudioPitchCents pitch_mix_offset,
AudioControlValue brightness_mix_level,
Logical has_compression_curve,
const AudioTime &compression_duration,
Logical use_brightness_scale,
Logical use_attack_time_scale
);
~AudioSource();
Logical
TestInstance() const;
static void
BuildFromPage(
PlugStream *stream,
NameList *name_list,
ClassID class_ID,
ObjectID object_ID
);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Location methods
//
public:
AudioLocation*
GetAudioLocation();
void
UpdateSpatialModel(AudioHead *audio_head);
Scalar
GetDistanceToSource();
Logical
IsAudioSourceClipped(AudioHead *audio_head);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Resource methods
//
public:
void
SetAudioResource(AudioResource *audio_resource);
AudioResource*
GetAudioResource();
AudioVoiceCount
GetAudioVoiceCount();
AudioRenderType
GetAudioRenderType();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Current State/Status Accessors
//
public:
void
AssignAudioSourceState(AudioSourceState audio_source_state);
AudioSourceState
GetAudioSourceState();
Logical
IsFinishedPlaying();
AudioTime
GetCurrentRunningTime();
AudioControlValue
GetCurrentNoteValue();
AudioControlValue
CalculateSourceAttackVolumeScale();
Logical
UseSourceAttackTime();
AudioControlValue
CalculateSourceAttackTime();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Priority Accessors
//
public:
void
SetAudioSourcePriority(AudioSourcePriority audio_source_priority);
AudioSourcePriority
GetAudioSourcePriority();
AudioWeighting
CalculateAudioWeighting();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Mixing & Logical compression methods
//
public:
AudioSourceMixPresence
GetAudioSourceMixPresence();
void
SetVolumeCompressionScale(AudioControlValue compression_scale);
AudioControlValue
CalculateSourceCompressionEffect();
virtual AudioControlValue
CalculateSourceVolumeScale();
virtual AudioPitchCents
CalculateSourcePitchOffset();
Logical
UseSourceBrightnessScale();
virtual AudioControlValue
CalculateSourceBrightnessScale();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Controller methods
//
public:
void
ReceiveControl(
AudioControlID control_ID,
AudioControlValue control_value
);
virtual void
VolumeAudioHandler(AudioControlValue);
virtual void
PitchAudioHandler(AudioControlValue);
virtual void
BrightnessAudioHandler(AudioControlValue);
virtual void
AttackVolumeAudioHandler(AudioControlValue);
virtual void
AttackTimeAudioHandler(AudioControlValue);
virtual void
NoteAudioHandler(AudioControlValue);
virtual void
DurationAudioHandler(AudioControlValue);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// State implementations
//
public:
virtual void
StartImplementation();
virtual void
StopImplementation();
virtual void
SuspendImplementation();
virtual void
ResumeImplementation();
protected:
virtual void
StartMessageImplementation() {}
virtual void
StopMessageImplementation() {}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Execution
//
public:
Logical
RequiresMaintenance(AudioHead *audio_head);
Logical
CanResume(AudioHead *audio_head);
void
Execute();
protected:
virtual void
ExecuteModel(Logical force_update) {}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Message Support
//
public:
enum {
StartMessageID = AudioComponent::NextMessageID,
StopMessageID,
NextMessageID
};
typedef AudioSource__RequestMessage
RequestMessage;
typedef AudioSource__StartMessage
StartMessage;
typedef AudioSource__StopMessage
StopMessage;
static const HandlerEntry
MessageHandlerEntries[];
static MessageHandlerSet
MessageHandlers;
void
StartMessageHandler(StartMessage *message);
void
StopMessageHandler(StopMessage *message);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Shared Data Support
//
public:
static Derivation
ClassDerivations;
static SharedData
DefaultData;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Private data
//
private:
//
// Location data
//
AudioLocation
*audioLocation;
//
// Resource data
//
AudioResource
*audioResource;
//
// State/Status data
//
AudioSourceState
audioSourceState;
AudioSourceStartState
nextStartState,
currentStartState;
AudioControlValue
attackVolumeScale;
Logical
useAttackTimeScale;
AudioControlValue
attackTimeScale;
//
// Priority data
//
AudioSourcePriority
audioSourcePriority;
//
// Mixing and compression
//
AudioSourceMixPresence
audioSourceMixPresence;
AudioControlValue
volumeCompressionScale;
Logical
hasCompressionCurve;
AudioTime
compressionDuration;
AudioControlValue
volumeMixScale;
AudioPitchCents
pitchMixOffset;
Logical
useBrightnessScale;
AudioControlValue
brightnessMixScale;
AudioControlValue
volumeScale;
AudioPitchCents
pitchOffset;
AudioControlValue
brightnessScale;
//
// Execution
//
AudioFrameCount
nextExecuteFrame;
AudioFrameCount
suspendFinishedFrame;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~ AudioSource inlines ~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Location methods
//
inline AudioLocation*
AudioSource::GetAudioLocation()
{
Check(this);
return audioLocation;
}
inline void
AudioSource::UpdateSpatialModel(AudioHead *audio_head)
{
Check(this);
Check(audioLocation);
audioLocation->UpdateSpatialModel(audio_head);
}
inline Scalar
AudioSource::GetDistanceToSource()
{
Check(this);
Check(audioLocation);
return audioLocation->GetDistanceToSource();
}
inline Logical
AudioSource::IsAudioSourceClipped(AudioHead *audio_head)
{
Check(this);
Check(audioLocation);
return audioLocation->IsAudioLocationClipped(audio_head);
}
//
// Resource methods
//
inline AudioResource*
AudioSource::GetAudioResource()
{
Check(this);
return audioResource;
}
inline AudioVoiceCount
AudioSource::GetAudioVoiceCount()
{
Check(this);
Check(audioResource);
return audioResource->GetVoiceCount();
}
inline AudioRenderType
AudioSource::GetAudioRenderType()
{
Check(this);
Check(audioResource);
return audioResource->GetAudioRenderType();
}
//
// Current State/Status Accessors
//
inline AudioSourceState
AudioSource::GetAudioSourceState()
{
Check(this);
return audioSourceState;
}
inline Logical
AudioSource::IsFinishedPlaying()
{
Check(this);
return currentStartState.IsFinishedPlaying();
}
inline AudioTime
AudioSource::GetCurrentRunningTime()
{
Check(this);
Verify(audioSourceState == RunningAudioSourceState);
return currentStartState.GetCurrentRunningTime();
}
inline AudioControlValue
AudioSource::GetCurrentNoteValue()
{
Check(this);
return currentStartState.GetNoteValue();
}
inline AudioControlValue
AudioSource::CalculateSourceAttackVolumeScale()
{
Check(this);
return attackVolumeScale;
}
inline Logical
AudioSource::UseSourceAttackTime()
{
Check(this);
return useAttackTimeScale;
}
inline AudioControlValue
AudioSource::CalculateSourceAttackTime()
{
Check(this);
return attackTimeScale;
}
//
// Priority Accessors
//
inline void
AudioSource::SetAudioSourcePriority(
AudioSourcePriority audio_source_priority
)
{
Check(this);
audioSourcePriority = audio_source_priority;
}
inline AudioSourcePriority
AudioSource::GetAudioSourcePriority()
{
Check(this);
return audioSourcePriority;
}
inline AudioWeighting
AudioSource::CalculateAudioWeighting()
{
Check(this);
AudioWeighting
audio_weight(
GetAudioSourcePriority(),
CalculateSourceVolumeScale()
);
return audio_weight;
}
//
// Mixing & Logical compression methods
//
inline AudioSourceMixPresence
AudioSource::GetAudioSourceMixPresence()
{
Check(this);
return audioSourceMixPresence;
}
inline void
AudioSource::SetVolumeCompressionScale(
AudioControlValue compression_level
)
{
Check(this);
volumeCompressionScale = compression_level;
}
inline AudioPitchCents
AudioSource::CalculateSourcePitchOffset()
{
Check(this);
return pitchMixOffset + pitchOffset;
}
inline Logical
AudioSource::UseSourceBrightnessScale()
{
Check(this);
return useBrightnessScale;
}
//
// Execute
//
inline Logical
AudioSource::RequiresMaintenance(AudioHead *audio_head)
{
Check(this);
Check(audio_head);
return (nextExecuteFrame <= audio_head->GetAudioFrameCount());
}
inline Logical
AudioSource::CanResume(AudioHead *audio_head)
{
Check(this);
Check(audio_head);
return (suspendFinishedFrame <= audio_head->GetAudioFrameCount());
}
//~~~~~~~~~~~~~~~~~~~~~~ AudioSource__RequestMessage ~~~~~~~~~~~~~~~~~~~~~~~
class AudioSource__RequestMessage:
public Receiver::Message
{
public:
AudioSource__RequestMessage(
Receiver::MessageID id,
size_t message_length,
AudioControlID control_ID,
AudioControlValue control_value
);
AudioControlID
controlID;
AudioControlValue
controlValue;
};
inline AudioSource__RequestMessage::AudioSource__RequestMessage(
Receiver::MessageID message_ID,
size_t message_length,
AudioControlID control_ID,
AudioControlValue control_value
):
Receiver::Message(
message_ID,
message_length
)
{
controlID = control_ID;
controlValue = control_value;
}
//~~~~~~~~~~~~~~~~~~~~~~ AudioSource__StartMessage ~~~~~~~~~~~~~~~~~~~~~~~~~
class AudioSource__StartMessage:
public AudioSource::RequestMessage
{
public:
AudioSource__StartMessage(AudioControlValue control_value);
};
inline AudioSource__StartMessage::AudioSource__StartMessage(
AudioControlValue control_value
):
AudioSource::RequestMessage(
AudioSource::StartMessageID,
sizeof(AudioSource__StartMessage),
StartAudioControlID,
control_value
)
{
}
//~~~~~~~~~~~~~~~~~~~~~~ AudioSource__StopMessage ~~~~~~~~~~~~~~~~~~~~~~~~~~
class AudioSource__StopMessage:
public AudioSource::RequestMessage
{
public:
AudioSource__StopMessage();
};
inline AudioSource__StopMessage::AudioSource__StopMessage():
AudioSource::RequestMessage(
AudioSource::StopMessageID,
sizeof(AudioSource__StopMessage),
StopAudioControlID,
0.0f
)
{
}
#endif