Files
UnrealEngine/Engine/Plugins/Runtime/Harmonix/Source/HarmonixDsp/Private/HarmonixDsp/MusicalAudioBus.cpp
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

82 lines
2.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "HarmonixDsp/MusicalAudioBus.h"
#include "HarmonixDsp/AudioBufferConstants.h"
#include "HarmonixDsp/AudioBufferConfig.h"
using namespace HarmonixDsp;
FMusicalAudioBus::FMusicalAudioBus()
: AudioLevel(0)
, AudioLevelDecay(0)
, SamplesPerSecond(0)
, SecondsPerSample(0)
, Owner(nullptr)
{
}
FMusicalAudioBus::~FMusicalAudioBus()
{
if (Owner)
{
Owner->BusWillDestruct(this);
}
TearDown();
}
void FMusicalAudioBus::Prepare(float InSampleRateHz, uint32 InNumChannels, uint32 InMaxSamples, bool bInAllocateBuffer)
{
Prepare(InSampleRateHz, InNumChannels, EAudioBufferChannelLayout::Raw, InMaxSamples, bInAllocateBuffer);
}
void FMusicalAudioBus::Prepare(float InSampleRateHz, EAudioBufferChannelLayout InChannelLayout, uint32 InMaxSamples, bool bInAllocateBuffer)
{
Prepare(InSampleRateHz, FAudioBuffer::GetNumChannelsInChannelLayout(InChannelLayout), InChannelLayout, InMaxSamples, bInAllocateBuffer);
}
void FMusicalAudioBus::Prepare(float InSampleRateHz, uint32 InNumChannels, EAudioBufferChannelLayout InChannelLayout, uint32 InMaxSamples, bool bInAllocateBuffer)
{
check(InNumChannels <= (uint32)FAudioBuffer::GetNumChannelsInChannelLayout(InChannelLayout));
check(InSampleRateHz > 0.0f);
SamplesPerSecond = (double)InSampleRateHz;
SecondsPerSample = 1.0 / SamplesPerSecond;
AudioLevel = 0;
// for now we don't filter the audio level,
// because we want to give the rawest data
// possible to the clients of the audio level.
// they can filter it if necessary.
AudioLevelDecay = 0.0f;
MaxSamples = InMaxSamples;
NumAudioOutputChannels = InNumChannels;
ChannelLayout = InChannelLayout;
if (MaxSamples > 0 && bInAllocateBuffer)
{
FAudioBufferConfig BufferConfig(ChannelLayout, NumAudioOutputChannels, MaxSamples, InSampleRateHz);
BusBuffer.Configure(BufferConfig, EAudioBufferCleanupMode::Delete);
}
}
void FMusicalAudioBus::SetSampleRate(float InSampleRateHz)
{
check(InSampleRateHz > 0.0f);
SamplesPerSecond = (double)InSampleRateHz;
SecondsPerSample = 1.0 / SamplesPerSecond;
BusBuffer.SetSampleRate(InSampleRateHz);
}
void FMusicalAudioBus::Process(uint32 InSliceIndex, uint32 InSubsliceIndex, TAudioBuffer<float>& OutBuffer)
{
// Decay the current level
AudioLevel *= AudioLevelDecay;
// get the sampler (bus) audio level
OutBuffer.Saturate(-1.0f, 1.0f);
float PeakLevel = OutBuffer.GetPeak();
AudioLevel = FMath::Max(AudioLevel, PeakLevel);
}