FastLED 3.9.15
Loading...
Searching...
No Matches

◆ findAndDecodeFrame()

bool fl::third_party::Mp3StreamDecoderImpl::findAndDecodeFrame ( audio::Sample * out_sample)
private

Definition at line 250 of file mp3.cpp.hpp.

250 {
251 if (!mDecoder) {
252 return false;
253 }
254
255 // Try to decode from current buffer
256 const fl::u8* inptr = mBuffer.data() + mBufferPos;
257 fl::size bytes_left = mBufferFilled - mBufferPos;
258
259 if (bytes_left == 0) {
260 return false;
261 }
262
263 // Find sync word
264 int offset = mDecoder->findSyncWord(inptr, bytes_left);
265 if (offset < 0) {
266 // No sync word found, consume buffer and try again
268 return false;
269 }
270
271 inptr += offset;
272 bytes_left -= offset;
274
275 // Try to decode one frame
276 const fl::u8* decode_ptr = inptr;
277 fl::size decode_bytes = bytes_left;
278
279 int result = mDecoder->decodeFrame(&decode_ptr, &decode_bytes);
280
281 // Update buffer position based on how many bytes were consumed
282 fl::size consumed = (decode_ptr - inptr);
283 mBufferPos += consumed;
284 mBytesProcessed += consumed;
285
286 if (result == 0) {
287 // Successfully decoded a frame
288 Mp3Frame frame;
289 frame.pcm = mDecoder->mPcmBuffer.get();
290 frame.samples = mDecoder->mFrameInfo.outputSamps / mDecoder->mFrameInfo.nChans;
291 frame.channels = mDecoder->mFrameInfo.nChans;
292 frame.sample_rate = mDecoder->mFrameInfo.samprate;
293 frame.bitrate = mDecoder->mFrameInfo.bitrate;
294 frame.version = mDecoder->mFrameInfo.version;
295 frame.layer = mDecoder->mFrameInfo.layer;
296
297 // Update stream info on first successful decode
299 mInfo.sampleRate = frame.sample_rate;
300 mInfo.channels = static_cast<fl::u8>(frame.channels);
301 mInfo.bitrate = frame.bitrate;
302 mInfo.version = static_cast<fl::u8>(frame.version);
303 mInfo.layer = static_cast<fl::u8>(frame.layer);
304 mInfo.isValid = true;
306 }
307
308 // Convert to audio::Sample (convert stereo to mono if needed)
309 if (frame.channels == 2) {
310 fl::vector<fl::i16> mono_pcm;
311 mono_pcm.reserve(frame.samples);
312
313 for (int i = 0; i < frame.samples; i++) {
314 fl::i32 left = frame.pcm[i * 2];
315 fl::i32 right = frame.pcm[i * 2 + 1];
316 fl::i32 avg = (left + right) / 2;
317 mono_pcm.push_back(static_cast<fl::i16>(avg));
318 }
319
320 *out_sample = audio::Sample(mono_pcm);
321 } else {
322 // Mono audio - use directly
323 *out_sample = audio::Sample(fl::span<const fl::i16>(frame.pcm, frame.samples));
324 }
325
326 return true;
327 }
328
329 return false;
330}
fl::unique_ptr< Mp3HelixDecoder > mDecoder
Definition mp3.cpp.hpp:146
void reserve(fl::size n) FL_NOEXCEPT
Definition vector.h:591
void push_back(const T &value) FL_NOEXCEPT
Definition vector.h:624
fl::UISlider offset("Offset", 0.0f, 0.0f, 1.0f, 0.01f)
unsigned char u8
Definition coder.h:132
expected< T, E > result
Alias for expected (Rust-style naming)
Definition result.h:31

References fl::third_party::Mp3Frame::bitrate, fl::third_party::Mp3Frame::channels, fl::third_party::Mp3Frame::layer, mBuffer, mBufferFilled, mBufferPos, mBytesProcessed, mDecoder, mHasDecodedFirstFrame, mInfo, offset(), fl::third_party::Mp3Frame::pcm, fl::vector< T >::push_back(), fl::vector< T >::reserve(), fl::third_party::Mp3Frame::sample_rate, fl::third_party::Mp3Frame::samples, and fl::third_party::Mp3Frame::version.

Referenced by decodeNextFrame().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: