summaryrefslogtreecommitdiff
path: root/src/cmumble.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmumble.c')
-rw-r--r--src/cmumble.c65
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