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

◆ parseMp3Info()

Mp3Info fl::Mp3::parseMp3Info ( fl::span< const fl::u8 > data,
fl::string * error_message = nullptr )
static

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

410 {
411 Mp3Info info;
412
413 // Validate input data
414 if (data.empty()) {
415 if (error_message) {
416 *error_message = "Empty MP3 data";
417 }
418 return info; // returns invalid info
419 }
420
421 // Minimum size check - need at least an MP3 frame header (4 bytes) + some data
422 if (data.size() < 128) {
423 if (error_message) {
424 *error_message = "MP3 data too small";
425 }
426 return info;
427 }
428
429 // Look for MP3 sync word (11 bits set: 0xFFE or 0xFFF)
430 bool foundSync = false;
431 fl::size syncOffset = 0;
432
433 for (fl::size i = 0; i <= data.size() - 4; i++) {
434 if (data[i] == 0xFF && (data[i + 1] & 0xE0) == 0xE0) {
435 foundSync = true;
436 syncOffset = i;
437 break;
438 }
439 }
440
441 if (!foundSync) {
442 if (error_message) {
443 *error_message = "Invalid MP3 stream - no sync word found";
444 }
445 return info;
446 }
447
448 // Use the decoder to parse the first frame
449 third_party::Mp3HelixDecoder decoder;
450 if (!decoder.init()) {
451 if (error_message) {
452 *error_message = "Failed to initialize MP3 decoder";
453 }
454 return info;
455 }
456
457 const fl::u8* inptr = data.data() + syncOffset;
458 fl::size bytes_left = data.size() - syncOffset;
459
460 // Try to decode first frame to get metadata
461 int offset = decoder.findSyncWord(inptr, bytes_left);
462 if (offset >= 0) {
463 inptr += offset;
464 bytes_left -= offset;
465
466 int result = decoder.decodeFrame(&inptr, &bytes_left);
467 if (result == 0) {
468 // Successfully decoded - extract metadata
469 info.sampleRate = decoder.mFrameInfo.samprate;
470 info.channels = static_cast<fl::u8>(decoder.mFrameInfo.nChans);
471 info.bitrate = decoder.mFrameInfo.bitrate;
472 info.version = static_cast<fl::u8>(decoder.mFrameInfo.version);
473 info.layer = static_cast<fl::u8>(decoder.mFrameInfo.layer);
474 info.isValid = true;
475 } else if (error_message) {
476 *error_message = "Failed to decode MP3 frame header";
477 }
478 } else if (error_message) {
479 *error_message = "Failed to find MP3 sync word";
480 }
481
482 return info;
483}
constexpr bool empty() const FL_NOEXCEPT
Definition span.h:510
const T * data() const FL_NOEXCEPT
Definition span.h:461
constexpr fl::size size() const FL_NOEXCEPT
Definition span.h:458
fl::UISlider offset("Offset", 0.0f, 0.0f, 1.0f, 0.01f)
unsigned char u8
Definition s16x16x4.h:132
expected< T, E > result
Alias for expected (Rust-style naming)
Definition result.h:31

References fl::Mp3Info::bitrate, fl::third_party::Mp3HelixDecoder::FrameInfo::bitrate, fl::Mp3Info::channels, fl::span< T, Extent >::data(), fl::third_party::Mp3HelixDecoder::decodeFrame(), fl::span< T, Extent >::empty(), fl::third_party::Mp3HelixDecoder::findSyncWord(), fl::third_party::Mp3HelixDecoder::init(), fl::Mp3Info::isValid, fl::Mp3Info::layer, fl::third_party::Mp3HelixDecoder::FrameInfo::layer, fl::third_party::Mp3HelixDecoder::mFrameInfo, fl::third_party::Mp3HelixDecoder::FrameInfo::nChans, offset(), fl::Mp3Info::sampleRate, fl::third_party::Mp3HelixDecoder::FrameInfo::samprate, fl::span< T, Extent >::size(), fl::Mp3Info::version, and fl::third_party::Mp3HelixDecoder::FrameInfo::version.

+ Here is the call graph for this function: