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
use libc::{c_void, c_int, c_uint, c_char};

use core::ll::{Tox};

use av::{CallState, CallSettings, Capability};

#[repr(C)]
#[allow(missing_copy_implementations)]
pub struct ToxAv;

unsafe impl Send for *mut ToxAv { }

pub type ToxAVCallback = extern fn(agent: *mut c_void, call_idx: i32, arg: *mut c_void);
pub type ToxAvAudioCallback = extern fn(agent: *mut c_void, call_idx: i32,
                                        PCM: *const i16, size: u16, data: *mut c_void);

pub type ToxAudioCallback = extern fn(tox: *mut Tox, groupnumber: c_int,
                                      peernumber: c_int, pcm: *const i16, samples: c_uint,
                                      channels: u8, sample_rate: c_uint,
                                      userdata: *mut c_void);

#[repr(C)]
#[deriving(Copy)]
pub enum ToxAvCallbackId {
    av_OnInvite,
    av_OnRinging,
    av_OnStart,
    av_OnCancel,
    av_OnReject,
    av_OnEnd,
    av_OnRequestTimeout,
    av_OnPeerTimeout,
    av_OnPeerCSChange,
    av_OnSelfCSChange,
}

#[link(name = "toxav")]
extern {
    pub static av_DefaultSettings: CallSettings;

    pub fn toxav_new(messenger: *mut Tox, max_calls: i32) -> *mut ToxAv;
    pub fn toxav_kill(av: *mut ToxAv);
    pub fn toxav_do_interval(av: *mut ToxAv) -> u32;
    pub fn toxav_do(av: *mut ToxAv);
    pub fn toxav_register_callstate_callback(av: *mut ToxAv, cb: Option<ToxAVCallback>,
                                             id: ToxAvCallbackId, userdata: *mut c_void);
    pub fn toxav_register_audio_callback(av: *mut ToxAv, cb: Option<ToxAvAudioCallback>,
                                         userdata: *mut c_void);
    pub fn toxav_call(av: *mut ToxAv, call_index: *mut i32, friend_id: c_int,
                      csettings: *const CallSettings, ringing_seconds: c_int) -> c_int;
    pub fn toxav_hangup(av: *mut ToxAv, call_index: i32) -> c_int;
    pub fn toxav_answer(av: *mut ToxAv, call_index: i32,
                        csettings: *const CallSettings) -> c_int;
    pub fn toxav_reject(av: *mut ToxAv, call_index: i32, reason: *const c_char) -> c_int;
    pub fn toxav_cancel(av: *mut ToxAv, call_index: i32, peer_id: c_int,
                        reason: *const c_char) -> c_int;
    pub fn toxav_change_settings(av: *mut ToxAv, call_index: i32,
                                 csettings: *const CallSettings) -> c_int;
    pub fn toxav_stop_call(av: *mut ToxAv, call_index: i32) -> c_int;
    pub fn toxav_prepare_transmission(av: *mut ToxAv, call_index: i32,
                                      support_video: c_int) -> c_int;
    pub fn toxav_kill_transmission(av: *mut ToxAv, call_index: i32) -> c_int;
    pub fn toxav_prepare_audio_frame(av: *mut ToxAv, call_index: i32, dest: *mut u8,
                                     dest_max: c_int, frame: *const i16,
                                     frame_size: c_int) -> c_int;
    pub fn toxav_send_audio(av: *mut ToxAv, call_index: i32, frame: *const u8,
                            size: c_uint) -> c_int;
    pub fn toxav_get_peer_csettings(av: *mut ToxAv, call_index: i32, peer: c_int,
                                    dest: *mut CallSettings) -> c_int;
    pub fn toxav_get_peer_id(av: *mut ToxAv, call_index: i32, peer: c_int) -> c_int;
    pub fn toxav_get_call_state(av: *mut ToxAv, call_index: i32) -> CallState;
    pub fn toxav_capability_supported(av: *mut ToxAv, call_index: i32,
                                      capability: Capability) -> c_int;
    pub fn toxav_get_tox(av: *mut ToxAv) -> *mut Tox;
    pub fn toxav_get_active_count(av: *mut ToxAv) -> c_int;
    pub fn toxav_add_av_groupchat(tox: *mut Tox, audio_callback: Option<ToxAudioCallback>,
                                  userdata: *mut c_void) -> c_int;
    pub fn toxav_join_av_groupchat(tox: *mut Tox, friendnumber: i32, data: *const u8,
                                   length: u16, audio_callback: Option<ToxAudioCallback>,
                                   userdata: *mut c_void) -> c_int;
    pub fn toxav_group_send_audio(tox: *mut Tox, groupnumber: c_int, pcm: *const i16,
                                  samples: c_uint, channels: u8,
                                  sample_rate: c_uint) -> c_int;
}