blargg_err_t track_info_( track_info_t* out, int ) const { get_vgm_length( h, out ); if ( gd3.size() ) parse_gd3( gd3.begin(), gd3.end(), out ); return 0; }
bool get_vgm_metadata(int fd, struct mp3entry* id3) { /* Use the id3v2 part of the id3 structure as a temporary buffer */ unsigned char* buf = (unsigned char *)id3->id3v2buf; int read_bytes; memset(buf, 0, ID3V2_BUF_SIZE); if ((lseek(fd, 0, SEEK_SET) < 0) || ((read_bytes = read(fd, buf, header_size)) < header_size)) { return false; } id3->vbr = false; id3->filesize = filesize(fd); id3->bitrate = 706; id3->frequency = 44100; /* If file is gzipped, will get metadata later */ if (memcmp(buf, "Vgm ", 4)) { /* We must set a default song length here because the codec can't do it anymore */ id3->length = 150 * 1000; /* 2.5 minutes */ return true; } /* Get song length from header */ struct header_t* header = (struct header_t*) buf; get_vgm_length( header, id3 ); long gd3_offset = get_long_le( header->gd3_offset ) - 0x2C; /* No gd3 tag found */ if ( gd3_offset < 0 ) return true; /* Seek to gd3 offset and read as many bytes posible */ gd3_offset = id3->filesize - (header_size + gd3_offset); if ((lseek(fd, -gd3_offset, SEEK_END) < 0) || ((read_bytes = read(fd, buf, ID3V2_BUF_SIZE)) <= 0)) return true; byte* gd3 = buf; long gd3_size = check_gd3_header( gd3, read_bytes ); /* GD3 tag is zero */ if ( gd3_size == 0 ) return true; /* Finally, parse gd3 tag */ if ( gd3 ) parse_gd3( gd3 + gd3_header_size, gd3 + read_bytes, id3 ); return true; }
blargg_err_t Vgm_Emu::track_info_( track_info_t* out, int ) const { get_vgm_length( header(), out ); int size; byte const* gd3 = gd3_data( &size ); if ( gd3 ) parse_gd3( gd3 + gd3_header_size, gd3 + size, out ); return 0; }
blargg_err_t Vgm_Emu::track_info_( track_info_t* out, int ) const { get_vgm_length( header(), out ); int gd3_offset = get_le32( header().gd3_offset ); if ( gd3_offset <= 0 ) return (blargg_err_t)blargg_ok; byte const* gd3 = core.file_begin() + gd3_offset + offsetof( header_t, gd3_offset ); int gd3_size = check_gd3_header( gd3, core.file_end() - gd3 ); if ( gd3_size ) { byte const* gd3_data = gd3 + gd3_header_size; parse_gd3( gd3_data, gd3_data + gd3_size, out ); } return (blargg_err_t)blargg_ok; }