forked from mirrors/linphone-iphone
- decline incoming calls when there is already an incoming call or an outgoing call not yet established.
This commit is contained in:
parent
a56aa6099b
commit
93cebd8f63
12 changed files with 167 additions and 27 deletions
|
|
@ -94,7 +94,7 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia
|
|||
linphone_call_start_media_streams(call,all_muted,send_ringbacktone);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
static bool_t is_duplicate_call(LinphoneCore *lc, const LinphoneAddress *from, const LinphoneAddress *to){
|
||||
MSList *elem;
|
||||
for(elem=lc->calls;elem!=NULL;elem=elem->next){
|
||||
|
|
@ -106,6 +106,22 @@ static bool_t is_duplicate_call(LinphoneCore *lc, const LinphoneAddress *from, c
|
|||
}
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool_t already_a_call_pending(LinphoneCore *lc){
|
||||
MSList *elem;
|
||||
for(elem=lc->calls;elem!=NULL;elem=elem->next){
|
||||
LinphoneCall *call=(LinphoneCall*)elem->data;
|
||||
if (call->state==LinphoneCallIncomingReceived
|
||||
|| call->state==LinphoneCallOutgoingInit
|
||||
|| call->state==LinphoneCallOutgoingProgress
|
||||
|| call->state==LinphoneCallOutgoingEarlyMedia
|
||||
|| call->state==LinphoneCallOutgoingRinging){
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void call_received(SalOp *h){
|
||||
LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(h));
|
||||
|
|
@ -145,8 +161,8 @@ static void call_received(SalOp *h){
|
|||
from_addr=linphone_address_new(from);
|
||||
to_addr=linphone_address_new(to);
|
||||
|
||||
if (is_duplicate_call(lc,from_addr,to_addr)){
|
||||
ms_warning("Receiving duplicated call, refusing this one.");
|
||||
if (already_a_call_pending(lc)){
|
||||
ms_warning("Receiving another call while one is ringing or initiated, refusing this one with busy message.");
|
||||
sal_call_decline(h,SalReasonBusy,NULL);
|
||||
sal_op_release(h);
|
||||
linphone_address_destroy(from_addr);
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
#include "private.h"
|
||||
|
||||
#include "mediastreamer2/msvolume.h"
|
||||
|
||||
static void conference_check_init(LinphoneConference *ctx){
|
||||
if (ctx->conf==NULL){
|
||||
|
|
@ -98,6 +99,18 @@ static void add_local_endpoint(LinphoneConference *conf,LinphoneCore *lc){
|
|||
ms_audio_conference_add_member(conf->conf,conf->local_endpoint);
|
||||
}
|
||||
|
||||
float linphone_core_get_conference_local_input_volume(LinphoneCore *lc){
|
||||
LinphoneConference *conf=&lc->conf_ctx;
|
||||
AudioStream *st=conf->local_participant;
|
||||
if (st && st->volsend){
|
||||
float vol=0;
|
||||
ms_filter_call_method(st->volsend,MS_VOLUME_GET,&vol);
|
||||
return vol;
|
||||
|
||||
}
|
||||
return LINPHONE_VOLUME_DB_LOWEST;
|
||||
}
|
||||
|
||||
int linphone_core_add_to_conference(LinphoneCore *lc, LinphoneCall *call){
|
||||
LinphoneCallParams params;
|
||||
LinphoneConference *conf=&lc->conf_ctx;
|
||||
|
|
|
|||
|
|
@ -479,8 +479,9 @@ static void linphone_call_destroy(LinphoneCall *obj)
|
|||
* valid. Once the application no more needs this pointer,
|
||||
* it must call linphone_call_unref().
|
||||
**/
|
||||
void linphone_call_ref(LinphoneCall *obj){
|
||||
LinphoneCall * linphone_call_ref(LinphoneCall *obj){
|
||||
obj->refcnt++;
|
||||
return obj;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1025,7 +1026,7 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, const char *cna
|
|||
call->audio_profile,
|
||||
stream->addr[0]!='\0' ? stream->addr : call->resultdesc->addr,
|
||||
stream->port,
|
||||
stream->port+1,
|
||||
linphone_core_rtcp_enabled(lc) ? (stream->port+1) : 0,
|
||||
used_pt,
|
||||
jitt_comp,
|
||||
playfile,
|
||||
|
|
@ -1110,7 +1111,7 @@ static void linphone_call_start_video_stream(LinphoneCall *call, const char *cna
|
|||
video_stream_set_device_rotation(call->videostream, lc->device_rotation);
|
||||
video_stream_start(call->videostream,
|
||||
call->video_profile, addr, vstream->port,
|
||||
vstream->port+1,
|
||||
linphone_core_rtcp_enabled(lc) ? (vstream->port+1) : 0,
|
||||
used_pt, lc->rtp_conf.audio_jitt_comp, cam);
|
||||
video_stream_set_rtcp_information(call->videostream, cname,LINPHONE_RTCP_SDES_TOOL);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -811,6 +811,10 @@ bool_t linphone_core_adaptive_rate_control_enabled(const LinphoneCore *lc){
|
|||
return lp_config_get_int(lc->config,"net","adaptive_rate_control",FALSE);
|
||||
}
|
||||
|
||||
bool_t linphone_core_rtcp_enabled(const LinphoneCore *lc){
|
||||
return lp_config_get_int(lc->config,"rtp","rtcp_enabled",TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets maximum available download bandwidth
|
||||
*
|
||||
|
|
|
|||
|
|
@ -242,7 +242,7 @@ const LinphoneAddress * linphone_core_get_current_call_remote_address(struct _Li
|
|||
const LinphoneAddress * linphone_call_get_remote_address(const LinphoneCall *call);
|
||||
char *linphone_call_get_remote_address_as_string(const LinphoneCall *call);
|
||||
LinphoneCallDir linphone_call_get_dir(const LinphoneCall *call);
|
||||
void linphone_call_ref(LinphoneCall *call);
|
||||
LinphoneCall * linphone_call_ref(LinphoneCall *call);
|
||||
void linphone_call_unref(LinphoneCall *call);
|
||||
LinphoneCallLog *linphone_call_get_call_log(const LinphoneCall *call);
|
||||
const char *linphone_call_get_refer_to(const LinphoneCall *call);
|
||||
|
|
@ -1025,6 +1025,7 @@ int linphone_core_remove_from_conference(LinphoneCore *lc, LinphoneCall *call);
|
|||
bool_t linphone_core_is_in_conference(const LinphoneCore *lc);
|
||||
int linphone_core_enter_conference(LinphoneCore *lc);
|
||||
int linphone_core_leave_conference(LinphoneCore *lc);
|
||||
float linphone_core_get_conference_local_input_volume(LinphoneCore *lc);
|
||||
|
||||
int linphone_core_terminate_conference(LinphoneCore *lc);
|
||||
int linphone_core_get_conference_size(LinphoneCore *lc);
|
||||
|
|
|
|||
|
|
@ -215,7 +215,7 @@ bool_t lsd_player_loop_enabled(const LsdPlayer *p){
|
|||
void lsd_player_set_gain(LsdPlayer *p, float gain){
|
||||
MSAudioMixerCtl gainctl;
|
||||
gainctl.pin=p->mixer_pin;
|
||||
gainctl.gain=gain;
|
||||
gainctl.param.gain=gain;
|
||||
ms_filter_call_method(p->lsd->mixer,MS_AUDIO_MIXER_SET_INPUT_GAIN,&gainctl);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -226,6 +226,7 @@ int linphone_core_start_invite(LinphoneCore *lc, LinphoneCall *call, LinphonePro
|
|||
void linphone_core_start_refered_call(LinphoneCore *lc, LinphoneCall *call);
|
||||
extern SalCallbacks linphone_sal_callbacks;
|
||||
void linphone_proxy_config_set_error(LinphoneProxyConfig *cfg, LinphoneReason error);
|
||||
bool_t linphone_core_rtcp_enabled(const LinphoneCore *lc);
|
||||
|
||||
struct _LinphoneProxyConfig
|
||||
{
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ linphone_SOURCES= \
|
|||
incall_view.c \
|
||||
loginframe.c \
|
||||
singleinstance.c \
|
||||
conference.c \
|
||||
linphone.h
|
||||
|
||||
linphone_LDADD=$(ORTP_LIBS) \
|
||||
|
|
|
|||
|
|
@ -23,9 +23,89 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "linphone.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#include "linphone.h"
|
||||
|
||||
static GtkWidget *create_conference_label(void){
|
||||
GtkWidget *box=gtk_hbox_new(FALSE,0);
|
||||
gtk_box_pack_start(GTK_BOX(box),gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU),FALSE,FALSE,0);
|
||||
gtk_box_pack_end(GTK_BOX(box),gtk_label_new(_("Conference")),TRUE,FALSE,0);
|
||||
gtk_widget_show_all(box);
|
||||
return box;
|
||||
}
|
||||
|
||||
static void init_local_participant(GtkWidget *participant){
|
||||
GtkWidget *sound_meter;
|
||||
gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(participant,"callee_name_label")),_("Me"));
|
||||
sound_meter=linphone_gtk_get_widget(participant,"sound_indicator");
|
||||
gtk_widget_hide(linphone_gtk_get_widget(participant,"hangup_button"));
|
||||
linphone_gtk_init_audio_meter(sound_meter, (get_volume_t) linphone_core_get_conference_local_input_volume, linphone_gtk_get_core());
|
||||
}
|
||||
|
||||
static GtkWidget *get_conference_tab(GtkWidget *mw){
|
||||
GtkWidget *box=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"conference_tab");
|
||||
if (box==NULL){
|
||||
GtkWidget *box=gtk_vbox_new(FALSE,0);
|
||||
GtkWidget *participant=linphone_gtk_create_widget("main","callee_frame");
|
||||
init_local_participant(participant);
|
||||
gtk_box_pack_start(GTK_BOX(box),participant,FALSE,FALSE,0);
|
||||
gtk_widget_show(box);
|
||||
g_object_set_data(G_OBJECT(mw),"conference_tab",box);
|
||||
gtk_notebook_append_page(GTK_NOTEBOOK(linphone_gtk_get_widget(mw,"viewswitch")),box,
|
||||
create_conference_label());
|
||||
}
|
||||
return box;
|
||||
}
|
||||
|
||||
void linphone_gtk_add_to_conference(LinphoneCall *call){
|
||||
GtkWidget *mw=linphone_gtk_get_main_window();
|
||||
GtkWidget *tab=get_conference_tab(mw);
|
||||
GtkWidget *participant=linphone_gtk_create_widget("main","callee_frame");
|
||||
const char *hangup_image=linphone_gtk_get_ui_config("stop_call_icon","stopcall-red.png");
|
||||
const LinphoneAddress *addr=linphone_call_get_remote_address(call);
|
||||
GtkWidget *sound_meter;
|
||||
GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch");
|
||||
gchar *markup;
|
||||
if (linphone_address_get_display_name(addr)!=NULL){
|
||||
markup=g_strdup_printf("<b>%s</b>",linphone_address_get_display_name(addr));
|
||||
}else{
|
||||
char *tmp=linphone_address_as_string_uri_only(addr);
|
||||
markup=g_strdup_printf("%s",tmp);
|
||||
ms_free(tmp);
|
||||
}
|
||||
gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(participant,"callee_name_label")),markup);
|
||||
g_free(markup);
|
||||
gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(participant,"hangup_button")),create_pixmap(hangup_image));
|
||||
sound_meter=linphone_gtk_get_widget(participant,"sound_indicator");
|
||||
linphone_gtk_init_audio_meter(sound_meter, (get_volume_t) linphone_call_get_play_volume, call);
|
||||
gtk_box_pack_end(GTK_BOX(tab),participant,FALSE,FALSE,0);
|
||||
g_object_set_data_full(G_OBJECT(participant),"call",linphone_call_ref(call),(GDestroyNotify)linphone_call_unref);
|
||||
gtk_widget_show(participant);
|
||||
gtk_notebook_set_current_page(GTK_NOTEBOOK(viewswitch),
|
||||
gtk_notebook_page_num(GTK_NOTEBOOK(viewswitch),tab));
|
||||
linphone_core_add_to_conference(linphone_gtk_get_core(),call);
|
||||
}
|
||||
|
||||
static GtkWidget *find_conferencee_from_call(LinphoneCall *call){
|
||||
GtkWidget *mw=linphone_gtk_get_main_window();
|
||||
GtkWidget *tab=get_conference_tab(mw);
|
||||
GList *elem;
|
||||
GtkWidget *ret=NULL;
|
||||
GList *l=gtk_container_get_children(GTK_CONTAINER(tab));
|
||||
for(elem=l;elem!=NULL;elem=elem->next){
|
||||
GtkWidget *frame=(GtkWidget*)elem->data;
|
||||
if (call==g_object_get_data(G_OBJECT(frame),"call")){
|
||||
ret=frame;
|
||||
break;
|
||||
}
|
||||
}
|
||||
g_list_free(l);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void linphone_gtk_remove_from_conference(LinphoneCall *call){
|
||||
GtkWidget *frame=find_conferencee_from_call(call);
|
||||
if (frame){
|
||||
gtk_widget_destroy(frame);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -150,7 +150,8 @@ void linphone_gtk_enable_transfer_button(LinphoneCore *lc, gboolean value){
|
|||
}
|
||||
|
||||
static void conference_button_clicked(GtkWidget *button, gpointer call_ref){
|
||||
|
||||
linphone_gtk_add_to_conference((LinphoneCall*)call_ref);
|
||||
gtk_widget_set_sensitive(button,FALSE);
|
||||
}
|
||||
|
||||
void linphone_gtk_enable_conference_button(LinphoneCore *lc, gboolean value){
|
||||
|
|
@ -319,7 +320,7 @@ 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;
|
||||
|
|
@ -363,7 +364,15 @@ void linphone_gtk_init_audio_meter(GtkWidget *w, get_volume_t get_volume, void *
|
|||
}
|
||||
}
|
||||
|
||||
void linphone_gtk_in_call_view_enable_audio_view(LinphoneCall *call){
|
||||
void linphone_gtk_uninit_audio_meter(GtkWidget *w){
|
||||
guint task_id=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"task_id"));
|
||||
if (task_id!=0){
|
||||
g_object_set_data(G_OBJECT(w),"ctx",NULL);
|
||||
g_object_set_data(G_OBJECT(w),"task_id",NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void linphone_gtk_in_call_view_enable_audio_view(LinphoneCall *call, gboolean val){
|
||||
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");
|
||||
|
|
@ -373,11 +382,16 @@ void linphone_gtk_in_call_view_enable_audio_view(LinphoneCall *call){
|
|||
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);
|
||||
if (val){
|
||||
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);
|
||||
}else{
|
||||
linphone_gtk_uninit_audio_meter(mic_level);
|
||||
linphone_gtk_uninit_audio_meter(spk_level);
|
||||
}
|
||||
}
|
||||
|
||||
void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){
|
||||
|
|
@ -386,22 +400,23 @@ void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){
|
|||
GtkWidget *callee=linphone_gtk_get_widget(callview,"in_call_uri");
|
||||
GtkWidget *duration=linphone_gtk_get_widget(callview,"in_call_duration");
|
||||
guint taskid=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(callview),"taskid"));
|
||||
gboolean in_conf=linphone_call_params_local_conference_mode(linphone_call_get_current_params(call));
|
||||
|
||||
display_peer_name_in_label(callee,linphone_call_get_remote_address (call));
|
||||
|
||||
gtk_widget_show(linphone_gtk_get_widget(callview,"mute_pause_buttons"));
|
||||
gtk_widget_set_visible(linphone_gtk_get_widget(callview,"mute_pause_buttons"),!in_conf);
|
||||
gtk_widget_hide(linphone_gtk_get_widget(callview,"answer_decline_panel"));
|
||||
gtk_label_set_markup(GTK_LABEL(status),_("<b>In call</b>"));
|
||||
gtk_label_set_markup(GTK_LABEL(status),in_conf ? _("In conference") : _("<b>In call</b>"));
|
||||
|
||||
gtk_label_set_text(GTK_LABEL(duration),_("00::00::00"));
|
||||
linphone_gtk_in_call_set_animation_image(callview,GTK_STOCK_MEDIA_PLAY,TRUE);
|
||||
linphone_gtk_enable_mute_button(
|
||||
GTK_BUTTON(linphone_gtk_get_widget(callview,"incall_mute")),TRUE);
|
||||
GTK_BUTTON(linphone_gtk_get_widget(callview,"incall_mute")),!in_conf);
|
||||
if (taskid==0){
|
||||
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);
|
||||
linphone_gtk_in_call_view_enable_audio_view(call, !in_conf);
|
||||
}
|
||||
|
||||
void linphone_gtk_in_call_view_set_paused(LinphoneCall *call){
|
||||
|
|
@ -433,6 +448,7 @@ void linphone_gtk_in_call_view_terminate(LinphoneCall *call, const char *error_m
|
|||
GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer(call);
|
||||
GtkWidget *status=linphone_gtk_get_widget(callview,"in_call_status");
|
||||
guint taskid=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(callview),"taskid"));
|
||||
gboolean in_conf=linphone_call_params_local_conference_mode(linphone_call_get_current_params(call));
|
||||
|
||||
if (error_msg==NULL)
|
||||
gtk_label_set_markup(GTK_LABEL(status),_("<b>Call ended.</b>"));
|
||||
|
|
@ -449,6 +465,9 @@ void linphone_gtk_in_call_view_terminate(LinphoneCall *call, const char *error_m
|
|||
linphone_gtk_enable_mute_button(
|
||||
GTK_BUTTON(linphone_gtk_get_widget(callview,"incall_mute")),FALSE);
|
||||
linphone_gtk_enable_hold_button(call,FALSE,TRUE);
|
||||
if (in_conf){
|
||||
linphone_gtk_remove_from_conference(call);
|
||||
}
|
||||
if (taskid!=0) g_source_remove(taskid);
|
||||
g_timeout_add_seconds(2,(GSourceFunc)in_call_view_terminated,call);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -108,6 +108,10 @@ void linphone_gtk_enable_mute_button(GtkButton *button, gboolean sensitive);
|
|||
void linphone_gtk_enable_hold_button(LinphoneCall *call, gboolean sensitive, gboolean holdon);
|
||||
void linphone_gtk_enable_transfer_button(LinphoneCore *lc, gboolean value);
|
||||
void linphone_gtk_enable_conference_button(LinphoneCore *lc, gboolean value);
|
||||
void linphone_gtk_add_to_conference(LinphoneCall *call);
|
||||
void linphone_gtk_remove_from_conference(LinphoneCall *call);
|
||||
typedef float (*get_volume_t)(void *data);
|
||||
void linphone_gtk_init_audio_meter(GtkWidget *w, get_volume_t get_volume, void *data);
|
||||
|
||||
void linphone_gtk_show_login_frame(LinphoneProxyConfig *cfg);
|
||||
void linphone_gtk_exit_login_frame(void);
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 28a643d20f6d6384d96590ab6e988928597878cf
|
||||
Subproject commit 85e43112e4054ba9112751655a52a42bb381584f
|
||||
Loading…
Add table
Reference in a new issue