Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

metadata: mp3: Reduce size of is_cuesheet function

Saves 80 bytes on Sansa E200V2 (176 -> 96)

Change-Id: I976e47f74641110ef37049101b9eb0db0afe512b

+22 -27
+22 -27
lib/rbcodec/metadata/id3tags.c
··· 725 725 726 726 static bool is_cuesheet(char *tag, unsigned char *char_enc, unsigned char *cuesheet_offset) 727 727 { 728 - *char_enc = 0; 728 + *char_enc = CHAR_ENC_ISO_8859_1; 729 729 /* [enc type]+"CUESHEET\0" = 10 */ 730 730 *cuesheet_offset = 10; 731 - unsigned char utf16 = 0; 732 - 733 - switch (tag[0]) 731 + const char* key = "CUESHEET"; 732 + const int key_size = 8; 733 + // check and skip encoding type 734 + switch (*(tag++)) 734 735 { 735 - case 0x00: 736 - *char_enc = CHAR_ENC_ISO_8859_1; 737 - break; 738 736 case 0x01: 739 - if (!memcmp(tag + 1, BOM_UTF_16_BE, BOM_UTF_16_SIZE)) 740 - utf16 = CHAR_ENC_UTF_16_BE; 741 - else if (!memcmp(tag + 1, BOM_UTF_16_LE, BOM_UTF_16_SIZE)) 742 - utf16 = CHAR_ENC_UTF_16_LE; 737 + if (!memcmp(tag, BOM_UTF_16_BE, BOM_UTF_16_SIZE)) 738 + *char_enc = CHAR_ENC_UTF_16_BE; 739 + else if (!memcmp(tag, BOM_UTF_16_LE, BOM_UTF_16_SIZE)) 740 + *char_enc = CHAR_ENC_UTF_16_LE; 743 741 else 744 742 return false; 745 743 746 744 tag+= BOM_UTF_16_SIZE; 747 - *char_enc = utf16; 748 745 /* \1 + BOM(2) + C0U0E0S0H0E0E0T000 = 21 */ 749 746 *cuesheet_offset = 21; 750 747 break; 748 + 751 749 case 0x02: 752 - utf16 = *char_enc = CHAR_ENC_UTF_16_BE; 750 + *char_enc = CHAR_ENC_UTF_16_BE; 753 751 /* \2 + 0C0U0E0S0H0E0E0T00 = 19 */ 754 752 *cuesheet_offset = 19; 755 753 break; 754 + 756 755 case 0x03: 757 756 *char_enc = CHAR_ENC_UTF_8; 758 - break; 757 + //fallthrough 758 + case 0x00: 759 + return !strncmp(tag, key, key_size); 760 + 759 761 default: 760 762 return false; 761 763 } 762 - ++tag; //skip encoding type 763 - const char* key = "CUESHEET"; 764 764 765 - if (!utf16) 766 - return !strncmp(tag, key, 8); 767 - 768 - int tag_index; 769 - for (int i =0; i < 8; ++i) 765 + // check if UTF-16 string is variation of C0U0E0S0H0E0E0T or 0C0U0E0S0H0E0E0T 766 + for (int i =0; i < key_size; ++i) 770 767 { 771 - tag_index = i<<1; 772 - if ( (utf16 == CHAR_ENC_UTF_16_BE && tag[tag_index] == 0 && tag[tag_index + 1] == key[i] ) 773 - || (tag[tag_index] == key[i] && tag[tag_index + 1] == 0 )) 774 - continue; 775 - return false; 768 + const char* utf16_char = &tag[(i << 1)]; 769 + if (*utf16_char + *(utf16_char + 1) != key[i]) 770 + return false; 776 771 } 777 772 return true; 778 773 } ··· 1093 1088 aren't binary */ 1094 1089 if(!tr->binary) { 1095 1090 if ( /* Is it an embedded cuesheet? */ 1096 - (tr->offset == 0 && tr->tag_length == 4 && !memcmp(header, "TXXX", 4)) && 1091 + (ptag == NULL && tr->tag_length == 4 && !memcmp(header, "TXXX", 4)) && 1097 1092 (bytesread >= 14) 1098 1093 ) { 1099 1094 unsigned char char_enc;