-/* Copyright (C) 2009-2012, Martin Johansson <martin@fatbob.nu>
- Copyright (C) 2005-2012, Thorvald Natvig <thorvald@natvig.com>
+/* Copyright (C) 2009-2013, Martin Johansson <martin@fatbob.nu>
+ Copyright (C) 2005-2013, Thorvald Natvig <thorvald@natvig.com>
All rights reserved.
#define MAX_TEXT 512
#define MAX_USERNAME 128
+#define NO_CELT_MESSAGE "<strong>WARNING:</strong> 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)
{
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) {
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);
}
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;
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);
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);