aboutsummaryrefslogtreecommitdiff
path: root/src/ext/voice/connection.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext/voice/connection.rs')
-rw-r--r--src/ext/voice/connection.rs94
1 files changed, 46 insertions, 48 deletions
diff --git a/src/ext/voice/connection.rs b/src/ext/voice/connection.rs
index 58b8e1f..373f4ef 100644
--- a/src/ext/voice/connection.rs
+++ b/src/ext/voice/connection.rs
@@ -63,21 +63,19 @@ pub struct Connection {
impl Connection {
pub fn new(mut info: ConnectionInfo) -> Result<Connection> {
- let url = try!(generate_url(&mut info.endpoint));
+ let url = generate_url(&mut info.endpoint)?;
- let response = try!(try!(WsClient::connect(url)).send());
- try!(response.validate());
+ let response = WsClient::connect(url)?.send()?;
+ response.validate()?;
let (mut sender, mut receiver) = response.begin().split();
- try!(sender.send_json(&payload::build_identify(&info)));
+ sender.send_json(&payload::build_identify(&info))?;
let hello = {
let hello;
loop {
- let k = receiver.recv_json(VoiceEvent::decode);
-
- match try!(k) {
+ match receiver.recv_json(VoiceEvent::decode)? {
VoiceEvent::Hello(received_hello) => {
hello = received_hello;
@@ -100,10 +98,10 @@ impl Connection {
return Err(Error::Voice(VoiceError::VoiceModeUnavailable));
}
- let destination = try!(try!((&info.endpoint[..], hello.port)
- .to_socket_addrs())
+ let destination = (&info.endpoint[..], hello.port)
+ .to_socket_addrs()?
.next()
- .ok_or(Error::Voice(VoiceError::HostnameResolve)));
+ .ok_or(Error::Voice(VoiceError::HostnameResolve))?;
// Important to note here: the length of the packet can be of either 4
// or 70 bytes. If it is 4 bytes, then we need to send a 70-byte packet
@@ -113,37 +111,37 @@ impl Connection {
//
// The returned packet will be a null-terminated string of the IP, and
// the port encoded in LE in the last two bytes of the packet.
- let udp = try!(UdpSocket::bind("0.0.0.0:0"));
+ let udp = UdpSocket::bind("0.0.0.0:0")?;
{
let mut bytes = [0; 70];
- try!((&mut bytes[..]).write_u32::<BigEndian>(hello.ssrc));
- try!(udp.send_to(&bytes, destination));
+ (&mut bytes[..]).write_u32::<BigEndian>(hello.ssrc)?;
+ udp.send_to(&bytes, destination)?;
let mut bytes = [0; 256];
- let (len, _addr) = try!(udp.recv_from(&mut bytes));
+ let (len, _addr) = udp.recv_from(&mut bytes)?;
// Find the position in the bytes that contains the first byte of 0,
// indicating the "end of the address".
- let index = try!(bytes.iter().skip(4).position(|&x| x == 0)
- .ok_or(Error::Voice(VoiceError::FindingByte)));
+ let index = bytes.iter().skip(4).position(|&x| x == 0)
+ .ok_or(Error::Voice(VoiceError::FindingByte))?;
let pos = 4 + index;
let addr = String::from_utf8_lossy(&bytes[4..pos]);
let port_pos = len - 2;
- let port = try!((&bytes[port_pos..]).read_u16::<LittleEndian>());
+ let port = (&bytes[port_pos..]).read_u16::<LittleEndian>()?;
- try!(sender.send_json(&payload::build_select_protocol(addr, port)));
+ sender.send_json(&payload::build_select_protocol(addr, port))?;
}
- let key = try!(get_encryption_key(&mut receiver));
+ let key = get_encryption_key(&mut receiver)?;
- let thread_items = try!(start_threads(receiver, &udp));
+ let thread_items = start_threads(receiver, &udp)?;
info!("[Voice] Connected to: {}", info.endpoint);
- let encoder = try!(OpusEncoder::new(SAMPLE_RATE, Channels::Mono, CodingMode::Audio));
+ let encoder = OpusEncoder::new(SAMPLE_RATE, Channels::Mono, CodingMode::Audio)?;
Ok(Connection {
audio_timer: Timer::new(1000 * 60 * 4),
@@ -179,21 +177,21 @@ impl Connection {
match status {
ReceiverStatus::Udp(packet) => {
let mut handle = &packet[2..];
- let seq = try!(handle.read_u16::<BigEndian>());
- let timestamp = try!(handle.read_u32::<BigEndian>());
- let ssrc = try!(handle.read_u32::<BigEndian>());
+ let seq = handle.read_u16::<BigEndian>()?;
+ let timestamp = handle.read_u32::<BigEndian>()?;
+ let ssrc = handle.read_u32::<BigEndian>()?;
nonce.0[..HEADER_LEN].clone_from_slice(&packet[..HEADER_LEN]);
if let Ok(decrypted) = secretbox::open(&packet[HEADER_LEN..], &nonce, &self.key) {
- let channels = try!(opus_packet::get_nb_channels(&decrypted));
+ let channels = opus_packet::get_nb_channels(&decrypted)?;
let entry = self.decoder_map.entry((ssrc, channels))
.or_insert_with(|| OpusDecoder::new(SAMPLE_RATE,
channels)
.unwrap());
- let len = try!(entry.decode(&decrypted, &mut buffer, false));
+ let len = entry.decode(&decrypted, &mut buffer, false)?;
let is_stereo = channels == Channels::Stereo;
@@ -227,20 +225,20 @@ impl Connection {
// Send the voice websocket keepalive if it's time
if self.keepalive_timer.check() {
- try!(self.sender.send_json(&payload::build_keepalive()));
+ self.sender.send_json(&payload::build_keepalive())?;
}
// Send UDP keepalive if it's time
if self.audio_timer.check() {
let mut bytes = [0; 4];
- try!((&mut bytes[..]).write_u32::<BigEndian>(self.ssrc));
- try!(self.udp.send_to(&bytes, self.destination));
+ (&mut bytes[..]).write_u32::<BigEndian>(self.ssrc)?;
+ self.udp.send_to(&bytes, self.destination)?;
}
- let len = try!(self.read(source, &mut buffer));
+ let len = self.read(source, &mut buffer)?;
if len == 0 {
- try!(self.set_speaking(false));
+ self.set_speaking(false)?;
if self.silence_frames > 0 {
self.silence_frames -= 1;
@@ -261,11 +259,11 @@ impl Connection {
}
}
- try!(self.set_speaking(true));
- let index = try!(self.prep_packet(&mut packet, buffer, nonce));
+ self.set_speaking(true)?;
+ let index = self.prep_packet(&mut packet, buffer, nonce)?;
audio_timer.await();
- try!(self.udp.send_to(&packet[..index], self.destination));
+ self.udp.send_to(&packet[..index], self.destination)?;
self.audio_timer.reset();
Ok(())
@@ -278,10 +276,10 @@ impl Connection {
-> Result<usize> {
{
let mut cursor = &mut packet[..HEADER_LEN];
- try!(cursor.write_all(&[0x80, 0x78]));
- try!(cursor.write_u16::<BigEndian>(self.sequence));
- try!(cursor.write_u32::<BigEndian>(self.timestamp));
- try!(cursor.write_u32::<BigEndian>(self.ssrc));
+ cursor.write_all(&[0x80, 0x78])?;
+ cursor.write_u16::<BigEndian>(self.sequence)?;
+ cursor.write_u32::<BigEndian>(self.timestamp)?;
+ cursor.write_u32::<BigEndian>(self.ssrc)?;
}
nonce.0[..HEADER_LEN].clone_from_slice(&packet[..HEADER_LEN]);
@@ -293,8 +291,8 @@ impl Connection {
960
};
- let len = try!(self.encoder.encode(&buffer[..buffer_len],
- &mut packet[HEADER_LEN..sl_index]));
+ let len = self.encoder.encode(&buffer[..buffer_len],
+ &mut packet[HEADER_LEN..sl_index])?;
let crypted = {
let slice = &packet[HEADER_LEN..HEADER_LEN + len];
secretbox::seal(slice, &nonce, &self.key)
@@ -324,9 +322,9 @@ impl Connection {
} else {
Channels::Mono
};
- self.encoder = try!(OpusEncoder::new(SAMPLE_RATE,
+ self.encoder = OpusEncoder::new(SAMPLE_RATE,
channels,
- CodingMode::Audio));
+ CodingMode::Audio)?;
self.encoder_stereo = is_stereo;
}
@@ -390,7 +388,7 @@ fn generate_url(endpoint: &mut String) -> Result<WebsocketUrl> {
fn get_encryption_key(receiver: &mut WsReceiver<WebSocketStream>)
-> Result<Key> {
loop {
- match try!(receiver.recv_json(VoiceEvent::decode)) {
+ match receiver.recv_json(VoiceEvent::decode)? {
VoiceEvent::Ready(ready) => {
if ready.mode != CRYPTO_MODE {
return Err(Error::Voice(VoiceError::VoiceModeInvalid));
@@ -425,9 +423,9 @@ fn start_threads(mut receiver: WsReceiver<WebSocketStream>, udp: &UdpSocket)
let (tx, rx) = mpsc::channel();
let tx_clone = tx.clone();
- let udp_clone = try!(udp.try_clone());
+ let udp_clone = udp.try_clone()?;
- let udp_thread = try!(ThreadBuilder::new()
+ let udp_thread = ThreadBuilder::new()
.name(format!("{} UDP", thread_name))
.spawn(move || {
let _ = udp_clone.set_read_timeout(Some(Duration::from_millis(250)));
@@ -446,9 +444,9 @@ fn start_threads(mut receiver: WsReceiver<WebSocketStream>, udp: &UdpSocket)
return;
}
}
- }));
+ })?;
- let ws_thread = try!(ThreadBuilder::new()
+ let ws_thread = ThreadBuilder::new()
.name(format!("{} WS", thread_name))
.spawn(move || {
loop {
@@ -464,7 +462,7 @@ fn start_threads(mut receiver: WsReceiver<WebSocketStream>, udp: &UdpSocket)
thread::sleep(Duration::from_millis(25));
}
- }));
+ })?;
Ok(ThreadItems {
rx: rx,