X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fmessagehandler.c;h=1e49241890d6252664522f06177a88a3d956e49a;hb=36601a5de5f90e16188deadd271b70595b4cc237;hp=2dea8588d6cca8defbf5d0c40e15eaaef0d5a7fc;hpb=237691dc7eb239c3cffb06c22291105cb5510ace;p=umurmur.git diff --git a/src/messagehandler.c b/src/messagehandler.c index 2dea858..1e49241 100644 --- a/src/messagehandler.c +++ b/src/messagehandler.c @@ -1,5 +1,5 @@ -/* Copyright (C) 2009-2012, Martin Johansson - Copyright (C) 2005-2012, Thorvald Natvig +/* Copyright (C) 2009-2013, Martin Johansson + Copyright (C) 2005-2013, Thorvald Natvig All rights reserved. @@ -45,9 +45,14 @@ #define MAX_TEXT 512 #define MAX_USERNAME 128 +#define NO_CELT_MESSAGE "WARNING: Your client doesn't support the CELT codec, you won't be able to talk to or hear most clients. Please make sure your client was built with CELT support." + + extern channel_t *defaultChan; extern int iCodecAlpha, iCodecBeta; -extern bool_t bPreferAlpha; +extern bool_t bPreferAlpha, bOpus; + +static bool_t fake_celt_support; static void sendServerReject(client_t *client, const char *reason, MumbleProto__Reject__RejectType type) { @@ -224,18 +229,27 @@ void Mh_handle_message(client_t *client, message_t *msg) Log_debug("Client %d CELT codec ver 0x%x", client->sessionId, codec_itr->codec); } else { - Client_codec_add(client, (int32_t)0x8000000a); + Client_codec_add(client, (int32_t)0x8000000b); client->codec_count = 1; + fake_celt_support = true; } + if (msg->payload.authenticate->opus) + client->bOpus = true; - recheckCodecVersions(); + recheckCodecVersions(client); sendmsg = Msg_create(CodecVersion); sendmsg->payload.codecVersion->alpha = iCodecAlpha; sendmsg->payload.codecVersion->beta = iCodecBeta; sendmsg->payload.codecVersion->prefer_alpha = bPreferAlpha; + sendmsg->payload.codecVersion->has_opus = true; + sendmsg->payload.codecVersion->opus = bOpus; Client_send_message(client, sendmsg); - + + if (!bOpus && client->bOpus && fake_celt_support) { + Client_textmessage(client, NO_CELT_MESSAGE); + } + /* Iterate channels and send channel info */ ch_itr = NULL; while (Chan_iterate(&ch_itr) != NULL) { @@ -249,6 +263,10 @@ void Mh_handle_message(client_t *client, message_t *msg) sendmsg->payload.channelState->name = strdup(ch_itr->name); if (ch_itr->desc) sendmsg->payload.channelState->description = strdup(ch_itr->desc); + if (ch_itr->position != 0) { + sendmsg->payload.channelState->has_position = true; + sendmsg->payload.channelState->position = ch_itr->position; + } Log_debug("Send channel info: %s", sendmsg->payload.channelState->name); Client_send_message(client, sendmsg); } @@ -714,6 +732,8 @@ void Mh_handle_message(client_t *client, message_t *msg) newchan = Chan_createChannel(msg->payload.channelState->name, msg->payload.channelState->description); newchan->temporary = true; + if (msg->payload.channelState->has_position) + newchan->position = msg->payload.channelState->position; Chan_addChannel(parent, newchan); msg->payload.channelState->has_channel_id = true; msg->payload.channelState->channel_id = newchan->id; @@ -803,9 +823,12 @@ void Mh_handle_message(client_t *client, message_t *msg) sendmsg->payload.userStats->version->has_version = true; sendmsg->payload.userStats->version->version = target->version; - sendmsg->payload.userStats->version->release = strdup(target->release); - sendmsg->payload.userStats->version->os = strdup(target->os); - sendmsg->payload.userStats->version->os_version = strdup(target->os_version); + if (target->release) + sendmsg->payload.userStats->version->release = strdup(target->release); + if (target->os) + sendmsg->payload.userStats->version->os = strdup(target->os); + if (target->os_version) + sendmsg->payload.userStats->version->os_version = strdup(target->os_version); sendmsg->payload.userStats->n_celt_versions = target->codec_count; sendmsg->payload.userStats->celt_versions = malloc(sizeof(int32_t) * target->codec_count); @@ -815,6 +838,9 @@ void Mh_handle_message(client_t *client, message_t *msg) while (Client_codec_iterate(target, &codec_itr) != NULL) sendmsg->payload.userStats->celt_versions[i++] = codec_itr->codec; + sendmsg->payload.userStats->has_opus = true; + sendmsg->payload.userStats->opus = target->bOpus; + /* Address */ sendmsg->payload.userStats->has_address = true; sendmsg->payload.userStats->address.data = malloc(sizeof(uint8_t) * 16);