# HG changeset patch # User thib # Date 1238002372 0 # Node ID 53a311ea828977ac0d3283864431f42150e506e2 # Parent a85cdca1980a248bcd0bf81daf97739e4c996604 Patched an old patch of mine (OGG koe files handling)... It's a bit less ugly, and it works with tremor! diff --git a/music2/koedec.cc b/music2/koedec.cc --- a/music2/koedec.cc +++ b/music2/koedec.cc @@ -86,9 +86,7 @@ static AvgKoeCache koe_cache; AvgKoeInfo FindKoe(int file_number, int index) { return koe_cache.Find(file_number, index); }; -#if HAVE_LIBVORBISFILE || HAVE_LIBVORBISIDEC -extern int ogg_get_rate(FILE*); -#endif + AvgKoeInfo AvgKoeCache::Find(int file_number, int index) { AvgKoeInfo info; info.stream = 0; info.length = 0; info.offset = 0; @@ -113,19 +111,16 @@ AvgKoeInfo AvgKoeCache::Find(int file_nu } #if HAVE_LIBVORBISFILE || HAVE_LIBVORBISIDEC if (arcinfo == 0) { + //FIXME: OMG that's ugly, improve it as soon as you can! DIRFILE* koedir = (DIRFILE*) file_searcher.MakeARCFILE((FILESEARCH::ARCTYPE)0, "koe"); sprintf(fname, "%04d", file_number); koedir = new DIRFILE(koedir->SearchFile(fname)); sprintf(fname, "z%04d%05d.ogg", file_number, index); arcinfo = koedir->Find(fname, ".ogg"); delete koedir; - + if (arcinfo == 0) return info; - FILE* stream = arcinfo->OpenFile(); - info.rate = ogg_get_rate(stream); - fseek(stream, 0L, SEEK_END); - info.length = ftell(stream); - fseek(stream, 0L, SEEK_CUR); + FILE* stream = arcinfo->OpenFile(&info.length); info.type = koe_ogg; info.stream = stream; return info; diff --git a/music2/koedec_ogg.cc b/music2/koedec_ogg.cc --- a/music2/koedec_ogg.cc +++ b/music2/koedec_ogg.cc @@ -104,21 +104,6 @@ static int fseek_wrap(FILE *f,ogg_int64_ return fseek(f,off,whence); } - -int ogg_get_rate(FILE *stream) -{ - OggVorbis_File vf; - ov_callbacks callback; - callback.read_func = (size_t (*)(void*, size_t, size_t, void*))fread; - callback.seek_func = (int (*)(void*, ogg_int64_t, int))fseek_wrap; - callback.tell_func = (long int (*)(void*))ftell; - callback.close_func = NULL; - ov_test_callbacks(stream, &vf, NULL, 0, callback); - int rate = vf.vi->rate; - ov_clear(&vf); - return rate; -} - extern char* decode_koe_ogg(AvgKoeInfo info, int* dest_len) { if (info.stream == 0) return 0; // Voice ファイルを直接指定すると全ストリームを再生してしまうので