int main (int argc, char ** argv) { FILE * f; OGGZ * oggz; long n; ogg_int64_t units; if (argc < 2) { printf ("usage: %s filename\n", argv[0]); } if ((f = fopen ((char *)argv[1], "rb")) == NULL) { printf ("unable to open file %s\n", argv[1]); exit (1); } if ((oggz = oggz_new (OGGZ_READ | OGGZ_AUTO)) == NULL) { printf ("unable to create oggz\n"); exit (1); } oggz_io_set_read (oggz, my_io_read, f); oggz_io_set_seek (oggz, my_io_seek, f); oggz_io_set_tell (oggz, my_io_tell, f); oggz_set_read_callback (oggz, -1, read_packet, NULL); while ((n = oggz_read (oggz, 1024)) > 0); units = oggz_tell_units (oggz); printf ("Total length: %" PRId64 " ms\n", units); oggz_seek_units (oggz, units/2, SEEK_SET); printf ("seeked to byte offset %" PRId64 "\n", oggz_tell (oggz)); while ((n = oggz_read (oggz, 1024)) > 0); oggz_close (oggz); exit (0); }
void speex_dec_seek(decoder_t * dec, unsigned long long seek_to_pos) { speex_pdata_t * pd = (speex_pdata_t *)dec->pdata; file_decoder_t * fdec = dec->fdec; char flush_dest; if (seek_to_pos == fdec->fileinfo.total_samples) --seek_to_pos; if (oggz_seek_units(pd->oggz, seek_to_pos / (float)pd->sample_rate * 1000.0f, SEEK_SET) != -1) { if (seek_to_pos == 0) { pd->packetno = 0; } fdec->samples_left = fdec->fileinfo.total_samples - seek_to_pos; /* empty speex decoder ringbuffer */ while (rb_read_space(pd->rb)) rb_read(pd->rb, &flush_dest, sizeof(char)); } else { fprintf(stderr, "speex_dec_seek(): warning: oggz_seek_units() returned -1\n"); } }