X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fclient.c;h=a992129cb774bcd3ba4eb6803a4cc38cc8799770;hb=0c57b93dfb882580f7ec43f0ddfea83c1c7ea729;hp=abb9377ef1b0dbc5f52d6566022250f0a282da05;hpb=f8b5a8c02b63f644ca1d977af362b2f9f8037534;p=umurmur.git
diff --git a/src/client.c b/src/client.c
index abb9377..a992129 100644
--- a/src/client.c
+++ b/src/client.c
@@ -196,7 +196,8 @@ void Client_token_free(client_t *client)
}
-#define OPUS_WARN "WARNING: Your client doesn't support the Opus codec the server is using, you won't be able to talk or hear anyone. Please upgrade"
+#define OPUS_WARN_USING "WARNING: Your client doesn't support the Opus codec the server is using, you won't be able to talk or hear anyone. Please upgrade your Mumble client."
+#define OPUS_WARN_SWITCHING "WARNING: Your client doesn't support the Opus codec the server is switching to, you won't be able to talk or hear anyone. Please upgrade your Mumble client."
void recheckCodecVersions(client_t *connectingClient)
{
client_t *client_itr = NULL;
@@ -238,7 +239,6 @@ void recheckCodecVersions(client_t *connectingClient)
if (client_itr->bOpus)
opus++;
}
-
if (users == 0)
return;
@@ -271,36 +271,33 @@ void recheckCodecVersions(client_t *connectingClient)
iCodecAlpha = version;
else
iCodecBeta = version;
- } else if (bOpus == enableOpus) {
- if (connectingClient && !connectingClient->bOpus) {
- Client_textmessage(client_itr, OPUS_WARN);
- }
+ } else if (bOpus && enableOpus) {
+ if (connectingClient && !connectingClient->bOpus)
+ Client_textmessage(connectingClient, OPUS_WARN_USING);
return;
}
-
- bOpus = enableOpus;
- Log_info("OPUS codec is %s", bOpus ? "enabled" : "disabled");
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;
+ sendmsg->payload.codecVersion->opus = enableOpus;
Client_send_message_except(NULL, sendmsg);
- Log_info("CELT codec switch 0x%x 0x%x (prefer 0x%x)", iCodecAlpha, iCodecBeta,
- bPreferAlpha ? iCodecAlpha : iCodecBeta);
-
- client_itr = NULL;
- while (Client_iterate(&client_itr) != NULL) {
- if ((client_itr->authenticated || client_itr == connectingClient) &&
- !client_itr->bOpus) {
- Client_textmessage(client_itr, OPUS_WARN);
+ if (enableOpus && !bOpus) {
+ client_itr = NULL;
+ while (Client_iterate(&client_itr) != NULL) {
+ if ((client_itr->authenticated || client_itr == connectingClient) &&
+ !client_itr->bOpus) {
+ Client_textmessage(client_itr, OPUS_WARN_SWITCHING);
+ }
}
+ Log_info("OPUS codec %s", bOpus ? "enabled" : "disabled");
}
+ bOpus = enableOpus;
}
static int findFreeSessionId()
@@ -377,6 +374,7 @@ void Client_free(client_t *client)
{
struct dlist *itr, *save;
message_t *sendmsg;
+ bool_t authenticatedLeft = client->authenticated;
if (client->authenticated) {
int leave_id;
@@ -389,7 +387,6 @@ void Client_free(client_t *client)
sendmsg = Msg_create(UserRemove);
sendmsg->payload.userRemove->session = client->sessionId;
Client_send_message_except(client, sendmsg);
- recheckCodecVersions(NULL); /* Can use better codec now? */
}
list_iterate_safe(itr, save, &client->txMsgQueue) {
list_del(&list_get_entry(itr, message_t, node)->node);
@@ -415,6 +412,9 @@ void Client_free(client_t *client)
if (client->context)
free(client->context);
free(client);
+
+ if (authenticatedLeft)
+ recheckCodecVersions(NULL); /* Can use better codec now? */
}
void Client_close(client_t *client)
@@ -514,14 +514,18 @@ int Client_read(client_t *client)
client->readBlockedOnWrite = true;
return 0;
}
- else if (SSLi_get_error(client->ssl, rc) == SSLI_ERROR_ZERO_RETURN) {
+ else if (SSLi_get_error(client->ssl, rc) == SSLI_ERROR_ZERO_RETURN ||
+ SSLi_get_error(client->ssl, rc) == 0) {
Log_info_client(client, "Connection closed by peer");
- if (!client->shutdown_wait)
- Client_close(client);
+ Client_close(client);
}
else {
if (SSLi_get_error(client->ssl, rc) == SSLI_ERROR_SYSCALL) {
- Log_info_client(client,"Error: %s - Closing connection", strerror(errno));
+ if (errno == 0)
+ Log_info_client(client, "Connection closed by peer");
+ else
+ Log_info_client(client,"Error: %s - Closing connection (code %d)",
+ strerror(errno));
}
else if (SSLi_get_error(client->ssl, rc) == SSLI_ERROR_CONNRESET) {
Log_info_client(client, "Connection reset by peer");