if (msg->has_authorized && msg->authorized) {
do_send_rt_packet(audio, NULL);
chime_call_audio_set_state(audio, audio->silent ? CHIME_AUDIO_STATE_AUDIOLESS :
- (audio->local_mute ? CHIME_AUDIO_STATE_AUDIO_MUTED : CHIME_AUDIO_STATE_AUDIO));
+ (audio->local_mute ? CHIME_AUDIO_STATE_AUDIO_MUTED : CHIME_AUDIO_STATE_AUDIO),
+ NULL);
if ((audio->silent || audio->local_mute) &&
!audio->send_rt_source)
audio->send_rt_source = g_timeout_add(100, (GSourceFunc)timed_send_rt_packet, audio);
gst_app_sink_set_callbacks(audio->audio_sink, &no_appsink_callbacks, NULL, NULL);
chime_call_transport_disconnect(audio, hangup);
- chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_HANGUP);
+ chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_HANGUP, NULL);
g_hash_table_destroy(audio->profiles);
g_free(audio);
if (muted) {
if (audio->state == CHIME_AUDIO_STATE_AUDIO)
- chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_AUDIO_MUTED);
+ chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_AUDIO_MUTED, NULL);
if (!audio->send_rt_source)
audio->send_rt_source = g_timeout_add(100, (GSourceFunc)timed_send_rt_packet, audio);
} else {
if (audio->state == CHIME_AUDIO_STATE_AUDIO_MUTED)
- chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_AUDIO);
+ chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_AUDIO, NULL);
if (audio->send_rt_source) {
g_source_remove(audio->send_rt_source);
audio->send_rt_source = 0;
void chime_call_audio_close(ChimeCallAudio *audio, gboolean hangup);
void chime_call_audio_reopen(ChimeCallAudio *audio, gboolean silent);
gboolean chime_call_audio_get_silent(ChimeCallAudio *audio);
-void chime_call_audio_set_state(ChimeCallAudio *audio, ChimeAudioState state);
+void chime_call_audio_set_state(ChimeCallAudio *audio, ChimeAudioState state, const gchar *message);
void chime_call_audio_local_mute(ChimeCallAudio *audio, gboolean muted);
/* Called from audio code */
gst_app_sink_set_callbacks(screen->screen_sink, &no_appsink_callbacks, NULL, NULL);
screen->screen_sink = NULL;
- chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED);
+ chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED, NULL);
}
break;
/* If it was cancelled, 'screen' may have been freed. */
if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
chime_debug("screen ws error %s\n", error->message);
+ chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_FAILED, error->message);
}
g_clear_error(&error);
g_object_unref(cxn);
else if (screen->screen_sink)
chime_call_screen_install_appsink(screen, screen->screen_sink);
else
- chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED);
+ chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED, NULL);
g_object_unref(cxn);
}
gchar *origin = g_strdup_printf("http://%s", soup_uri_get_host(uri));
soup_uri_free(uri);
- chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTING);
+ chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTING, NULL);
chime_connection_websocket_connect_async(g_object_ref(cxn), msg, origin, protocols,
screen->cancel, screen_ws_connect_cb, screen);
void chime_call_screen_close(ChimeCallScreen *screen)
{
- chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_HANGUP);
+ chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_HANGUP, NULL);
if (screen->cancel) {
g_cancellable_cancel(screen->cancel);
if (screen->state == CHIME_SCREEN_STATE_VIEWING) {
screen_send_packet(screen, SCREEN_PKT_TYPE_VIEWER_END, NULL, 0);
screen->screen_src = NULL;
- chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED);
+ chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED, NULL);
}
}
if (screen->ws) {
screen_send_packet(screen, SCREEN_PKT_TYPE_VIEWER_BEGIN, NULL, 0);
- chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_VIEWING);
+ chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_VIEWING, NULL);
}
if (screen->screen_sink) {
if (screen->state == CHIME_SCREEN_STATE_SENDING) {
screen_send_packet(screen, SCREEN_PKT_TYPE_PRESENTER_END, NULL, 0);
screen->screen_sink = NULL;
- chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED);
+ chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED, NULL);
}
}
if (screen->ws) {
screen_send_packet(screen, SCREEN_PKT_TYPE_PRESENTER_BEGIN, NULL, 0);
- chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_SENDING);
+ chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_SENDING, NULL);
}
if (screen->screen_src) {
void chime_call_screen_close(ChimeCallScreen *screen);
void chime_call_screen_view(ChimeCallScreen *screen);
void chime_call_screen_unview(ChimeCallScreen *screen);
-void chime_call_screen_set_state(ChimeCallScreen *audio, ChimeScreenState state);
+void chime_call_screen_set_state(ChimeCallScreen *audio, ChimeScreenState state, const gchar *message);
void chime_call_screen_install_appsrc(ChimeCallScreen *screen, GstAppSrc *appsrc);
void chime_call_screen_install_appsink(ChimeCallScreen *screen, GstAppSink *appsink);
audio->dtls_handshaked = FALSE;
audio->recv_ssrc = g_random_int();
- chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_CONNECTING);
+ chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_CONNECTING, NULL);
GSocketConnectable *addr = g_network_address_parse(chime_call_get_media_host(audio->call),
0, NULL);
signals[AUDIO_STATE] =
g_signal_new ("audio-state",
G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST,
- 0, NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_INT);
+ 0, NULL, NULL, NULL, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING);
signals[SCREEN_STATE] =
g_signal_new ("screen-state",
G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST,
- 0, NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_INT);
+ 0, NULL, NULL, NULL, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING);
signals[PARTICIPANTS_CHANGED] =
g_signal_new ("participants-changed",
chime_call_audio_local_mute(call->audio, muted);
}
-void chime_call_audio_set_state(ChimeCallAudio *audio, ChimeAudioState state)
+void chime_call_audio_set_state(ChimeCallAudio *audio, ChimeAudioState state, const gchar *message)
{
- chime_debug("Audio state %d (was %d)\n", state, audio->state);
+ chime_debug("Audio state %d (was %d), msg %s\n", state, audio->state, message);
if (audio->state == state)
return;
audio->state = state;
- g_signal_emit(audio->call, signals[AUDIO_STATE], 0, state);
+ g_signal_emit(audio->call, signals[AUDIO_STATE], 0, state, message);
}
-void chime_call_screen_set_state(ChimeCallScreen *screen, ChimeScreenState state)
+void chime_call_screen_set_state(ChimeCallScreen *screen, ChimeScreenState state, const gchar *message)
{
- chime_debug("Screen state %d (was %d)\n", state, screen->state);
+ chime_debug("Screen state %d (was %d), msg %s\n", state, screen->state, message);
if (screen->state == state)
return;
screen->state = state;
- g_signal_emit(screen->call, signals[SCREEN_STATE], 0, state);
+ g_signal_emit(screen->call, signals[SCREEN_STATE], 0, state, message);
}
void chime_call_install_gst_app_callbacks(ChimeCall *call, GstAppSrc *appsrc, GstAppSink *appsink)
g_task_return_new_error (task,
SOUP_WEBSOCKET_ERROR, SOUP_WEBSOCKET_ERROR_NOT_WEBSOCKET,
- "%s", _("The server did not accept the WebSocket handshake."));
+ _("WebSocket handshake failed: (%d/%s)"),
+ msg->status_code, msg->reason_phrase);
g_object_unref (task);
}
GST_DEBUG_GRAPH_SHOW_ALL, "chime conference graph");
}
-static void on_audio_state(ChimeCall *call, ChimeAudioState audio_state, struct chime_chat *chat)
+static void on_audio_state(ChimeCall *call, ChimeAudioState audio_state,
+ const gchar *message, struct chime_chat *chat)
{
- purple_debug(PURPLE_DEBUG_INFO, "chime", "Audio state %d\n", audio_state);
+ purple_debug(PURPLE_DEBUG_INFO, "chime", "Audio state %d (%s)\n", audio_state, message);
const gchar *name = chime_call_get_alert_body(chat->call);
- if (audio_state == CHIME_AUDIO_STATE_CONNECTING && !chat->media &&
+ if (audio_state == CHIME_AUDIO_STATE_FAILED) {
+ if (chat->media) {
+ purple_media_error(chat->media, "Failed to connect audio transport: %s\n",
+ message);
+ purple_media_end(chat->media, NULL, NULL);
+ chat->media = NULL;
+ }
+ } else if (audio_state == CHIME_AUDIO_STATE_CONNECTING && !chat->media &&
!chime_call_get_silent(call)) {
call_media_setup(call, chat);
} else if (audio_state == CHIME_AUDIO_STATE_AUDIO_MUTED && chat->media) {
}
}
-static void on_screen_state(ChimeCall *call, ChimeScreenState screen_state, struct chime_chat *chat)
+static void on_screen_state(ChimeCall *call, ChimeScreenState screen_state,
+ const gchar *message, struct chime_chat *chat)
{
- purple_debug(PURPLE_DEBUG_INFO, "chime", "Screen state %d\n", screen_state);
+ purple_debug(PURPLE_DEBUG_INFO, "chime", "Screen state %d (%s)\n", screen_state, message);
if (screen_state == CHIME_SCREEN_STATE_CONNECTING)
return;
if (chat->share_media) {
- if (screen_state == CHIME_SCREEN_STATE_SENDING) {
+ if (screen_state == CHIME_SCREEN_STATE_FAILED) {
+ purple_media_error(chat->share_media, _("Failed to connect to screen bithub: %s\n"),
+ message);
+ purple_media_end(chat->share_media, NULL, NULL);
+ chat->share_media = NULL;
+ } else if (screen_state == CHIME_SCREEN_STATE_SENDING) {
purple_media_stream_info(chat->share_media, PURPLE_MEDIA_INFO_ACCEPT, "chime", _("Sharing screen"), FALSE);
} else {
purple_debug(PURPLE_DEBUG_INFO, "chime", "Screen presentation ends\n");
chat->share_media = NULL;
}
} else if (chat->screen_media) {
- if (screen_state == CHIME_SCREEN_STATE_VIEWING) {
+ if (screen_state == CHIME_SCREEN_STATE_FAILED) {
+ purple_media_error(chat->share_media, _("Failed to connect to screen bithub: %s\n"),
+ message);
+ purple_media_end(chat->screen_media, NULL, NULL);
+ chat->screen_media = NULL;
+ } else if (screen_state == CHIME_SCREEN_STATE_VIEWING) {
purple_media_stream_info(chat->screen_media, PURPLE_MEDIA_INFO_ACCEPT, "chime", chat->screen_title, FALSE);
} else {
purple_debug(PURPLE_DEBUG_INFO, "chime", "Screen viewing ends\n");