UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AudioDecompress.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 AudioDecompress.h: Unreal audio vorbis decompression interface object.
5=============================================================================*/
6
7#pragma once
8
9#include "CoreMinimal.h"
10#include "Stats/Stats.h"
11#include "Async/AsyncWork.h"
12#include "Sound/SoundWave.h"
13#include "Misc/ScopeLock.h"
15#include "ContentStreaming.h"
16
17// 100ms of 48KHz data
18// 108ms of 44.1KHz data
19// 218ms of 22KHz data
21constexpr uint32 MONO_PCM_SAMPLE_SIZE = sizeof(int16);
23
26
31{
32public:
34
39
48
58 virtual bool ReadCompressedData(uint8* Destination, bool bLooping, uint32 BufferSize) = 0;
59
63 virtual void SeekToTime(const float SeekTime) = 0;
64
68 virtual void SeekToFrame(const uint32 Frame) = 0;
69
73 virtual void ExpandFile(uint8* DstBuffer, struct FSoundQualityInfo* QualityInfo) = 0;
74
80 virtual void EnableHalfRate(bool HalfRate) = 0;
81
85 virtual uint32 GetSourceBufferSize() const = 0;
86
91 virtual bool UsesVorbisChannelOrdering() const = 0;
92
96 virtual int GetStreamBufferSize() const = 0;
97
102 virtual bool IsStreamedCompressedInfo() const { return false; }
103
105 // Following functions are optional if streaming is supported //
107
111 virtual bool SupportsStreaming() const {return false;}
112
120 {
121 // If we hit this check, ReleaseStreamChunk needs to be implemented for this codec.
122 checkNoEntry();
123 return false;
124 }
125
134
138 ENGINE_API virtual bool HasError() const;
139
140protected:
143
144public:
145
155 virtual bool StreamCompressedData(uint8* Destination, bool bLooping, uint32 BufferSize, int32& OutNumBytesStreamed) { OutNumBytesStreamed = -1; return false; }
156
160 virtual int32 GetCurrentChunkIndex() const {return -1;}
161
165 virtual int32 GetCurrentChunkOffset() const {return -1;}
166
169
170protected:
171 mutable bool bHasError = false;
172
173#if !UE_BUILD_SHIPPING
175#endif //UE_BUILD_SHIPPING
177 {
178#if UE_BUILD_SHIPPING
179 return false;
180#else
182#endif //UE_BUILD_SHIPPING
183 }
184
186};
187
190{
191 // Number of bytes of compressed data consumed
193 // Number of bytes produced
195 // Number of frames produced.
197
203};
204
211{
212public:
215
216 //~ Begin ICompressedInfo Interface
218 ENGINE_API virtual bool ReadCompressedData(uint8* Destination, bool bLooping, uint32 BufferSize) override;
219 ENGINE_API virtual void SeekToTime(const float SeekTime) override;
220 ENGINE_API virtual void SeekToFrame(const uint32 SeekFrame) override;
221 ENGINE_API virtual void ExpandFile(uint8* DstBuffer, struct FSoundQualityInfo* QualityInfo) override;
222 virtual void EnableHalfRate(bool HalfRate) override {};
223 virtual uint32 GetSourceBufferSize() const override { return SrcBufferDataSize; }
224 virtual bool UsesVorbisChannelOrdering() const override { return false; }
225 virtual int GetStreamBufferSize() const override { return MONO_PCM_BUFFER_SIZE; }
226 virtual bool SupportsStreaming() const override { return true; }
228 ENGINE_API virtual bool StreamCompressedData(uint8* Destination, bool bLooping, uint32 BufferSize, int32& OutNumBytesStreamed) override;
229 virtual int32 GetCurrentChunkIndex() const override { return CurrentChunkIndex; }
230 virtual int32 GetCurrentChunkOffset() const override { return SrcBufferOffset; }
231 virtual bool IsStreamedCompressedInfo() const override { return true; }
232 //~ End ICompressedInfo Interface
233
236
238 virtual bool CreateDecoder() = 0;
239
241 virtual FDecodeResult Decode(const uint8* CompressedData, const int32 CompressedDataSize, uint8* OutPCMData, const int32 OutputPCMDataSize) = 0;
242
244 virtual void PrepareToLoop() {}
245
247 virtual int32 GetFrameSize() = 0;
248
250 virtual uint32 GetMaxFrameSizeSamples() const = 0;
251
254protected:
255
258
266
274
282 uint32 WriteFromDecodedPCM(uint8* Destination, uint32 BufferSize);
283
291 uint32 ZeroBuffer(uint8* Destination, uint32 BufferSize);
292
301
303
310
359 std::atomic<int32> StreamSeekBlockIndex;
362
365
366private:
369 bool SeekToDecodedPCMFrame(uint32 InTargetAudioFrame);
370};
371
373{
374 virtual ~IAudioInfoFactory() = default;
376
382 {
383 bool bSupportsSeeking = true;
385 };
392 virtual bool IsSeekingSupported(const bool bIsStreaming) const = 0;
393};
395{
397 virtual ~IAudioInfoFactoryRegistry() = default;
398 virtual void Register(IAudioInfoFactory*, FName) = 0;
399 virtual void Unregister(IAudioInfoFactory*, FName) = 0;
400 virtual IAudioInfoFactory* Find(FName InName) const = 0;
401
402 // Convenience helper.
404 {
405 if (IAudioInfoFactory* Factory = Find(InName))
406 {
407 return Factory->Create();
408 }
409 return nullptr;
410 }
411};
412
414{
415public:
423 : CreateLambda(InLambda), FormatName(InFormatName), Capabilities(InCaps)
424 {
425 IAudioInfoFactoryRegistry::Get().Register(this, FormatName);
426 }
427 virtual ~FSimpleAudioInfoFactory() override
428 {
429 IAudioInfoFactoryRegistry::Get().Unregister(this, FormatName);
430 }
431 virtual ICompressedAudioInfo* Create() override { return CreateLambda(); }
432
438 virtual bool IsSeekingSupported(const bool bIsStreaming) const override
439 {
440 return bIsStreaming ?
441 Capabilities.bSupportsSeekableStreaming :
442 Capabilities.bSupportsSeeking;
443 }
444
445private:
446 TFunction<ICompressedAudioInfo* ()> CreateLambda;
447 FName FormatName;
448 FCapabilities Capabilities;
449};
450
479
481
483{
486
489
492};
493
494template<class T>
496{
497protected:
508
509public:
525
538
550
551 void DoWork()
552 {
553 LLM_SCOPE(ELLMTag::AudioMisc);
554
555 switch(TaskType)
556 {
558 AudioBuffer->ReadCompressedInfo(WaveData);
559 break;
560
563 {
564#if PLATFORM_ANDROID
565 // Only skip one buffer on Android
566 AudioBuffer->ReadCompressedData((uint8*)AudioData, NumPrecacheFrames, bLoopingMode );
567#else
568 // If we're using cached data we need to skip the first two reads from the data
571#endif
572 }
574 break;
575
578 break;
579
580 default:
581 check(false);
582 }
583 }
584
596
598 {
599 return TaskType;
600 }
601
602 bool GetBufferLooped() const
603 {
605 return bLooped;
606 }
607
613};
614
616
617template<class T>
619{
620public:
625
634
636 {
637 check(IsDone());
638 delete Task;
639 }
640
641 bool IsDone()
642 {
643 FScopeLock Lock(&CritSect);
644 return Task->IsDone();
645 }
646
648 {
649 FScopeLock Lock(&CritSect);
650
652 {
653 Task->Cancel();
654 }
656 }
657
664
666 {
667 FScopeLock Lock(&CritSect);
668 return Task->GetTask();
669 }
670
671private:
672 FCriticalSection CritSect;
674};
#define check(expr)
Definition AssertionMacros.h:314
#define checkNoEntry()
Definition AssertionMacros.h:316
constexpr uint32 MONO_PCM_SAMPLE_SIZE
Definition AudioDecompress.h:21
ERealtimeAudioTaskType
Definition AudioDecompress.h:483
FAsyncTask< FAsyncAudioDecompressWorker > FAsyncAudioDecompress
Definition AudioDecompress.h:480
constexpr uint32 MONO_PCM_BUFFER_SIZE
Definition AudioDecompress.h:22
constexpr int32 MONO_PCM_BUFFER_SAMPLES
Definition AudioDecompress.h:20
ENGINE_API bool ShouldUseBackgroundPoolFor_FAsyncRealtimeAudioTask()
Definition AudioDecompress.cpp:892
@ INDEX_NONE
Definition CoreMiscDefines.h:150
FPlatformTypes::int16 int16
A 16-bit signed integer.
Definition Platform.h:1123
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define RETURN_QUICK_DECLARE_CYCLE_STAT(StatId, GroupId)
Definition Stats.h:655
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
#define LLM_SCOPE(...)
Definition LowLevelMemTracker.h:1095
FQueuedThreadPool * GBackgroundPriorityThreadPool
Definition ThreadingBase.cpp:52
FQueuedThreadPool * GThreadPool
Definition ThreadingBase.cpp:48
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition AudioDecompress.h:455
ICompressedAudioInfo * AudioInfo
Definition AudioDecompress.h:458
ENGINE_API void DoWork()
Definition AudioDecompress.cpp:806
int32 NumPrecacheFrames
Definition AudioDecompress.h:459
TStatId GetStatId() const
Definition AudioDecompress.h:474
USoundWave * Wave
Definition AudioDecompress.h:457
Definition AudioDecompress.h:619
FAsyncRealtimeAudioTaskProxy(T *InAudioBuffer, USoundWave *InWaveData)
Definition AudioDecompress.h:621
void EnsureCompletion(bool bDoWorkOnThisThreadIfNotStarted=true)
Definition AudioDecompress.h:647
FAsyncRealtimeAudioTaskProxy(USoundWave *InWaveData, uint8 *InAudioData, int32 InMaxSamples)
Definition AudioDecompress.h:630
bool IsDone()
Definition AudioDecompress.h:641
FAsyncRealtimeAudioTaskWorker< T > & GetTask()
Definition AudioDecompress.h:665
void StartBackgroundTask()
Definition AudioDecompress.h:658
~FAsyncRealtimeAudioTaskProxy()
Definition AudioDecompress.h:635
FAsyncRealtimeAudioTaskProxy(T *InAudioBuffer, uint8 *InAudioData, int32 InNumFramesToDecode, bool bInLoopingMode, bool bInSkipFirstBuffer)
Definition AudioDecompress.h:626
Definition AudioDecompress.h:496
ERealtimeAudioTaskType TaskType
Definition AudioDecompress.h:504
void DoWork()
Definition AudioDecompress.h:551
uint32 bSkipFirstBuffer
Definition AudioDecompress.h:505
USoundWave * WaveData
Definition AudioDecompress.h:499
FAsyncRealtimeAudioTaskWorker(T *InAudioBuffer, uint8 *InAudioData, int32 InNumPrecacheFrames, bool bInLoopingMode, bool bInSkipFirstBuffer)
Definition AudioDecompress.h:526
TStatId GetStatId() const
Definition AudioDecompress.h:585
FAsyncRealtimeAudioTaskWorker(T *InAudioBuffer, USoundWave *InWaveData)
Definition AudioDecompress.h:510
int32 BytesWritten
Definition AudioDecompress.h:503
uint32 bLooped
Definition AudioDecompress.h:507
FAsyncRealtimeAudioTaskWorker(USoundWave *InWaveData, uint8 *InAudioData, int32 InMaxSamples)
Definition AudioDecompress.h:539
int32 NumPrecacheFrames
Definition AudioDecompress.h:501
bool GetBufferLooped() const
Definition AudioDecompress.h:602
uint8 * AudioData
Definition AudioDecompress.h:500
uint32 bLoopingMode
Definition AudioDecompress.h:506
int32 GetBytesWritten() const
Definition AudioDecompress.h:608
T * AudioBuffer
Definition AudioDecompress.h:498
int32 MaxSamples
Definition AudioDecompress.h:502
ERealtimeAudioTaskType GetTaskType() const
Definition AudioDecompress.h:597
void EnsureCompletion(bool bDoWorkOnThisThreadIfNotStarted=true, bool bIsLatencySensitive=false)
Definition AsyncWork.h:429
void StartBackgroundTask(FQueuedThreadPool *InQueuedPool=GThreadPool, EQueuedWorkPriority InQueuedWorkPriority=EQueuedWorkPriority::Normal, EQueuedWorkFlags InQueuedWorkFlags=EQueuedWorkFlags::None, int64 InRequiredMemory=-1, const TCHAR *InDebugName=nullptr)
Definition AsyncWork.h:419
bool IsDone()
Definition AsyncWork.h:540
bool Cancel()
Definition AsyncWork.h:482
Definition AsyncWork.h:585
TTask & GetTask()
Definition AsyncWork.h:627
Definition ContentStreaming.h:110
Definition AudioDevice.h:417
Definition NameTypes.h:617
Definition AsyncWork.h:663
Definition ScopeLock.h:141
Definition AudioDecompress.h:414
FSimpleAudioInfoFactory(const TFunction< ICompressedAudioInfo *()> &InLambda, const FName &InFormatName, const FCapabilities InCaps={})
Definition AudioDecompress.h:422
virtual ~FSimpleAudioInfoFactory() override
Definition AudioDecompress.h:427
virtual bool IsSeekingSupported(const bool bIsStreaming) const override
Definition AudioDecompress.h:438
virtual ICompressedAudioInfo * Create() override
Definition AudioDecompress.h:431
Definition StreamedAudioChunkSeekTable.h:25
Definition AudioDecompress.h:31
virtual ENGINE_API ~ICompressedAudioInfo()
virtual void SeekToTime(const float SeekTime)=0
virtual bool IsStreamedCompressedInfo() const
Definition AudioDecompress.h:102
bool WantsFilteredLogging() const
Definition AudioDecompress.h:176
virtual const FSoundWaveProxyPtr & GetStreamingSoundWave() const
Definition AudioDecompress.h:168
virtual bool ReadCompressedData(uint8 *Destination, bool bLooping, uint32 BufferSize)=0
virtual int32 GetCurrentChunkIndex() const
Definition AudioDecompress.h:160
virtual void EnableHalfRate(bool HalfRate)=0
virtual int32 GetCurrentChunkOffset() const
Definition AudioDecompress.h:165
bool bHasError
Definition AudioDecompress.h:171
bool bWantsFilteredLogging
Definition AudioDecompress.h:174
virtual bool ReleaseStreamChunk(bool bBlockUntilReleased)
Definition AudioDecompress.h:119
virtual uint32 GetSourceBufferSize() const =0
virtual bool ReadCompressedInfo(const uint8 *InSrcBufferData, uint32 InSrcBufferDataSize, struct FSoundQualityInfo *QualityInfo)=0
ENGINE_API ICompressedAudioInfo()
Definition AudioDecompress.cpp:290
virtual bool SupportsStreaming() const
Definition AudioDecompress.h:111
ENGINE_API bool StreamCompressedInfo(USoundWave *Wave, struct FSoundQualityInfo *QualityInfo)
Definition AudioDecompress.cpp:899
virtual bool UsesVorbisChannelOrdering() const =0
virtual void SeekToFrame(const uint32 Frame)=0
virtual int GetStreamBufferSize() const =0
FSoundWaveProxyPtr StreamingSoundWave
Definition AudioDecompress.h:185
virtual ENGINE_API bool HasError() const
Definition AudioDecompress.cpp:296
virtual bool StreamCompressedInfoInternal(const FSoundWaveProxyPtr &InWaveProxy, struct FSoundQualityInfo *QualityInfo)=0
virtual bool StreamCompressedData(uint8 *Destination, bool bLooping, uint32 BufferSize, int32 &OutNumBytesStreamed)
Definition AudioDecompress.h:155
virtual void ExpandFile(uint8 *DstBuffer, struct FSoundQualityInfo *QualityInfo)=0
Definition AudioDecompress.h:211
virtual ENGINE_API bool StreamCompressedInfoInternal(const FSoundWaveProxyPtr &InWaveProxy, FSoundQualityInfo *QualityInfo) override
Definition AudioDecompress.cpp:243
uint32 SrcBufferPadding
Definition AudioDecompress.h:344
virtual int GetStreamBufferSize() const override
Definition AudioDecompress.h:225
const FStreamedAudioChunkSeekTable & GetCurrentSeekTable() const
Definition AudioDecompress.cpp:787
uint8 NumChannels
Definition AudioDecompress.h:328
const uint8 * SrcBufferData
Definition AudioDecompress.h:314
virtual uint32 GetMaxFrameSizeSamples() const =0
ENGINE_API const uint8 * GetLoadedChunk(const FSoundWaveProxyPtr &InSoundWave, uint32 ChunkIndex, uint32 &OutChunkSize)
Definition AudioDecompress.cpp:749
uint32 LastPCMByteSize
Definition AudioDecompress.h:336
virtual ENGINE_API bool ReadCompressedInfo(const uint8 *InSrcBufferData, uint32 InSrcBufferDataSize, FSoundQualityInfo *QualityInfo) override
Definition AudioDecompress.cpp:91
virtual ENGINE_API bool ReadCompressedData(uint8 *Destination, bool bLooping, uint32 BufferSize) override
Definition AudioDecompress.cpp:119
uint32 MaxFrameSizeSamples
Definition AudioDecompress.h:330
virtual ENGINE_API bool StreamCompressedData(uint8 *Destination, bool bLooping, uint32 BufferSize, int32 &OutNumBytesStreamed) override
Definition AudioDecompress.cpp:301
virtual void PrepareToLoop()
Definition AudioDecompress.h:244
uint32 SrcBufferOffset
Definition AudioDecompress.h:318
virtual ENGINE_API ~IStreamedCompressedInfo()
ENGINE_API IStreamedCompressedInfo()
Definition AudioDecompress.cpp:56
virtual void EnableHalfRate(bool HalfRate) override
Definition AudioDecompress.h:222
uint32 WriteFromDecodedPCM(uint8 *Destination, uint32 BufferSize)
Definition AudioDecompress.cpp:647
uint32 IncrementCurrentSampleCount(uint32 NewSamples)
Definition AudioDecompress.cpp:632
int32 StreamSeekBlockOffset
Definition AudioDecompress.h:361
FAudioChunkHandle CurCompressedChunkHandle
Definition AudioDecompress.h:346
bool bIsStreaming
Definition AudioDecompress.h:312
int32 GetStreamSeekBlockOffset() const
Definition AudioDecompress.h:253
std::atomic< int32 > StreamSeekBlockIndex
Definition AudioDecompress.h:359
uint32 SampleStride
Definition AudioDecompress.h:332
virtual int32 GetCurrentChunkIndex() const override
Definition AudioDecompress.h:229
virtual bool ParseHeader(const uint8 *InSrcBufferData, uint32 InSrcBufferDataSize, FSoundQualityInfo *QualityInfo)=0
TArray< uint8 > LastDecodedPCM
Definition AudioDecompress.h:334
int32 CurrentChunkIndex
Definition AudioDecompress.h:342
virtual ENGINE_API void SeekToFrame(const uint32 SeekFrame) override
Definition AudioDecompress.cpp:198
bool bStoringEndOfFile
Definition AudioDecompress.h:340
virtual bool IsStreamedCompressedInfo() const override
Definition AudioDecompress.h:231
uint32 TrueSampleCount
Definition AudioDecompress.h:324
int32 DecompressToPCMBuffer(uint16 FrameSize)
Definition AudioDecompress.cpp:584
uint32 StreamSeekToAudioFrames
Definition AudioDecompress.h:364
FAudioChunkHandle NextPlayingChunkHandle
Definition AudioDecompress.h:348
virtual ENGINE_API void ExpandFile(uint8 *DstBuffer, struct FSoundQualityInfo *QualityInfo) override
Definition AudioDecompress.cpp:217
uint32 CurrentSampleCount
Definition AudioDecompress.h:326
virtual bool CreateDecoder()=0
void RetainNextChunkInSequence(const FSoundWaveProxyPtr &InSoundWave, const uint32 InChunkIndex)
Definition AudioDecompress.cpp:732
uint32 ZeroBuffer(uint8 *Destination, uint32 BufferSize)
Definition AudioDecompress.cpp:719
uint32 LastPCMOffset
Definition AudioDecompress.h:338
uint32 AudioDataOffset
Definition AudioDecompress.h:320
uint32 AudioDataChunkIndex
Definition AudioDecompress.h:322
virtual bool UsesVorbisChannelOrdering() const override
Definition AudioDecompress.h:224
uint32 SrcBufferDataSize
Definition AudioDecompress.h:316
int32 GetStreamSeekBlockIndex() const
Definition AudioDecompress.h:252
virtual int32 GetCurrentChunkOffset() const override
Definition AudioDecompress.h:230
virtual uint32 GetSourceBufferSize() const override
Definition AudioDecompress.h:223
TPimplPtr< FStreamedAudioChunkSeekTable > CurrentChunkSeekTable
Definition AudioDecompress.h:350
virtual bool SupportsStreaming() const override
Definition AudioDecompress.h:226
virtual FDecodeResult Decode(const uint8 *CompressedData, const int32 CompressedDataSize, uint8 *OutPCMData, const int32 OutputPCMDataSize)=0
virtual ENGINE_API void SeekToTime(const float SeekTime) override
Definition AudioDecompress.cpp:167
virtual int32 GetFrameSize()=0
Definition Array.h:670
Definition AndroidPlatformMisc.h:14
Definition SoundWave.h:417
virtual int32 GeneratePCMData(uint8 *PCMData, const int32 SamplesNeeded)
Definition SoundWave.h:1296
@ false
Definition radaudio_common.h:23
Definition AudioDecompress.h:190
int32 NumCompressedBytesConsumed
Definition AudioDecompress.h:192
int32 NumAudioFramesProduced
Definition AudioDecompress.h:196
int32 NumPcmBytesProduced
Definition AudioDecompress.h:194
FDecodeResult()
Definition AudioDecompress.h:198
Definition AudioDecompress.h:395
static ENGINE_API IAudioInfoFactoryRegistry & Get()
Definition AudioDecompress.cpp:932
virtual void Unregister(IAudioInfoFactory *, FName)=0
virtual IAudioInfoFactory * Find(FName InName) const =0
virtual void Register(IAudioInfoFactory *, FName)=0
virtual ~IAudioInfoFactoryRegistry()=default
ICompressedAudioInfo * Create(FName InName) const
Definition AudioDecompress.h:403
Definition AudioDecompress.h:382
bool bSupportsSeekableStreaming
Definition AudioDecompress.h:384
bool bSupportsSeeking
Definition AudioDecompress.h:383
Definition AudioDecompress.h:373
virtual ~IAudioInfoFactory()=default
virtual bool IsSeekingSupported(const bool bIsStreaming) const =0
virtual ICompressedAudioInfo * Create()=0
Definition PimplPtr.h:50
Definition LightweightStats.h:416