// Copyright Epic Games, Inc. All Rights Reserved. #include "AudioMeterView.h" #include "Analyzers/AudioMeterSubmixAnalyzer.h" #include "AudioInsightsEditorDashboardFactory.h" #include "AudioMeter.h" #include "Sound/AudioBus.h" #include "Sound/SoundSubmix.h" #include "Widgets/SNullWidget.h" namespace UE::Audio::Insights { FAudioMeterView::FAudioMeterView(FAudioAssetVariant InAudioAssetVariant) : AudioAssetVariant(InAudioAssetVariant) , AudioMeterAnalyzerVariant(MakeAudioMeterAnalyzerVariant(InAudioAssetVariant)) , AudioAssetNameTextBlock(MakeAudioAssetNameTextBlock(InAudioAssetVariant)) , AudioMeterViewWidget(MakeWidget()) , OnActiveAudioDeviceChangedHandle(FEditorDashboardFactory::OnActiveAudioDeviceChanged.AddRaw(this, &FAudioMeterView::HandleOnActiveAudioDeviceChanged)) { } FAudioMeterView::~FAudioMeterView() { FEditorDashboardFactory::OnActiveAudioDeviceChanged.Remove(OnActiveAudioDeviceChangedHandle); } FAudioMeterView::FAudioMeterVariant FAudioMeterView::MakeAudioMeterAnalyzerVariant(const FAudioAssetVariant InAudioAssetVariant) { switch (AudioAssetVariant.GetIndex()) { case FAudioAssetVariant::IndexOfType>(): { return FAudioMeterVariant(TInPlaceType>(), MakeShared(InAudioAssetVariant.Get>())); } case FAudioAssetVariant::IndexOfType>(): { return FAudioMeterVariant(TInPlaceType>(), MakeShared(InAudioAssetVariant.Get>())); } default: return FAudioMeterView::FAudioMeterVariant(); } } TSharedRef FAudioMeterView::MakeAudioAssetNameTextBlock(const FAudioAssetVariant InAudioAssetVariant) { switch (InAudioAssetVariant.GetIndex()) { case FAudioAssetVariant::IndexOfType>(): { if (TWeakObjectPtr AudioBusAsset = InAudioAssetVariant.Get>(); AudioBusAsset.IsValid()) { return SNew(STextBlock) .Text_Lambda([AudioBusAsset] { return AudioBusAsset.IsValid() ? FText::FromString(AudioBusAsset->GetName()) : FText::GetEmpty(); }) .Justification(ETextJustify::Center) .ColorAndOpacity(FSlateColor(FColor(80, 200, 255))); } } break; case FAudioAssetVariant::IndexOfType>(): { if (TWeakObjectPtr SoundSubmixAsset = AudioAssetVariant.Get>(); SoundSubmixAsset.IsValid()) { return SNew(STextBlock) .Text_Lambda([SoundSubmixAsset] { return SoundSubmixAsset.IsValid() ? FText::FromString(SoundSubmixAsset->GetName()) : FText::GetEmpty(); }) .Justification(ETextJustify::Center) .ColorAndOpacity(FSlateColor(FColor(30, 240, 90))); } } break; } return SNew(STextBlock); } TSharedRef FAudioMeterView::GetAudioMeterAnalyzerWidget() const { switch (AudioMeterAnalyzerVariant.GetIndex()) { case FAudioMeterVariant::IndexOfType>(): { TSharedPtr AudioMeterAnalyzer = AudioMeterAnalyzerVariant.Get>(); return AudioMeterAnalyzer.IsValid() ? AudioMeterAnalyzer->GetAudioMeter()->GetWidget() : SNullWidget::NullWidget; } case FAudioMeterVariant::IndexOfType>(): { TSharedPtr AudioMeterSubmixAnalyzer = AudioMeterAnalyzerVariant.Get>(); return AudioMeterSubmixAnalyzer.IsValid() ? AudioMeterSubmixAnalyzer->GetWidget() : SNullWidget::NullWidget; } default: return SNullWidget::NullWidget; } } TSharedRef FAudioMeterView::MakeWidget() { return SNew(SVerticalBox) + SVerticalBox::Slot() [ SNew(SVerticalBox) .Clipping(EWidgetClipping::ClipToBounds) // Height padding + SVerticalBox::Slot() .FillHeight(0.05) [ SNew(SBox) ] // Audio Meter container + SVerticalBox::Slot() .FillHeight(0.8) [ // Audio Meter SNew(SHorizontalBox) + SHorizontalBox::Slot() .HAlign(HAlign_Center) .VAlign(VAlign_Fill) [ GetAudioMeterAnalyzerWidget() ] ] // Height padding + SVerticalBox::Slot() .FillHeight(0.025) [ SNew(SBox) ] // Audio aaset name label + SVerticalBox::Slot() .FillHeight(0.1) [ AudioAssetNameTextBlock ] // Height padding + SVerticalBox::Slot() .FillHeight(0.025) [ SNew(SBox) ] ]; } void FAudioMeterView::HandleOnActiveAudioDeviceChanged() { switch (AudioAssetVariant.GetIndex()) { case FAudioAssetVariant::IndexOfType>(): { if (TSharedPtr AudioMeterAnalyzer = AudioMeterAnalyzerVariant.Get>(); AudioMeterAnalyzer.IsValid()) { AudioMeterAnalyzer->RebuildAudioMeter(AudioAssetVariant.Get>()); } } break; case FAudioAssetVariant::IndexOfType>(): { if (TSharedPtr AudioMeterSubmixAnalyzer = AudioMeterAnalyzerVariant.Get>(); AudioMeterSubmixAnalyzer.IsValid()) { AudioMeterSubmixAnalyzer->SetSubmix(AudioAssetVariant.Get>()); } } break; default: break; } } } // namespace UE::Audio::Insights