int open_seekable() throws SoundException {
        Info initial_i = new Info();
        Comment initial_c = new Comment();
        int serialno;
        long end;
        int ret;
        int dataoffset;
        Page og = new Page();
        // is this even vorbis...?
        int[] foo = new int[1];
        ret = fetch_headers(initial_i, initial_c, foo, null);
        serialno = foo[0];
        dataoffset = (int) offset; //!!
        os.clear();
        if (ret == -1) {
            return (-1);
        }
        if (ret < 0) {
            return (ret);
        }
        // we can seek, so set out learning all about this file
        seekable = true;
        fseek(datasource, 0, SEEK_END);
        offset = ftell(datasource);
        end = offset;
        // We get the offset for the last page of the physical bitstream.
        // Most OggVorbis files will contain a single logical bitstream
        end = get_prev_page(og);
        // moer than one logical bitstream?
        if (og.serialno() != serialno) {
            // Chained bitstream. Bisect-search each logical bitstream
            // section.  Do so based on serial number only
            if (bisect_forward_serialno(0, 0, end + 1, serialno, 0) < 0) {
                clear();
                return OV_EREAD;
            }
        } else {
            // Only one logical bitstream
            if (bisect_forward_serialno(0, end, end + 1, serialno, 0) < 0) {
                clear();
                return OV_EREAD;
            }
        }
        prefetch_all_headers(initial_i, initial_c, dataoffset);
        return 0;
    }