diff options
Diffstat (limited to 'src/cmumble.c')
-rw-r--r-- | src/cmumble.c | 65 |
1 files changed, 40 insertions, 25 deletions
diff --git a/src/cmumble.c b/src/cmumble.c index e76920e..640b6ea 100644 --- a/src/cmumble.c +++ b/src/cmumble.c @@ -9,14 +9,12 @@ #include "util.h" static void -recv_udp_tunnel(MumbleProto__UDPTunnel *tunnel, struct cmumlbe *cm) +cmumble_read_audio_packet(struct cmumlbe *cm, uint8_t *data, size_t len) { int64_t session, sequence; uint32_t pos = 1, read = 0; uint8_t frame_len, terminator; struct cmumble_user *user = NULL; - uint8_t *data = tunnel->packet.data; - size_t len = tunnel->packet.len; session = decode_varint(&data[pos], &read, len-pos); pos += read; @@ -45,6 +43,34 @@ recv_udp_tunnel(MumbleProto__UDPTunnel *tunnel, struct cmumlbe *cm) } while (terminator); } +void +cmumble_read_udp_data(struct cmumlbe *cm, guint8 *data, gsize size) +{ + guint num; + gint64 timestamp; + + switch ((data[0] >> 5) & 0x03) { + case udp_ping: + timestamp = decode_varint(&data[1], &num, size - 1); + g_print("received udp ping, timestamp: %ld\n", timestamp); + break; + case udp_voice_celt_alpha: + case udp_voice_speex: + case udp_voice_celt_beta: + cmumble_read_audio_packet(cm, data, size); + break; + default: + g_printerr("Invalid udp message received\n"); + break; + } +} + +static void +recv_udp_tunnel(MumbleProto__UDPTunnel *tunnel, struct cmumlbe *cm) +{ + cmumble_read_udp_data(cm, tunnel->packet.data, tunnel->packet.len); +} + static void recv_version(MumbleProto__Version *version, struct cmumlbe *cm) { @@ -98,28 +124,17 @@ recv_server_sync(MumbleProto__ServerSync *sync, struct cmumlbe *cm) static void recv_crypt_setup(MumbleProto__CryptSetup *crypt, struct cmumlbe *cm) { -#if 0 - int i; - - if (crypt->has_key) { - g_print("key: 0x"); - for (i = 0; i < crypt->key.len; ++i) - g_print("%x", crypt->key.data[i]); - g_print("\n"); - } - if (crypt->has_client_nonce) { - g_print("client nonce: 0x"); - for (i = 0; i < crypt->client_nonce.len; ++i) - g_print("%x", crypt->client_nonce.data[i]); - g_print("\n"); - } - if (crypt->has_server_nonce) { - g_print("server nonce: 0x"); - for (i = 0; i < crypt->server_nonce.len; ++i) - g_print("%x", crypt->server_nonce.data[i]); - g_print("\n"); - } -#endif + g_return_if_fail(crypt->key.len == 16 && + crypt->client_nonce.len == 16 && + crypt->server_nonce.len == 16); + + CryptState_init(&cm->crypt); + CryptState_setKey(&cm->crypt, + crypt->key.data, + crypt->client_nonce.data, + crypt->server_nonce.data); + + cmumble_connection_udp_init(cm); } static void |