diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 215248f3b..8ab925cf4 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1268,9 +1268,9 @@ bool_t linphone_call_echo_limiter_enabled(const LinphoneCall *call){ **/ float linphone_call_get_play_volume(LinphoneCall *call){ AudioStream *st=call->audiostream; - if (st && st->volsend){ + if (st && st->volrecv){ float vol=0; - ms_filter_call_method(st->volsend,MS_VOLUME_GET,&vol); + ms_filter_call_method(st->volrecv,MS_VOLUME_GET,&vol); return vol; } @@ -1283,9 +1283,9 @@ float linphone_call_get_play_volume(LinphoneCall *call){ **/ float linphone_call_get_record_volume(LinphoneCall *call){ AudioStream *st=call->audiostream; - if (st && st->volrecv){ + if (st && st->volsend && !call->audio_muted && call->state==LinphoneCallStreamsRunning){ float vol=0; - ms_filter_call_method(st->volrecv,MS_VOLUME_GET,&vol); + ms_filter_call_method(st->volsend,MS_VOLUME_GET,&vol); return vol; } diff --git a/gtk/friendlist.c b/gtk/friendlist.c index 075bbd99a..9dacac717 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -198,7 +198,9 @@ static void update_star(GtkEntry *entry, gboolean is_known){ unstarred=g_object_get_data(G_OBJECT(entry),"unstarred_icon"); if (is_known && (active==unstarred)){ gtk_entry_set_icon_from_pixbuf(entry,GTK_ENTRY_ICON_SECONDARY,starred); + gtk_entry_set_icon_tooltip_text(GTK_ENTRY(entry),GTK_ENTRY_ICON_SECONDARY,NULL); }else if ((!is_known) && (active==starred)){ + gtk_entry_set_icon_tooltip_text(GTK_ENTRY(entry),GTK_ENTRY_ICON_SECONDARY,_("Add to addressbook")); gtk_entry_set_icon_from_pixbuf(entry,GTK_ENTRY_ICON_SECONDARY,unstarred); } } diff --git a/gtk/incall_view.c b/gtk/incall_view.c index 6a2dc0cda..0fc8a5545 100644 --- a/gtk/incall_view.c +++ b/gtk/incall_view.c @@ -319,6 +319,67 @@ static gboolean linphone_gtk_in_call_view_refresh(LinphoneCall *call){ return TRUE; } +typedef float (*get_volume_t)(void *data); + +typedef struct _volume_ctx{ + GtkWidget *widget; + get_volume_t get_volume; + void *data; + float last_value; +}volume_ctx_t; + +#define UNSIGNIFICANT_VOLUME (-26) +#define SMOOTH 0.15 + +static gboolean update_audio_meter(volume_ctx_t *ctx){ + float volume_db=ctx->get_volume(ctx->data); + float frac=(volume_db-UNSIGNIFICANT_VOLUME)/(float)(-UNSIGNIFICANT_VOLUME+3.0); + if (frac<0) frac=0; + if (frac>1.0) frac=1.0; + if (fraclast_value){ + frac=(frac*SMOOTH)+(ctx->last_value*(1-SMOOTH)); + } + ctx->last_value=frac; + //g_message("volume_db=%f, frac=%f",volume_db,frac); + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ctx->widget),frac); + return TRUE; +} + +static void on_audio_meter_destroy(guint task_id){ + g_source_remove(task_id); +} + +void linphone_gtk_init_audio_meter(GtkWidget *w, get_volume_t get_volume, void *data){ + guint task_id=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"task_id")); + if (task_id==0){ + volume_ctx_t *ctx=g_new(volume_ctx_t,1); + ctx->widget=w; + ctx->get_volume=get_volume; + ctx->data=data; + ctx->last_value=0; + g_object_set_data_full(G_OBJECT(w),"ctx",ctx,g_free); + task_id=g_timeout_add(50,(GSourceFunc)update_audio_meter,ctx); + g_object_set_data_full(G_OBJECT(w),"task_id",GINT_TO_POINTER(task_id),(GDestroyNotify)on_audio_meter_destroy); + } +} + +void linphone_gtk_in_call_view_enable_audio_view(LinphoneCall *call){ + GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer(call); + GtkWidget *audio_view=linphone_gtk_get_widget(callview,"incall_audioview"); + //GtkWidget *mic=linphone_gtk_get_widget(callview,"incall_mic_icon"); + GtkWidget *spk=linphone_gtk_get_widget(callview,"incall_spk_icon"); + GtkWidget *mic_level=linphone_gtk_get_widget(callview,"mic_audiolevel"); + GtkWidget *spk_level=linphone_gtk_get_widget(callview,"spk_audiolevel"); + GdkPixbuf *pbuf; + //gtk_image_set_from_pixbuf(GTK_IMAGE(mic),(pbuf=create_pixbuf("mic_active.png"))); + //g_object_unref(pbuf); + gtk_image_set_from_pixbuf(GTK_IMAGE(spk),(pbuf=create_pixbuf("speaker.png"))); + g_object_unref(pbuf); + linphone_gtk_init_audio_meter(mic_level,(get_volume_t)linphone_call_get_record_volume,call); + linphone_gtk_init_audio_meter(spk_level,(get_volume_t)linphone_call_get_play_volume,call); + gtk_widget_show_all(audio_view); +} + void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){ GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer(call); GtkWidget *status=linphone_gtk_get_widget(callview,"in_call_status"); @@ -340,6 +401,7 @@ void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){ taskid=g_timeout_add(250,(GSourceFunc)linphone_gtk_in_call_view_refresh,call); g_object_set_data(G_OBJECT(callview),"taskid",GINT_TO_POINTER(taskid)); } + linphone_gtk_in_call_view_enable_audio_view(call); } void linphone_gtk_in_call_view_set_paused(LinphoneCall *call){ @@ -383,6 +445,7 @@ void linphone_gtk_in_call_view_terminate(LinphoneCall *call, const char *error_m linphone_gtk_get_ui_config("stop_call_icon","stopcall-red.png"),FALSE); gtk_widget_hide(linphone_gtk_get_widget(callview,"answer_decline_panel")); + gtk_widget_hide(linphone_gtk_get_widget(callview,"incall_audioview")); linphone_gtk_enable_mute_button( GTK_BUTTON(linphone_gtk_get_widget(callview,"incall_mute")),FALSE); linphone_gtk_enable_hold_button(call,FALSE,TRUE); @@ -394,14 +457,14 @@ void linphone_gtk_draw_mute_button(GtkButton *button, gboolean active){ g_object_set_data(G_OBJECT(button),"active",GINT_TO_POINTER(active)); if (active){ GtkWidget *image=create_pixmap("mic_muted.png"); - gtk_button_set_label(GTK_BUTTON(button),_("Unmute")); + /*gtk_button_set_label(GTK_BUTTON(button),_("Unmute"));*/ if (image!=NULL) { gtk_button_set_image(GTK_BUTTON(button),image); gtk_widget_show(image); } }else{ GtkWidget *image=create_pixmap("mic_active.png"); - gtk_button_set_label(GTK_BUTTON(button),_("Mute")); + /*gtk_button_set_label(GTK_BUTTON(button),_("Mute"));*/ if (image!=NULL) { gtk_button_set_image(GTK_BUTTON(button),image); gtk_widget_show(image); @@ -417,7 +480,8 @@ void linphone_gtk_mute_clicked(GtkButton *button){ void linphone_gtk_enable_mute_button(GtkButton *button, gboolean sensitive) { - gtk_widget_set_sensitive(GTK_WIDGET(button),sensitive); + /*gtk_widget_set_sensitive(GTK_WIDGET(button),sensitive);*/ + gtk_widget_set_visible(GTK_WIDGET(button),sensitive); linphone_gtk_draw_mute_button(button,FALSE); } @@ -459,5 +523,6 @@ void linphone_gtk_enable_hold_button(LinphoneCall *call, gboolean sensitive, gbo g_return_if_fail(callview!=NULL); button=linphone_gtk_get_widget(callview,"hold_call"); gtk_widget_set_sensitive(GTK_WIDGET(button),sensitive); + gtk_widget_set_visible(GTK_WIDGET(button),sensitive); linphone_gtk_draw_hold_button(GTK_BUTTON(button),!holdon); } diff --git a/gtk/main.c b/gtk/main.c index be32459e5..e3a7b2742 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -321,6 +321,7 @@ GtkWidget *linphone_gtk_create_widget(const char *filename, const char *widget_n return NULL; } g_object_set_data(G_OBJECT(w),"builder",builder); + g_signal_connect_swapped(G_OBJECT(w),"destroy",(GCallback)g_object_unref,builder); gtk_builder_connect_signals(builder,w); return w; } @@ -1554,13 +1555,13 @@ static void linphone_gtk_check_soundcards(){ static void linphone_gtk_quit(void){ linphone_gtk_uninit_instance(); - gdk_threads_leave(); linphone_gtk_destroy_log_window(); linphone_core_destroy(the_core); linphone_gtk_log_uninit(); #ifdef HAVE_NOTIFY notify_uninit(); #endif + gdk_threads_leave(); } #ifdef HAVE_GTK_OSX diff --git a/gtk/main.ui b/gtk/main.ui index 6bd4cf9da..1a8fe13c6 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -80,11 +80,35 @@ True False - + True False - + + True + False + + + + + + True + True + 0 + + + + + True + False + label + center + + + True + True + 1 + @@ -94,15 +118,62 @@ - - True + False - label - center + + + True + True + False + half + + + + True + False + 0 + + + + + True + False + + + False + False + 1 + + + + + True + False + gtk-missing-image + 1 + + + True + False + 2 + + + + + True + False + + + False + False + end + 3 + + - True - True + False + False 1 @@ -147,32 +218,6 @@ 2 - - - True - False - - - Mute - True - True - True - False - - - - False - False - 0 - - - - - False - False - 3 - - True @@ -182,7 +227,6 @@ Pause - True True True False @@ -198,7 +242,7 @@ False False - 4 + 3 diff --git a/mediastreamer2 b/mediastreamer2 index 85886f326..aadeaaa8b 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 85886f326d404708368f72f69c8e0b67af417da1 +Subproject commit aadeaaa8b2de3b1e0cb9ffd5a0a22a85335e7951 diff --git a/pixmaps/Makefile.am b/pixmaps/Makefile.am index 8a9201275..60194fcd8 100644 --- a/pixmaps/Makefile.am +++ b/pixmaps/Makefile.am @@ -13,6 +13,7 @@ status-red.png \ status-offline.png \ contact-orange.png dialer-orange.png history-orange.png\ startcall-green.png stopcall-red.png addcall-green.png linphone.icns \ -contact_starred.png contact_unstarred.png +contact_starred.png contact_unstarred.png \ +speaker.png EXTRA_DIST=$(pixmap_DATA) diff --git a/pixmaps/mic_active.png b/pixmaps/mic_active.png index 662526993..349daad4b 100644 Binary files a/pixmaps/mic_active.png and b/pixmaps/mic_active.png differ diff --git a/pixmaps/mic_muted.png b/pixmaps/mic_muted.png index f813691fc..e540d0031 100644 Binary files a/pixmaps/mic_muted.png and b/pixmaps/mic_muted.png differ diff --git a/pixmaps/speaker.png b/pixmaps/speaker.png new file mode 100644 index 000000000..acc92dbcf Binary files /dev/null and b/pixmaps/speaker.png differ