11#include " FRadAudioInfo.h"
2+
3+ #include < fstream>
4+ #include < iostream>
5+
26#include " SDK/Include/rada_decode.h"
37
48#include < random>
59
10+ #include " FDecodeResult.h"
11+
612bool FRadAudioInfo::ParseHeader (const uint8_t * InSrcBufferData, uint32_t InSrcBufferDataSize, const FSoundQualityInfo* QualityInfo)
713{
814 const RadAFileHeader* FileHeader = RadAGetFileHeader (InSrcBufferData, InSrcBufferDataSize);
@@ -46,13 +52,13 @@ bool FRadAudioInfo::CreateDecoder(const uint8_t* SrcBufferData, uint32_t SrcBuff
4652{
4753 if (SrcBufferOffset != 0 )
4854 return false ;
49-
50- const RadAFileHeader* FileHeader = RadAGetFileHeader (SrcBufferData, SrcBufferDataSize);
55+
56+ const RadAFileHeader* FileHeader = MIRARadAGetFileHeader_1 (SrcBufferData, SrcBufferDataSize);
5157 if (FileHeader == nullptr )
5258 return false ;
53-
59+
5460 uint32_t DecoderMemoryNeeded = 0 ;
55- if (RadAGetMemoryNeededToOpen (SrcBufferData, SrcBufferDataSize, &DecoderMemoryNeeded) != 0 )
61+ if (MIRARadAGetMemoryNeededToOpen_1 (SrcBufferData, SrcBufferDataSize, &DecoderMemoryNeeded) != 0 )
5662 {
5763 printf (" Invalid/insufficient data in FRadAudioInfo::CreateDecoder - bad buffer passed / bad cook? Size = %d" , SrcBufferDataSize);
5864 if (SrcBufferDataSize > 8 )
@@ -73,7 +79,7 @@ bool FRadAudioInfo::CreateDecoder(const uint8_t* SrcBufferData, uint32_t SrcBuff
7379
7480 Container = Decoder->Container ();
7581
76- if (RadAOpenDecoder (SrcBufferData, SrcBufferDataSize, Container, DecoderMemoryNeeded) == 0 )
82+ if (MIRARadAOpenDecoder_1 (SrcBufferData, SrcBufferDataSize, Container, DecoderMemoryNeeded) == 0 )
7783 {
7884 printf (" Failed to open decoder, likely corrupted data." );
7985 free (RawMemory);
@@ -85,67 +91,143 @@ bool FRadAudioInfo::CreateDecoder(const uint8_t* SrcBufferData, uint32_t SrcBuff
8591 return true ;
8692}
8793
88- bool FRadAudioInfo::Decode (const uint8_t * CompressedData, const int32_t CompressedDataSize, uint8_t * OutPCMData, const int32_t OutputPCMDataSize, uint32_t NumChannels, RadAudioDecoderHeader* Decoder)
94+ FDecodeResult FRadAudioInfo::Decode (uint8_t * CompressedData, const int32_t CompressedDataSize, uint8_t * OutPCMData, const int32_t OutputPCMDataSize, uint32_t NumChannels, RadAudioDecoderHeader* Decoder)
8995{
9096 uint32_t SampleStride = NumChannels * sizeof (int16_t ); // constexpr uint32 MONO_PCM_SAMPLE_SIZE = sizeof(int16);
9197 uint32_t RemnOutputFrames = OutputPCMDataSize / SampleStride;
9298 uint32_t RemnCompressedDataSize = CompressedDataSize;
9399 const uint8_t * CompressedDataEnd = CompressedData + CompressedDataSize;
94100
95101 std::vector<float > DeinterleavedDecodeBuffer;
102+ std::vector<uint8_t > OutputReservoir;
96103
97104 while (RemnOutputFrames)
98105 {
99106 // Drain the output reservoir before attempting a decode.
100107 if (Decoder->OutputReservoirReadFrames < Decoder->OutputReservoirValidFrames )
101108 {
102-
109+ uint32_t AvailableFrames = Decoder->OutputReservoirReadFrames - Decoder->OutputReservoirValidFrames ;
110+ uint32_t CopyFrames = std::min (AvailableFrames, RemnOutputFrames);
111+
112+ uint32_t CopyByteCount = SampleStride * CopyFrames;
113+ uint32_t CopyOffset = SampleStride * Decoder->OutputReservoirReadFrames ;
114+ memcpy (OutPCMData, OutputReservoir.data () + CopyOffset, CopyByteCount);
115+
116+ Decoder->OutputReservoirReadFrames += CopyFrames;
117+ RemnOutputFrames -= CopyFrames;
118+ OutPCMData += CopyByteCount;
119+
120+ if (RemnOutputFrames == 0 )
121+ break ;
103122 }
104123
105124 if (RemnCompressedDataSize == 0 )
106- return false ;
107-
108- // This shit is bs if we pass the data from the offset it fucking fails but if we pass the fucker with pos 0 it passes but then is corrupted apparently
109- // Either this fucker needs its pos to be increased manually or something, but I highly doubt it
110- // But the container shit is correct, so I don't even fucking know now
125+ break ;
126+
111127 uint32_t CompressedBytesNeeded = 0 ;
112128 RadAExamineBlockResult BlockResult = RadAExamineBlock (Decoder->Container (), CompressedData, RemnCompressedDataSize, &CompressedBytesNeeded);
113-
114- CompressedData += sizeof (RadAContainer*);
115-
129+
116130 if (BlockResult != RadAExamineBlockResult::Valid)
117131 {
118132 printf (" Invalid block in FRadAudioInfo::Decode: Result = %d, RemnSize = %d \n " , BlockResult, RemnCompressedDataSize);
119133 if (RemnCompressedDataSize >= 8 )
120134 printf (" First 8 bytes of buffer: 0x%02x 0x%02x 0x%02x 0x%02x:0x%02x 0x%02x 0x%02x 0x%02x \n " , CompressedData[0 ], CompressedData[1 ], CompressedData[2 ], CompressedData[3 ], CompressedData[4 ], CompressedData[5 ], CompressedData[6 ], CompressedData[7 ]);
121135
122- return false ;
136+ break ;
123137 }
124138
125- // RadAudio outputs deinterleaved 32 bit float buffers - we don't want to carry around
126- // those buffers all the time and rad audio uses a pretty healthy amount of stack already
139+ // RadAudio outputs deinterleaved 32- bit float buffers - we don't want to carry around
140+ // those buffers all the time and rad audio uses a pretty healthy amount of stack already,
127141 // so we drop these in the temp buffers.
128- if (DeinterleavedDecodeBuffer.size () == 0 )
142+ if (DeinterleavedDecodeBuffer.empty () )
129143 DeinterleavedDecodeBuffer = std::vector<float >(RadADecodeBlock_MaxOutputFrames * NumChannels);
130-
144+
131145 size_t CompressedDataConsumed = 0 ;
132146 int16_t DecodeResult = RadADecodeBlock (Decoder->Container (), CompressedData, RemnCompressedDataSize, DeinterleavedDecodeBuffer.data (), RadADecodeBlock_MaxOutputFrames, &CompressedDataConsumed);
133147
134148 if (DecodeResult == RadADecodeBlock_Error)
135149 {
136- printf (" Failed to decode block that passed validation checks, corrupted buffer?" );
137- return false ;
150+ printf (" Failed to decode block that passed validation checks, corrupted buffer? \n " );
151+ return FDecodeResult () ;
138152 }
139153 else if (DecodeResult == RadADecodeBlock_Done)
140154 {
141- return true ;
155+ break ;
142156 }
143-
157+
144158 CompressedData += CompressedDataConsumed;
145159 RemnCompressedDataSize -= CompressedDataConsumed;
160+
161+ int16_t DecodeResultOffset = 0 ;
162+
163+ if (Decoder->ConsumeFrameCount )
164+ {
165+ int16_t ConsumedThisTime = DecodeResult;
166+ if (Decoder->ConsumeFrameCount < DecodeResult)
167+ {
168+ ConsumedThisTime = (int16_t )Decoder->ConsumeFrameCount ;
169+ }
170+
171+ if (ConsumedThisTime)
172+ {
173+ DecodeResultOffset = ConsumedThisTime;
174+ DecodeResult -= ConsumedThisTime;
175+ }
176+ Decoder->ConsumeFrameCount -= ConsumedThisTime;
177+ }
178+
179+ if (DecodeResult == 0 )
180+ continue ;
181+
182+ int16_t * InterleaveDestination = (int16_t *)OutPCMData;
183+ if (RemnOutputFrames < RadADecodeBlock_MaxOutputFrames)
184+ {
185+ if (OutputReservoir.empty ())
186+ OutputReservoir.reserve (RadADecodeBlock_MaxOutputFrames * SampleStride);
187+
188+ InterleaveDestination = (int16_t *)OutputReservoir.data ();
189+ }
190+
191+ for (int32_t ChannelIdx = 0 ; ChannelIdx < NumChannels; ChannelIdx++)
192+ {
193+ const float * InBuffer = DeinterleavedDecodeBuffer.data () + RadADecodeBlock_MaxOutputFrames*ChannelIdx + DecodeResultOffset;
194+
195+ for (int32_t SampleIdx = 0 ; SampleIdx < DecodeResult; SampleIdx++)
196+ {
197+ float InBufferFloat = InBuffer[SampleIdx] * 32768 .0f ;
198+ if (InBufferFloat > 32767 )
199+ {
200+ InBufferFloat = 32767 ;
201+ }
202+ else if (InBufferFloat < -32768 )
203+ {
204+ InBufferFloat = -32768 ;
205+ }
206+
207+ InterleaveDestination[ChannelIdx + (SampleIdx * NumChannels)] = (int16_t )InBufferFloat;
208+ }
209+ }
210+
211+ if (InterleaveDestination == (int16_t *)OutputReservoir.data ())
212+ {
213+ Decoder->OutputReservoirValidFrames = DecodeResult;
214+ Decoder->OutputReservoirReadFrames = 0 ;
215+ }
216+ else
217+ {
218+ RemnOutputFrames -= DecodeResult;
219+ OutPCMData += DecodeResult * SampleStride;
220+ }
146221 }
147222
148- return true ;
223+ FDecodeResult Result;
224+
225+ Result.shii = OutputPCMDataSize - RemnOutputFrames;
226+ Result.NumPcmBytesProduced = OutputPCMDataSize - (RemnOutputFrames * SampleStride);
227+ Result.NumAudioFramesProduced = Result.NumPcmBytesProduced / SampleStride;
228+ Result.NumCompressedBytesConsumed = CompressedDataSize - RemnCompressedDataSize;
229+
230+ return Result;
149231}
150232
151233
0 commit comments