Files
UnrealEngineUWP/Engine/Source/Runtime/AudioCodecEngine/Private/DecoderInputBackCompat.cpp
maxwell hayes c5eac593f9 Fix for editor-only crash when previewing a sound after changing USoundWave properties
#rb Rob.Gay
#jira UE-111376

#ROBOMERGE-SOURCE: CL 15803697 in //UE5/Release-5.0-EarlyAccess/...
#ROBOMERGE-BOT: STARSHIP (Release-5.0-EarlyAccess -> Main) (v783-15756269)

[CL 15808129 by maxwell hayes in ue5-main branch]
2021-03-24 16:42:04 -04:00

115 lines
2.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "DecoderInputBackCompat.h"
#include "AudioDevice.h"
#include "AudioDeviceManager.h"
#include "Interfaces/IAudioFormat.h"
#include "AudioDecompress.h"
#include "Sound/SoundWave.h"
#include "DecoderBackCompat.h"
namespace Audio
{
ICompressedAudioInfo* FBackCompatInput::GetInfo(
FFormatDescriptorSection* OutDescriptor /*= nullptr*/) const
{
FAudioDeviceHandle Handle = FAudioDeviceManager::Get()->GetActiveAudioDevice();
if (!OldInfoObject.IsValid())
{
OldInfoObject.Reset(Handle->CreateCompressedAudioInfo(Wave));
audio_ensure(OldInfoObject.IsValid());
FSoundQualityInfo Info;
if (Wave->IsStreaming())
{
if (!OldInfoObject->StreamCompressedInfo(Wave, &Info))
{
return nullptr;
}
}
else
{
// FSoundWaveProxy needs to be updated to support non-streaming audio
return nullptr;
// if (Wave->ResourceData == nullptr)
// {
// Wave->InitAudioResource(Wave->GetRuntimeFormat());
// }
//
// if (!OldInfoObject->ReadCompressedInfo(Wave->ResourceData, Wave->ResourceSize, &Info))
// {
// return nullptr;
// }
}
Desc.NumChannels = Info.NumChannels;
Desc.NumFramesPerSec = Info.SampleRate;
Desc.NumFrames = (uint32)((float)Info.Duration * Info.SampleRate);
Desc.NumBytesPerPacket = ~0;
Desc.CodecName = FBackCompatCodec::GetDetailsStatic().Name;
Desc.CodecFamilyName = FBackCompatCodec::GetDetailsStatic().FamilyName;
Desc.CodecVersion = FBackCompatCodec::GetDetailsStatic().Version;
}
if( OutDescriptor )
{
*OutDescriptor = Desc;
}
return OldInfoObject.Get();
}
bool FBackCompatInput::FindSection(FEncodedSectionBase& OutSection)
{
if (FFormatDescriptorSection::kSectionName == OutSection.SectionName)
{
FFormatDescriptorSection& Descriptor = static_cast<FFormatDescriptorSection&>(OutSection);
return GetInfo(&Descriptor) != nullptr;
}
return false;
}
bool FBackCompatInput::HasError() const
{
return GetInfo() == nullptr;
}
int64 FBackCompatInput::Tell() const
{
// Not implemented.
audio_ensure(false);
return -1;
}
void FBackCompatInput::SeekToTime(const float InSeconds)
{
ICompressedAudioInfo* Info = GetInfo();
if (ensure(Info))
{
Info->SeekToTime(InSeconds);
}
}
bool FBackCompatInput::IsEndOfStream() const
{
// Not implemented.
audio_ensure(false);
return false;
}
TArrayView<const uint8> FBackCompatInput::PeekNextPacket(int32 InMaxPacketLength) const
{
// Not implemented.
audio_ensure(false);
return MakeArrayView<const uint8>(nullptr,0);
}
TArrayView<const uint8> FBackCompatInput::PopNextPacket(int32 InPacketSize)
{
// Not implemented.
audio_ensure(false);
return MakeArrayView<const uint8>(nullptr,0);
}
}