From d4651feded4f04fb6184571034194f7c116b89f0 Mon Sep 17 00:00:00 2001 From: bnnm Date: Sat, 10 Aug 2019 17:27:06 +0200 Subject: [PATCH] Read .ogg TITLE as stream name and tweaks --- src/meta/ogg_vorbis.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/meta/ogg_vorbis.c b/src/meta/ogg_vorbis.c index 6847a6d1..da7e38cc 100644 --- a/src/meta/ogg_vorbis.c +++ b/src/meta/ogg_vorbis.c @@ -108,12 +108,16 @@ static void kovs_ogg_decryption_callback(void *ptr, size_t size, size_t nmemb, v } static void psychic_ogg_decryption_callback(void *ptr, size_t size, size_t nmemb, void *datasource) { + ogg_vorbis_streamfile * const ov_streamfile = datasource; size_t bytes_read = size*nmemb; + uint8_t key[6] = { 0x23,0x31,0x20,0x2e,0x2e,0x28 }; int i; - /* bytes add 0x23 ('#') */ //todo incorrect, add changes every 0x64 bytes + //todo incorrect, picked value changes (fixed order for all files), or key is bigger + /* bytes add key that changes every 0x64 bytes */ for (i = 0; i < bytes_read; i++) { - ((uint8_t*)ptr)[i] += 0x23; + int pos = (ov_streamfile->offset + i) / 0x64; + ((uint8_t*)ptr)[i] += key[pos % sizeof(key)]; } } @@ -455,6 +459,7 @@ VGMSTREAM * init_vgmstream_ogg_vorbis_callbacks(STREAMFILE *streamFile, ov_callb ogg_vorbis_codec_data * data = NULL; OggVorbis_File *ovf = NULL; vorbis_info *vi; + char name[STREAM_NAME_SIZE] = {0}; int loop_flag = ovmi->loop_flag; int32_t loop_start = ovmi->loop_start; @@ -626,6 +631,10 @@ VGMSTREAM * init_vgmstream_ogg_vorbis_callbacks(STREAMFILE *streamFile, ov_callb data->disable_reordering = 1; } + if (strstr(user_comment, "TITLE=") == user_comment) { + strncpy(name, user_comment + 6, sizeof(name) - 1); + } + ;VGM_LOG("OGG: user_comment=%s\n", user_comment); } } @@ -638,9 +647,14 @@ VGMSTREAM * init_vgmstream_ogg_vorbis_callbacks(STREAMFILE *streamFile, ov_callb vgmstream->codec_data = data; /* store our fun extra datas */ vgmstream->channels = vi->channels; vgmstream->sample_rate = vi->rate; - vgmstream->num_streams = ovmi->total_subsongs; vgmstream->stream_size = stream_size; + if (ovmi->total_subsongs) /* not setting it has some effect when showing stream names */ + vgmstream->num_streams = ovmi->total_subsongs; + + if (name[0] != '\0') + strcpy(vgmstream->stream_name, name); + vgmstream->num_samples = ov_pcm_total(ovf,-1); /* let libvorbisfile find total samples */ if (loop_flag) { vgmstream->loop_start_sample = loop_start;