1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#![allow(non_snake_case)]

extern crate libc;
extern crate ogg_sys as ogg;
extern crate vorbis_sys;

#[repr(C)]
pub struct ov_callbacks {
    pub read_func: extern fn(*mut libc::c_void, libc::size_t, libc::size_t, *mut libc::c_void)
        -> libc::size_t,
    pub seek_func: extern fn(*mut libc::c_void, ogg::ogg_int64_t, libc::c_int) -> libc::c_int,
    pub close_func: extern fn(*mut libc::c_void) -> libc::c_int,
    pub tell_func: extern fn(*mut libc::c_void) -> libc::c_long,
}

// TODO: add static callbacks

pub const NOTOPEN: libc::c_int = 0;
pub const PARTOPEN: libc::c_int = 1;
pub const OPENED: libc::c_int = 2;
pub const STREAMSET: libc::c_int = 3;
pub const INITSET: libc::c_int = 4;

#[repr(C)]
pub struct OggVorbis_File {
    pub datasource: *mut libc::c_void,
    pub seekable: libc::c_int,
    pub offset: ogg::ogg_int64_t,
    pub end: ogg::ogg_int64_t,
    pub oy: ogg::ogg_sync_state,

    pub links: libc::c_int,
    pub offsets: *mut ogg::ogg_int64_t,
    pub dataoffsets: *mut ogg::ogg_int64_t,
    pub serialnos: *mut libc::c_long,
    pub pcmlengths: *mut ogg::ogg_int64_t,
    pub vi: *mut vorbis_sys::vorbis_info,
    pub vc: *mut vorbis_sys::vorbis_comment,

    pub pcm_offset: ogg::ogg_int64_t,
    pub ready_state: libc::c_int,
    pub current_serialno: libc::c_long,
    pub current_link: libc::c_int,

    pub bittrack: libc::c_double,
    pub samptrack: libc::c_double,

    pub os: ogg::ogg_stream_state,
    pub vd: vorbis_sys::vorbis_dsp_state,
    pub vb: vorbis_sys::vorbis_block,

    pub callbacks: ov_callbacks,
}

extern {
    pub fn ov_clear(vf: *mut OggVorbis_File) -> libc::c_int;
    pub fn ov_fopen(path: *const libc::c_char, vf: *mut OggVorbis_File) -> libc::c_int;
    pub fn ov_open(f: *mut libc::FILE, vf: *mut OggVorbis_File, initial: *const libc::c_char,
        ibytes: libc::c_long) -> libc::c_int;
    pub fn ov_open_callbacks(datasource: *mut libc::c_void, vf: *mut OggVorbis_File,
        initial: *const libc::c_char, ibytes: libc::c_long, callbacks: ov_callbacks)
        -> libc::c_int;

    pub fn ov_test(f: *mut libc::FILE, vf: *mut OggVorbis_File, initial: *const libc::c_char,
        ibytes: libc::c_long) -> libc::c_int;
    pub fn ov_test_callbacks(datasource: *mut libc::c_void, vf: *mut OggVorbis_File,
        initial: *const libc::c_char, ibytes: libc::c_long, callbacks: ov_callbacks)
        -> libc::c_int;
    pub fn ov_test_open(vf: *mut OggVorbis_File) -> libc::c_int;

    pub fn ov_bitrate(vf: *mut OggVorbis_File, i: libc::c_int) -> libc::c_long;
    pub fn ov_bitrate_instant(vf: *mut OggVorbis_File) -> libc::c_long;
    pub fn ov_streams(vf: *mut OggVorbis_File) -> libc::c_long;
    pub fn ov_seekable(vf: *mut OggVorbis_File) -> libc::c_long;
    pub fn ov_serialnumber(vf: *mut OggVorbis_File, i: libc::c_int) -> libc::c_long;

    pub fn ov_raw_total(vf: *mut OggVorbis_File, i: libc::c_int) -> ogg::ogg_int64_t;
    pub fn ov_pcm_total(vf: *mut OggVorbis_File, i: libc::c_int) -> ogg::ogg_int64_t;
    pub fn ov_time_total(vf: *mut OggVorbis_File, i: libc::c_int) -> libc::c_double;

    pub fn ov_raw_seek(vf: *mut OggVorbis_File, pos: ogg::ogg_int64_t) -> libc::c_int;
    pub fn ov_pcm_seek(vf: *mut OggVorbis_File, pos: ogg::ogg_int64_t) -> libc::c_int;
    pub fn ov_pcm_seek_page(vf: *mut OggVorbis_File, pos: ogg::ogg_int64_t) -> libc::c_int;
    pub fn ov_time_seek(vf: *mut OggVorbis_File, pos: libc::c_double) -> libc::c_int;
    pub fn ov_time_seek_page(vf: *mut OggVorbis_File, pos: libc::c_double) -> libc::c_int;

    pub fn ov_raw_seek_lap(vf: *mut OggVorbis_File, pos: ogg::ogg_int64_t) -> libc::c_int;
    pub fn ov_pcm_seek_lap(vf: *mut OggVorbis_File, pos: ogg::ogg_int64_t) -> libc::c_int;
    pub fn ov_pcm_seek_page_lap(vf: *mut OggVorbis_File, pos: ogg::ogg_int64_t) -> libc::c_int;
    pub fn ov_time_seek_lap(vf: *mut OggVorbis_File, pos: libc::c_double) -> libc::c_int;
    pub fn ov_time_seek_page_lap(vf: *mut OggVorbis_File, pos: libc::c_double) -> libc::c_int;

    pub fn ov_raw_tell(vf: *mut OggVorbis_File) -> ogg::ogg_int64_t;
    pub fn ov_pcm_tell(vf: *mut OggVorbis_File) -> ogg::ogg_int64_t;
    pub fn ov_time_tell(vf: *mut OggVorbis_File) -> libc::c_double;

    pub fn ov_info(vf: *mut OggVorbis_File, link: libc::c_int) -> *mut vorbis_sys::vorbis_info;
    pub fn ov_comment(vf: *mut OggVorbis_File, link: libc::c_int) -> *mut vorbis_sys::vorbis_comment;

    pub fn ov_read_float(vf: *mut OggVorbis_File, pcm_channels: *mut *mut *mut libc::c_float,
        samples: libc::c_int, bitstream: *mut libc::c_int) -> libc::c_long;
    pub fn ov_read_filter(vf: *mut OggVorbis_File, buffer: *mut libc::c_char, length: libc::c_int,
        bigendianp: libc::c_int, word: libc::c_int, sgned: libc::c_int,
        bitstream: *mut libc::c_int,
        filter: extern fn(*mut *mut libc::c_float, libc::c_long, libc::c_long, *mut libc::c_void),
        filter_param: *mut libc::c_void) -> libc::c_long;
    pub fn ov_read(vf: *mut OggVorbis_File, buffer: *mut libc::c_char, length: libc::c_int,
        bigendianp: libc::c_int, word: libc::c_int, sgned: libc::c_int,
        bitstream: *mut libc::c_int) -> libc::c_long;
    pub fn ov_crosslap(vf1: *mut OggVorbis_File, vf2: *mut OggVorbis_File) -> libc::c_int;

    pub fn ov_halfrate(vf: *mut OggVorbis_File, flag: libc::c_int) -> libc::c_int;
    pub fn ov_halfrate_p(vf: *mut OggVorbis_File) -> libc::c_int;
}